{"version":3,"sources":["../src/core/registry/helpStore.ts","../src/client/config.ts","../src/i18n/config.ts","../src/login/config.ts","../src/roles/config.ts","../src/features/waitlist/config/waitlist.config.ts","../src/features/referral/config.ts","../src/features/rbac/data/RbacTypes.ts","../src/features/rbac/data/RbacService.ts"],"sourcesContent":["/**\n * Centralized help-content store accessible from client and server contexts.\n * Uses a globalThis Symbol key to persist across HMR/Turbopack reloads and to\n * bridge between the client-side `configureJsonApi` (in `client/config.ts`)\n * and the HelpProvider context. Holds the brand-only HelpContentConfig.\n *\n * NO external dependencies to avoid circular imports.\n *\n * Pattern mirrors `bootstrapStore.ts`.\n */\n\nconst HELP_CONTENT_KEY = Symbol.for(\"nextjs-jsonapi:helpContent\");\n\nconst globalStore = globalThis as unknown as {\n  [HELP_CONTENT_KEY]?: unknown | null;\n};\n\nif (globalStore[HELP_CONTENT_KEY] === undefined) {\n  globalStore[HELP_CONTENT_KEY] = null;\n}\n\nexport function _setStaticHelpContent(cfg: unknown | null): void {\n  globalStore[HELP_CONTENT_KEY] = cfg;\n}\n\nexport function _getStaticHelpContent<T = unknown>(): T | null {\n  return (globalStore[HELP_CONTENT_KEY] as T | null) ?? null;\n}\n","\"use client\";\n\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { ENV } from \"../core/env\";\nimport { setBootstrapper } from \"../core/registry/bootstrapStore\";\nimport { _setStaticHelpContent } from \"../core/registry/helpStore\";\nimport type { HelpContentConfig } from \"../features/help/interfaces/help-content-config.interface\";\n\n// Config storage for client-side contexts\nlet _clientConfig: {\n  apiUrl: string;\n  appUrl?: string;\n  trackablePages?: ModuleWithPermissions[];\n  bootstrapper?: () => void;\n  additionalHeaders?: Record<string, string>;\n  stripePublishableKey?: string;\n} | null = null;\n\n/**\n * Configure the JSON:API client. This is the main configuration function.\n * This is typically called during app initialization.\n * @param config.helpContent - Optional help-content config (brand only). Forwarded to the help feature's globalThis-backed store; not stored on the client config.\n */\nexport function configureJsonApi(config: {\n  apiUrl: string;\n  appUrl?: string;\n  trackablePages?: ModuleWithPermissions[];\n  bootstrapper?: () => void;\n  additionalHeaders?: Record<string, string>;\n  stripePublishableKey?: string;\n  helpContent?: HelpContentConfig;\n}): void {\n  const { helpContent, ...rest } = config;\n  _clientConfig = rest;\n  if (helpContent) {\n    _setStaticHelpContent(helpContent);\n  }\n  // Register and call bootstrapper to register all modules\n  if (config.bootstrapper) {\n    setBootstrapper(config.bootstrapper);\n    config.bootstrapper();\n  }\n}\n\n/**\n * Configure the client config. This is typically called during app initialization.\n * @deprecated Use configureJsonApi instead\n */\nexport function configureClientConfig(config: {\n  apiUrl: string;\n  appUrl?: string;\n  trackablePages?: ModuleWithPermissions[];\n}): void {\n  _clientConfig = config;\n}\n\n/**\n * Get the configured API URL.\n *\n * This may resolve to an internal/private host (e.g. a docker-network\n * hostname) when configured to do so for SSR fetches. Do NOT use this for\n * URLs that are rendered into HTML and followed by the browser — use\n * `getPublicApiUrl()` instead.\n */\nexport function getApiUrl(): string {\n  if (_clientConfig?.apiUrl) {\n    return _clientConfig.apiUrl;\n  }\n  return ENV.API_URL;\n}\n\n/**\n * Get the public-facing API URL.\n *\n * Always sourced from `NEXT_PUBLIC_API_URL` so it is identical on server\n * and client, and reachable from the user's browser. Use for any URL that\n * gets rendered into HTML the browser will navigate to (links, redirects,\n * OAuth hrefs).\n */\nexport function getPublicApiUrl(): string {\n  return ENV.API_URL;\n}\n\n/**\n * Get the configured app URL.\n */\nexport function getAppUrl(): string {\n  if (_clientConfig?.appUrl) {\n    return _clientConfig.appUrl;\n  }\n  if (ENV.APP_URL_ALTERNATE) {\n    return ENV.APP_URL_ALTERNATE;\n  }\n  if (typeof window !== \"undefined\") {\n    return window.location.origin;\n  }\n  return \"\";\n}\n\n/**\n * Get the configured trackable pages.\n */\nexport function getTrackablePages(): ModuleWithPermissions[] {\n  return _clientConfig?.trackablePages ?? [];\n}\n\n/**\n * Get the configured Stripe publishable key.\n */\nexport function getStripePublishableKey(): string | undefined {\n  return _clientConfig?.stripePublishableKey;\n}\n","import { ComponentType } from \"react\";\n\n// Types for injected hooks\nexport interface I18nRouter {\n  push: (href: string) => void;\n  replace: (href: string) => void;\n  back: () => void;\n  forward: () => void;\n  refresh: () => void;\n  prefetch: (href: string) => void;\n}\n\nexport type UseRouterHook = () => I18nRouter;\nexport type UseTranslationsHook = (namespace?: string) => (key: string, values?: Record<string, any>) => string;\nexport type UseLocaleHook = () => string;\n\nexport type UseDateFnsLocaleHook = () => any; // date-fns Locale type\nexport type LinkComponent = ComponentType<{ href: string; children: React.ReactNode; [key: string]: any }>;\n\nexport interface I18nConfig {\n  useRouter: UseRouterHook;\n  useTranslations: UseTranslationsHook;\n  useLocale?: UseLocaleHook;\n  useDateFnsLocale?: UseDateFnsLocaleHook;\n  Link: LinkComponent;\n  usePathname: () => string;\n}\n\n// Private storage\nlet _config: I18nConfig | null = null;\n\n// Configuration function (called by app at startup)\nexport function configureI18n(config: I18nConfig): void {\n  _config = config;\n}\n\n// Hooks for library components to use\nexport function useI18nRouter(): I18nRouter {\n  if (!_config?.useRouter) {\n    throw new Error(\"i18n not configured. Call configureI18n() at app startup.\");\n  }\n  return _config.useRouter();\n}\n\nexport function useI18nTranslations(namespace?: string): (key: string, values?: Record<string, any>) => string {\n  if (!_config?.useTranslations) {\n    // Fallback: return key as-is (safe for server/client)\n    return (key: string) => key;\n  }\n  return _config.useTranslations(namespace);\n}\n\nexport function getI18nLink(): LinkComponent {\n  if (!_config?.Link) {\n    throw new Error(\"i18n not configured. Call configureI18n() at app startup.\");\n  }\n  return _config.Link;\n}\n\nexport function useI18nLocale(): string {\n  if (_config?.useLocale) {\n    return _config.useLocale();\n  }\n  // Fallback to English (safe for server/client)\n  return \"en\";\n}\n\nexport function useI18nDateFnsLocale(): any {\n  if (_config?.useDateFnsLocale) {\n    return _config.useDateFnsLocale();\n  }\n  // Fallback to undefined (Calendar will use default)\n  return undefined;\n}\n","let _useDiscordAuth: boolean = false;\nlet _useGoogleAuth: boolean = false;\nlet _useInternalAuth: boolean = true;\nlet _allowRegistration: boolean = true;\nlet _registrationMode: \"open\" | \"closed\" | \"waitlist\" = \"open\";\n\nexport type RegistrationMode = \"open\" | \"closed\" | \"waitlist\";\n\nexport interface LoginConfig {\n  discordClientId?: string;\n  googleClientId?: string;\n  useInternalAuth?: boolean;\n  allowRegistration?: boolean;\n  registrationMode?: RegistrationMode;\n}\n\nexport function configureLogin(params: LoginConfig): void {\n  _useDiscordAuth = !!params.discordClientId;\n  _useGoogleAuth = !!params.googleClientId;\n  _useInternalAuth = params.useInternalAuth ?? true;\n  _allowRegistration = params.allowRegistration ?? true;\n  _registrationMode = params.registrationMode ?? \"open\";\n}\n\nexport function isDiscordAuthEnabled(): boolean {\n  return _useDiscordAuth;\n}\n\nexport function isGoogleAuthEnabled(): boolean {\n  return _useGoogleAuth;\n}\n\nexport function isInternalAuthEnabled(): boolean {\n  return _useInternalAuth;\n}\n\nexport function isRegistrationAllowed(): boolean {\n  return _allowRegistration;\n}\n\nexport function getRegistrationMode(): RegistrationMode {\n  return _registrationMode;\n}\n","/**\n * Role ID configuration interface\n * Apps provide their role IDs via configureRoles()\n */\nexport interface RoleIdConfig {\n  Administrator: string;\n  CompanyAdministrator: string;\n  [key: string]: string; // Allow additional roles\n}\n\n// Private storage for the injected role IDs\nlet _roleId: RoleIdConfig | null = null;\n\n/**\n * Configure role IDs for the library\n * Call this at app startup to provide role ID constants\n *\n * @example\n * ```typescript\n * import { configureRoles } from \"@carlonicora/nextjs-jsonapi\";\n * import { RoleId } from \"@phlow/shared\";\n *\n * configureRoles(RoleId);\n * ```\n */\nexport function configureRoles(roleId: RoleIdConfig): void {\n  _roleId = roleId;\n}\n\n/**\n * Get configured role IDs\n * @throws Error if roles not configured\n */\nexport function getRoleId(): RoleIdConfig {\n  if (!_roleId) {\n    throw new Error(\"Roles not configured. Call configureRoles() at app startup.\");\n  }\n  return _roleId;\n}\n\n/**\n * Check if roles have been configured\n */\nexport function isRolesConfigured(): boolean {\n  return _roleId !== null;\n}\n","export type QuestionnaireFieldType = \"text\" | \"textarea\" | \"select\" | \"checkbox\";\n\nexport interface QuestionnaireOption {\n  value: string;\n  label: string;\n  description?: string;\n}\n\nexport interface QuestionnaireField {\n  id: string;\n  type: QuestionnaireFieldType;\n  label: string;\n  description?: string;\n  placeholder?: string;\n  required?: boolean;\n  options?: QuestionnaireOption[];\n}\n\nexport interface WaitlistConfig {\n  questionnaire?: QuestionnaireField[];\n  heroTitle?: string;\n  heroSubtitle?: string;\n  heroDescription?: string;\n  benefits?: string[];\n}\n\nlet _waitlistConfig: WaitlistConfig = {};\n\nexport function configureWaitlist(config: WaitlistConfig): void {\n  _waitlistConfig = config;\n}\n\nexport function getWaitlistConfig(): WaitlistConfig {\n  return _waitlistConfig;\n}\n","/**\n * Configuration interface for frontend referral feature.\n */\nexport interface ReferralConfig {\n  /**\n   * Whether the referral feature is enabled.\n   * When false, components render nothing and hooks return null.\n   * @default false\n   */\n  enabled?: boolean;\n\n  /**\n   * Name of the cookie used to store referral codes.\n   * @default \"referral_code\"\n   */\n  cookieName?: string;\n\n  /**\n   * Number of days the referral cookie is valid.\n   * @default 30\n   */\n  cookieDays?: number;\n\n  /**\n   * Query parameter name for referral code in URL.\n   * @default \"ref\"\n   */\n  urlParamName?: string;\n\n  /**\n   * Base URL for referral links.\n   * @default window.location.origin (client-side only)\n   */\n  referralUrlBase?: string;\n\n  /**\n   * Path to append to base URL for referral links.\n   * @default \"/\"\n   */\n  referralPath?: string;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_REFERRAL_CONFIG: Required<ReferralConfig> = {\n  enabled: false,\n  cookieName: \"referral_code\",\n  cookieDays: 30,\n  urlParamName: \"ref\",\n  referralUrlBase: \"\",\n  referralPath: \"/\",\n};\n\n// Private storage for configuration\nlet _referralConfig: Required<ReferralConfig> = { ...DEFAULT_REFERRAL_CONFIG };\n\n/**\n * Configure referral feature settings.\n * Call this at app startup to enable and configure referral functionality.\n *\n * @example\n * ```typescript\n * import { configureReferral } from \"@carlonicora/nextjs-jsonapi\";\n *\n * configureReferral({\n *   enabled: process.env.NEXT_PUBLIC_REFERRAL_ENABLED === 'true',\n *   cookieDays: 30,\n * });\n * ```\n */\nexport function configureReferral(config: ReferralConfig): void {\n  _referralConfig = { ...DEFAULT_REFERRAL_CONFIG, ...config };\n}\n\n/**\n * Get the current referral configuration.\n * @internal\n */\nexport function getReferralConfig(): Required<ReferralConfig> {\n  return _referralConfig;\n}\n\n/**\n * Check if referral feature is enabled.\n */\nexport function isReferralEnabled(): boolean {\n  return _referralConfig.enabled;\n}\n","export const COMPANY_ADMINISTRATOR_ROLE_ID = \"2e1eee00-6cba-4506-9059-ccd24e4ea5b0\";\n\nexport type PermissionValue = boolean | string;\n\nexport type ActionType = \"read\" | \"create\" | \"update\" | \"delete\";\n\nexport const ACTION_TYPES: ActionType[] = [\"read\", \"create\", \"update\", \"delete\"];\n\n/** The permissions object shape used by both Module and PermissionMapping entities */\nexport type PermissionsMap = {\n  create?: PermissionValue;\n  read?: PermissionValue;\n  update?: PermissionValue;\n  delete?: PermissionValue;\n};\n\n/**\n * Declarative-RBAC matrix types.\n *\n * Mirror of the library types defined in\n * `packages/nestjs-neo4jsonapi/src/foundations/rbac/dsl/types.ts`.\n * Frontend does not import from backend, so the shape is redefined here.\n *\n * A `PermToken` represents a single permission entry:\n *  - `scope: true`  → unconditional (e.g. full read of the module)\n *  - `scope: false` → nothing (rarely used, mostly a placeholder)\n *  - `scope: \"path\"` → scoped by relationship path (e.g. \"orders.account\")\n */\nexport type PermToken = { action: string; scope: boolean | string };\n\n/**\n * A per-module block of the matrix. Always has a `default` row (permissions\n * granted to every role). Additional keys are role IDs → role-specific\n * permission tokens that are unioned with `default` to produce the effective\n * permissions for that role in that module.\n */\nexport type RbacModuleBlock = { default: PermToken[] } & Record<string, PermToken[]>;\n\n/**\n * The full RBAC matrix as served by the dev endpoint `GET /_dev/rbac/matrix`.\n * Keys are module IDs; values are module blocks.\n */\nexport type RbacMatrix = Record<string, RbacModuleBlock>;\n","import { AbstractService, EndpointCreator, HttpMethod, Modules } from \"../../../core\";\nimport type { RbacMatrixModel } from \"./RbacMatrixModel\";\nimport type { RbacMatrix } from \"./RbacTypes\";\n\n/**\n * RbacService — fetches RBAC configuration for the admin UI.\n *\n * Declarative-matrix methods (`fetchMatrix`, `saveMatrix`) talk to the\n * dev-only endpoints added in\n * `packages/nestjs-neo4jsonapi/.../rbac-dev.controller.ts`. The controller\n * speaks JSON:API (singleton resource with `type: \"rbac-matrix\"`, `id:\n * \"singleton\"`), so these methods go through the standard `callApi()`\n * pipeline like every other service in the codebase.\n *\n * The backend only registers these routes when `devMode` is enabled on\n * `RbacModule.register` (see `apps/api/src/features/features.modules.ts`).\n * In production the routes return 404; callers should guard with a dev-mode\n * check.\n */\nexport class RbacService extends AbstractService {\n  /**\n   * Fetch the current RBAC matrix plus each module's known BFS relationship\n   * paths (used by the permission picker as scope suggestions).\n   *\n   * Dev-only endpoint — see class header.\n   */\n  static async fetchMatrix(): Promise<{\n    matrix: RbacMatrix;\n    modulePaths: Record<string, readonly string[]>;\n  }> {\n    const endpoint = new EndpointCreator({ endpoint: Modules.RbacMatrix }).generate();\n\n    const model = await this.callApi<RbacMatrixModel>({\n      type: Modules.RbacMatrix,\n      method: HttpMethod.GET,\n      endpoint,\n    });\n\n    return {\n      matrix: model.matrix ?? {},\n      modulePaths: model.modulePaths ?? {},\n    };\n  }\n\n  /**\n   * Persist a matrix back to the declarative `permissions.ts` file.\n   *\n   * The backend serializes the matrix to formatted TypeScript using the\n   * provided `roleNames` / `moduleNames` lookup tables (so the emitted file\n   * references `RoleId.X` / `ModuleId.X` rather than raw UUIDs) and writes\n   * it to `outputPath` (absolute, or relative to the repo root).\n   *\n   * Dev-only endpoint — see class header.\n   */\n  static async saveMatrix(args: {\n    matrix: RbacMatrix;\n    roleNames: Record<string, string>;\n    moduleNames: Record<string, string>;\n    outputPath: string;\n  }): Promise<{ bytesWritten: number; path: string }> {\n    const endpoint = new EndpointCreator({ endpoint: Modules.RbacMatrix }).generate();\n\n    const model = await this.callApi<RbacMatrixModel>({\n      type: Modules.RbacMatrix,\n      method: HttpMethod.PUT,\n      endpoint,\n      input: args,\n    });\n\n    return {\n      bytesWritten: model.bytesWritten ?? 0,\n      path: model.path ?? \"\",\n    };\n  }\n}\n"],"mappings":"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","names":[]}