{"version":3,"sources":["../../src/server/cache.ts","../../src/server/ServerSession.ts","../../src/server/JsonApiServer.ts"],"sourcesContent":["// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { revalidateTag } from \"next/cache\";\n\nexport type CacheProfile = \"seconds\" | \"minutes\" | \"hours\" | \"days\" | \"weeks\" | \"max\" | \"default\";\n\n/**\n * Revalidate a cache tag to invalidate cached data.\n * Next.js 16+ requires a profile parameter.\n *\n * @param tag - The cache tag to invalidate\n * @param profile - The cache profile (defaults to \"max\" for immediate invalidation)\n */\nexport async function invalidateCacheTag(tag: string, profile: CacheProfile = \"max\"): Promise<void> {\n  revalidateTag(tag, profile);\n}\n\n/**\n * Revalidate multiple cache tags.\n *\n * @param tags - Array of cache tags to invalidate\n * @param profile - The cache profile (defaults to \"max\" for immediate invalidation)\n */\nexport async function invalidateCacheTags(tags: string[], profile: CacheProfile = \"max\"): Promise<void> {\n  for (const tag of tags) {\n    revalidateTag(tag, profile);\n  }\n}\n","import { cookies } from \"next/headers\";\nimport { redirect } from \"next/navigation\";\nimport { ungzip } from \"pako\";\nimport { Action, checkPermissionsFromServer, ModuleWithPermissions } from \"../permissions\";\n\nexport class ServerSession {\n  static async isLogged() {\n    const cookieStore = await cookies();\n    const token = cookieStore.get(\"token\");\n\n    if (!token || !token.value) return false;\n    return true;\n  }\n\n  static async companyId() {\n    const cookieStore = await cookies();\n    return cookieStore.get(\"companyId\")?.value ?? \"\";\n  }\n\n  static async userId() {\n    const cookieStore = await cookies();\n    return cookieStore.get(\"userId\")?.value ?? \"\";\n  }\n\n  static async checkPermission<M extends ModuleWithPermissions>(params: { module: M; action: Action; data?: any }) {\n    if (!(await this.hasPermissionToModule(params))) redirect(`/401`);\n  }\n\n  static async hasRole(roleId: string): Promise<boolean> {\n    const cookieStore = await cookies();\n    const roles = cookieStore.get(\"roles\")?.value;\n\n    if (!roles || !roles.includes(roleId)) return false;\n\n    return true;\n  }\n\n  static async hasFeature(featureId: string): Promise<boolean> {\n    const cookieStore = await cookies();\n    const features = cookieStore.get(\"features\")?.value;\n\n    if (!features || !features.includes(featureId)) return false;\n\n    return true;\n  }\n\n  static async hasPermissionToModule<M extends ModuleWithPermissions>(params: {\n    module: M;\n    action: Action;\n    data?: any;\n  }): Promise<boolean> {\n    const cookieStore = await cookies();\n\n    if (params.module.feature) {\n      const features = cookieStore.get(\"features\")?.value;\n\n      if (features && !features.includes(params.module.feature)) return false;\n    }\n\n    const rawModules = cookieStore.get(\"modules\")?.value;\n    if (!rawModules) return false;\n\n    const modules: {\n      id: string;\n      permissions: {\n        create: boolean | string;\n        read: boolean | string;\n        update: boolean | string;\n        delete: boolean | string;\n      };\n    }[] = JSON.parse(ungzip(Buffer.from(rawModules, \"base64\"), { toText: true }));\n\n    const selectedModule = modules.find((module) => module.id === params.module.moduleId);\n\n    return checkPermissionsFromServer({\n      module: params.module,\n      action: params.action,\n      data: params.data,\n      userId: await this.userId(),\n      selectedModule: selectedModule,\n    });\n\n    // if (!selectedModule) return false;\n\n    // if (!selectedModule.permissions[params.action]) return false;\n    // if (typeof selectedModule.permissions[params.action] === \"boolean\")\n    //   return selectedModule.permissions[params.action] as boolean;\n\n    // if (!params.data) return false;\n\n    // return params.data[selectedModule.permissions[params.action] as string] === this.userId;\n  }\n}\n","// Server-only utilities (NOT server actions - these cannot be called from client components)\n\nimport { ENV } from \"../core/env\";\nimport { JsonApiDataFactory } from \"../core/factories/JsonApiDataFactory\";\nimport { ApiRequestDataTypeInterface } from \"../core/interfaces/ApiRequestDataTypeInterface\";\nimport { ApiResponseInterface } from \"../core/interfaces/ApiResponseInterface\";\nimport { translateResponse } from \"../core/utils/translateResponse\";\nimport { ModuleWithPermissions } from \"../permissions/types\";\nimport { serverRequest } from \"./request\";\nimport { getServerToken } from \"./token\";\n\n// Config storage for server contexts\nlet _serverConfig: {\n  apiUrl: string;\n  appUrl?: string;\n  trackablePages?: ModuleWithPermissions[];\n  bootstrapper?: () => void;\n  additionalHeaders?: Record<string, string>;\n} | null = null;\n\n/**\n * Configure the JSON:API server client.\n * Call this in your Bootstrapper or server initialization.\n */\nexport function configureServerJsonApi(config: {\n  apiUrl: string;\n  appUrl?: string;\n  trackablePages?: ModuleWithPermissions[];\n  bootstrapper?: () => void;\n  additionalHeaders?: Record<string, string>;\n}): void {\n  _serverConfig = config;\n  if (config.bootstrapper) {\n    config.bootstrapper();\n  }\n}\n\nexport function getServerApiUrl(): string {\n  if (_serverConfig?.apiUrl) {\n    return _serverConfig.apiUrl;\n  }\n  const envUrl = ENV.API_URL;\n  if (!envUrl) {\n    throw new Error(\n      \"API URL not configured. Use configureServerJsonApi() or set NEXT_PUBLIC_API_URL environment variable.\",\n    );\n  }\n  return envUrl;\n}\n\nexport function getServerAppUrl(): string {\n  if (_serverConfig?.appUrl) {\n    return _serverConfig.appUrl;\n  }\n  const envUrl = ENV.APP_URL;\n  if (!envUrl) {\n    throw new Error(\n      \"App URL not configured. Use configureServerJsonApi({ appUrl }) or set NEXT_PUBLIC_ADDRESS environment variable.\",\n    );\n  }\n  return envUrl.trim().replace(/\\/+$/, \"\");\n}\n\nexport function getServerTrackablePages(): ModuleWithPermissions[] {\n  return _serverConfig?.trackablePages ?? [];\n}\n\nfunction runServerBootstrapper(): void {\n  if (_serverConfig?.bootstrapper) {\n    _serverConfig.bootstrapper();\n  }\n}\n\nfunction buildServerUrl(endpoint: string): string {\n  const apiUrl = getServerApiUrl();\n  return endpoint.startsWith(\"http\") ? endpoint : `${apiUrl}${endpoint}`;\n}\n\nexport async function ServerJsonApiGet(params: {\n  classKey: ApiRequestDataTypeInterface;\n  endpoint: string;\n  companyId?: string;\n  language: string;\n}): Promise<ApiResponseInterface> {\n  runServerBootstrapper();\n  const token = await getServerToken();\n\n  const apiResponse = await serverRequest({\n    method: \"GET\",\n    url: buildServerUrl(params.endpoint),\n    token,\n    cache: params.classKey.cache,\n    companyId: params.companyId,\n    language: params.language,\n    additionalHeaders: _serverConfig?.additionalHeaders,\n  });\n\n  return translateResponse({\n    classKey: params.classKey,\n    apiResponse,\n    companyId: params.companyId,\n    language: params.language,\n    paginationHandler: async (endpoint: string) =>\n      ServerJsonApiGet({\n        classKey: params.classKey,\n        endpoint,\n        companyId: params.companyId,\n        language: params.language,\n      }),\n  });\n}\n\nexport async function ServerJsonApiPost(params: {\n  classKey: ApiRequestDataTypeInterface;\n  endpoint: string;\n  companyId?: string;\n  body?: any;\n  overridesJsonApiCreation?: boolean;\n  files?: { [key: string]: File | Blob } | File | Blob;\n  language: string;\n  responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n  runServerBootstrapper();\n  const token = await getServerToken();\n\n  let body = params.body;\n  if (!body) {\n    body = {};\n  } else if (params.overridesJsonApiCreation !== true) {\n    body = JsonApiDataFactory.create(params.classKey, body);\n  }\n\n  const apiResponse = await serverRequest({\n    method: \"POST\",\n    url: buildServerUrl(params.endpoint),\n    token,\n    body,\n    files: params.files,\n    companyId: params.companyId,\n    language: params.language,\n    additionalHeaders: _serverConfig?.additionalHeaders,\n  });\n\n  return translateResponse({\n    classKey: params.responseType ?? params.classKey,\n    apiResponse,\n    companyId: params.companyId,\n    language: params.language,\n  });\n}\n\nexport async function ServerJsonApiPut(params: {\n  classKey: ApiRequestDataTypeInterface;\n  endpoint: string;\n  companyId?: string;\n  body?: any;\n  files?: { [key: string]: File | Blob } | File | Blob;\n  language: string;\n  responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n  runServerBootstrapper();\n  const token = await getServerToken();\n\n  let body = params.body;\n  if (!body) {\n    body = {};\n  } else {\n    body = JsonApiDataFactory.create(params.classKey, body);\n  }\n\n  const apiResponse = await serverRequest({\n    method: \"PUT\",\n    url: buildServerUrl(params.endpoint),\n    token,\n    body,\n    files: params.files,\n    companyId: params.companyId,\n    language: params.language,\n    additionalHeaders: _serverConfig?.additionalHeaders,\n  });\n\n  return translateResponse({\n    classKey: params.responseType ?? params.classKey,\n    apiResponse,\n    companyId: params.companyId,\n    language: params.language,\n  });\n}\n\nexport async function ServerJsonApiPatch(params: {\n  classKey: ApiRequestDataTypeInterface;\n  endpoint: string;\n  companyId?: string;\n  body?: any;\n  files?: { [key: string]: File | Blob } | File | Blob;\n  overridesJsonApiCreation?: boolean;\n  responseType?: ApiRequestDataTypeInterface;\n  language: string;\n}): Promise<ApiResponseInterface> {\n  runServerBootstrapper();\n  const token = await getServerToken();\n\n  let body = params.body;\n  if (!body) {\n    body = {};\n  } else if (params.overridesJsonApiCreation !== true) {\n    body = JsonApiDataFactory.create(params.classKey, body);\n  }\n\n  const apiResponse = await serverRequest({\n    method: \"PATCH\",\n    url: buildServerUrl(params.endpoint),\n    token,\n    body,\n    files: params.files,\n    companyId: params.companyId,\n    language: params.language,\n    additionalHeaders: _serverConfig?.additionalHeaders,\n  });\n\n  return translateResponse({\n    classKey: params.responseType ?? params.classKey,\n    apiResponse,\n    companyId: params.companyId,\n    language: params.language,\n  });\n}\n\nexport async function ServerJsonApiDelete(params: {\n  classKey: ApiRequestDataTypeInterface;\n  endpoint: string;\n  companyId?: string;\n  language: string;\n  responseType?: ApiRequestDataTypeInterface;\n}): Promise<ApiResponseInterface> {\n  runServerBootstrapper();\n  const token = await getServerToken();\n\n  const apiResponse = await serverRequest({\n    method: \"DELETE\",\n    url: buildServerUrl(params.endpoint),\n    token,\n    companyId: params.companyId,\n    language: params.language,\n    additionalHeaders: _serverConfig?.additionalHeaders,\n  });\n\n  return translateResponse({\n    classKey: params.responseType ?? params.classKey,\n    apiResponse,\n    companyId: params.companyId,\n    language: params.language,\n  });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,qBAAqB;AAW9B,eAAsB,mBAAmB,KAAa,UAAwB,OAAsB;AAClG,gBAAc,KAAK,OAAO;AAC5B;AAFsB;AAUtB,eAAsB,oBAAoB,MAAgB,UAAwB,OAAsB;AACtG,aAAW,OAAO,MAAM;AACtB,kBAAc,KAAK,OAAO;AAAA,EAC5B;AACF;AAJsB;;;ACvBtB,SAAS,eAAe;AACxB,SAAS,gBAAgB;AACzB,SAAS,cAAc;AAGhB,IAAM,gBAAN,MAAoB;AAAA,EAL3B,OAK2B;AAAA;AAAA;AAAA,EACzB,aAAa,WAAW;AACtB,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,QAAQ,YAAY,IAAI,OAAO;AAErC,QAAI,CAAC,SAAS,CAAC,MAAM,MAAO,QAAO;AACnC,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,YAAY;AACvB,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,WAAW,GAAG,SAAS;AAAA,EAChD;AAAA,EAEA,aAAa,SAAS;AACpB,UAAM,cAAc,MAAM,QAAQ;AAClC,WAAO,YAAY,IAAI,QAAQ,GAAG,SAAS;AAAA,EAC7C;AAAA,EAEA,aAAa,gBAAiD,QAAmD;AAC/G,QAAI,CAAE,MAAM,KAAK,sBAAsB,MAAM,EAAI,UAAS,MAAM;AAAA,EAClE;AAAA,EAEA,aAAa,QAAQ,QAAkC;AACrD,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,QAAQ,YAAY,IAAI,OAAO,GAAG;AAExC,QAAI,CAAC,SAAS,CAAC,MAAM,SAAS,MAAM,EAAG,QAAO;AAE9C,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,WAAW,WAAqC;AAC3D,UAAM,cAAc,MAAM,QAAQ;AAClC,UAAM,WAAW,YAAY,IAAI,UAAU,GAAG;AAE9C,QAAI,CAAC,YAAY,CAAC,SAAS,SAAS,SAAS,EAAG,QAAO;AAEvD,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,sBAAuD,QAI/C;AACnB,UAAM,cAAc,MAAM,QAAQ;AAElC,QAAI,OAAO,OAAO,SAAS;AACzB,YAAM,WAAW,YAAY,IAAI,UAAU,GAAG;AAE9C,UAAI,YAAY,CAAC,SAAS,SAAS,OAAO,OAAO,OAAO,EAAG,QAAO;AAAA,IACpE;AAEA,UAAM,aAAa,YAAY,IAAI,SAAS,GAAG;AAC/C,QAAI,CAAC,WAAY,QAAO;AAExB,UAAM,UAQA,KAAK,MAAM,OAAO,OAAO,KAAK,YAAY,QAAQ,GAAG,EAAE,QAAQ,KAAK,CAAC,CAAC;AAE5E,UAAM,iBAAiB,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,OAAO,OAAO,QAAQ;AAEpF,WAAO,2BAA2B;AAAA,MAChC,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,MACf,MAAM,OAAO;AAAA,MACb,QAAQ,MAAM,KAAK,OAAO;AAAA,MAC1B;AAAA,IACF,CAAC;AAAA,EAWH;AACF;;;AChFA,IAAI,gBAMO;AAMJ,SAAS,uBAAuB,QAM9B;AACP,kBAAgB;AAChB,MAAI,OAAO,cAAc;AACvB,WAAO,aAAa;AAAA,EACtB;AACF;AAXgB;AAaT,SAAS,kBAA0B;AACxC,MAAI,eAAe,QAAQ;AACzB,WAAO,cAAc;AAAA,EACvB;AACA,QAAM,SAAS,IAAI;AACnB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAXgB;AAaT,SAAS,kBAA0B;AACxC,MAAI,eAAe,QAAQ;AACzB,WAAO,cAAc;AAAA,EACvB;AACA,QAAM,SAAS,IAAI;AACnB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,OAAO,KAAK,EAAE,QAAQ,QAAQ,EAAE;AACzC;AAXgB;AAaT,SAAS,0BAAmD;AACjE,SAAO,eAAe,kBAAkB,CAAC;AAC3C;AAFgB;AAIhB,SAAS,wBAA8B;AACrC,MAAI,eAAe,cAAc;AAC/B,kBAAc,aAAa;AAAA,EAC7B;AACF;AAJS;AAMT,SAAS,eAAe,UAA0B;AAChD,QAAM,SAAS,gBAAgB;AAC/B,SAAO,SAAS,WAAW,MAAM,IAAI,WAAW,GAAG,MAAM,GAAG,QAAQ;AACtE;AAHS;AAKT,eAAsB,iBAAiB,QAKL;AAChC,wBAAsB;AACtB,QAAM,QAAQ,MAAM,eAAe;AAEnC,QAAM,cAAc,MAAM,cAAc;AAAA,IACtC,QAAQ;AAAA,IACR,KAAK,eAAe,OAAO,QAAQ;AAAA,IACnC;AAAA,IACA,OAAO,OAAO,SAAS;AAAA,IACvB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,mBAAmB,eAAe;AAAA,EACpC,CAAC;AAED,SAAO,kBAAkB;AAAA,IACvB,UAAU,OAAO;AAAA,IACjB;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,mBAAmB,8BAAO,aACxB,iBAAiB;AAAA,MACf,UAAU,OAAO;AAAA,MACjB;AAAA,MACA,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA,IACnB,CAAC,GANgB;AAAA,EAOrB,CAAC;AACH;AAhCsB;AAkCtB,eAAsB,kBAAkB,QASN;AAChC,wBAAsB;AACtB,QAAM,QAAQ,MAAM,eAAe;AAEnC,MAAI,OAAO,OAAO;AAClB,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV,WAAW,OAAO,6BAA6B,MAAM;AACnD,WAAO,mBAAmB,OAAO,OAAO,UAAU,IAAI;AAAA,EACxD;AAEA,QAAM,cAAc,MAAM,cAAc;AAAA,IACtC,QAAQ;AAAA,IACR,KAAK,eAAe,OAAO,QAAQ;AAAA,IACnC;AAAA,IACA;AAAA,IACA,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,mBAAmB,eAAe;AAAA,EACpC,CAAC;AAED,SAAO,kBAAkB;AAAA,IACvB,UAAU,OAAO,gBAAgB,OAAO;AAAA,IACxC;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,EACnB,CAAC;AACH;AArCsB;AAuCtB,eAAsB,iBAAiB,QAQL;AAChC,wBAAsB;AACtB,QAAM,QAAQ,MAAM,eAAe;AAEnC,MAAI,OAAO,OAAO;AAClB,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV,OAAO;AACL,WAAO,mBAAmB,OAAO,OAAO,UAAU,IAAI;AAAA,EACxD;AAEA,QAAM,cAAc,MAAM,cAAc;AAAA,IACtC,QAAQ;AAAA,IACR,KAAK,eAAe,OAAO,QAAQ;AAAA,IACnC;AAAA,IACA;AAAA,IACA,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,mBAAmB,eAAe;AAAA,EACpC,CAAC;AAED,SAAO,kBAAkB;AAAA,IACvB,UAAU,OAAO,gBAAgB,OAAO;AAAA,IACxC;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,EACnB,CAAC;AACH;AApCsB;AAsCtB,eAAsB,mBAAmB,QASP;AAChC,wBAAsB;AACtB,QAAM,QAAQ,MAAM,eAAe;AAEnC,MAAI,OAAO,OAAO;AAClB,MAAI,CAAC,MAAM;AACT,WAAO,CAAC;AAAA,EACV,WAAW,OAAO,6BAA6B,MAAM;AACnD,WAAO,mBAAmB,OAAO,OAAO,UAAU,IAAI;AAAA,EACxD;AAEA,QAAM,cAAc,MAAM,cAAc;AAAA,IACtC,QAAQ;AAAA,IACR,KAAK,eAAe,OAAO,QAAQ;AAAA,IACnC;AAAA,IACA;AAAA,IACA,OAAO,OAAO;AAAA,IACd,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,mBAAmB,eAAe;AAAA,EACpC,CAAC;AAED,SAAO,kBAAkB;AAAA,IACvB,UAAU,OAAO,gBAAgB,OAAO;AAAA,IACxC;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,EACnB,CAAC;AACH;AArCsB;AAuCtB,eAAsB,oBAAoB,QAMR;AAChC,wBAAsB;AACtB,QAAM,QAAQ,MAAM,eAAe;AAEnC,QAAM,cAAc,MAAM,cAAc;AAAA,IACtC,QAAQ;AAAA,IACR,KAAK,eAAe,OAAO,QAAQ;AAAA,IACnC;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,IACjB,mBAAmB,eAAe;AAAA,EACpC,CAAC;AAED,SAAO,kBAAkB;AAAA,IACvB,UAAU,OAAO,gBAAgB,OAAO;AAAA,IACxC;AAAA,IACA,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO;AAAA,EACnB,CAAC;AACH;AAzBsB;","names":[]}