canina/docs/audit/29-file-content-evidence.json
2026-08-06 20:54:44 +03:30

3544 lines
106 KiB
JSON

[
{
"path": ".dockerignore",
"sha256": "05e792a87ca350e1cc48174dda1ea1126ee13a5f8fe9d549d2b033382071e7a9",
"byteCount": 68,
"lineCount": 8,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": ".env.example",
"sha256": "997fd4cabe96dd692f1dde691a3ea157e86d97c577dfa7198690a91169278bad",
"byteCount": 454,
"lineCount": 10,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": ".gitignore",
"sha256": "eb13e93639d4c770f0a28ba670e9f4a922bc20ff1e734bdbe916740b0ae13d74",
"byteCount": 81,
"lineCount": 9,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "BACKEND_INTEGRATION.md",
"sha256": "158eb879fee9577edfe4b5c995515b3cdd355afbe8c2da032ef94806342acda7",
"byteCount": 15976,
"lineCount": 407,
"language": "Plain text",
"imports": [
"import axios from \"axios\";"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "DATABASE_SCHEMA.md",
"sha256": "3ed816173486b37243d1ed66b0d8aeaa4ecb1dd286fbc76d3afeace639eb5292",
"byteCount": 15731,
"lineCount": 319,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "Dockerfile",
"sha256": "b8a66b84a1ddbdfe82ee72e99cd157b8e017daf43b57f28c2942f2d2603896ff",
"byteCount": 334,
"lineCount": 15,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "README.md",
"sha256": "0da2647eea50431bef6d86fc1dd848d152b7be83efd118bd974f3b96e854479f",
"byteCount": 13231,
"lineCount": 134,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/.dockerignore",
"sha256": "af2b4e4ac92bbf09917306ecd5889749f9767550f60caa067a722a2f3832506c",
"byteCount": 59,
"lineCount": 7,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/.prettierrc",
"sha256": "30d23aaa5811720602dec802795cbc172c65bc56eb8c683fc5b12c10dcb05563",
"byteCount": 56,
"lineCount": 5,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/Dockerfile",
"sha256": "1dde4bb4a1064657518fb9d48bd7fbb4d97dd635e70198285b750b93648eaf01",
"byteCount": 903,
"lineCount": 41,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/README.md",
"sha256": "5e87b28bd419d1c83f2f44de2e150d0260da361547fc53d60016d0b64153101d",
"byteCount": 5126,
"lineCount": 99,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/eslint.config.mjs",
"sha256": "e94fea27c5d744a435cba627eb7097993c14a66a21f478c3729781bcdf4c8fba",
"byteCount": 934,
"lineCount": 36,
"language": "Plain text",
"imports": [
"import eslint from '@eslint/js';",
"import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';",
"import globals from 'globals';",
"import tseslint from 'typescript-eslint';"
],
"exports": [
"export default tseslint.config("
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/nest-cli.json",
"sha256": "84dc81177a0db2270bd71242b910f07982c56eec68285694c9cbffc3911912ba",
"byteCount": 179,
"lineCount": 9,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"$schema",
"collection",
"sourceRoot",
"compilerOptions",
"deleteOutDir"
],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/package.json",
"sha256": "8b14580b286dc09e3f0865efced27d9bcf7b5aa1eae6e7c57a27d0432c95270b",
"byteCount": 2619,
"lineCount": 91,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"name",
"version",
"description",
"author",
"private",
"license",
"scripts",
"build",
"format",
"start",
"startdev:",
"startdebug:",
"startprod:",
"lint",
"test"
],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/prisma/migrations/20260526145407_init/migration.sql",
"sha256": "aa8b760653d23b2c2ad189f2fd472965ff5832338dac68ed935da2712e58ff6e",
"byteCount": 9223,
"lineCount": 261,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/prisma/migrations/20260526160916_add_ui_texts_and_scientific_terms/migration.sql",
"sha256": "8a6e5902dfa6a8c87180c567b522a6e6fe23ba7aaed1247051eda19dbc5b2561",
"byteCount": 421,
"lineCount": 18,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/prisma/migrations/migration_lock.toml",
"sha256": "74a9137885ce73d3ff088d79d658f8066e05e680fb51c0800a290c91c0c01d48",
"byteCount": 128,
"lineCount": 3,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/prisma/schema.prisma",
"sha256": "a92c30cab66c0ca46b4b922d25e2c931f02a88a9e161699952d8ae245b1b4ae1",
"byteCount": 9322,
"lineCount": 243,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [
"@default",
"@map",
"@relation",
"@index",
"@id",
"@unique"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/prisma/seed.ts",
"sha256": "160ea6723dab5f10d735fe399c1a2aa1640f61513523f7067091b47fe045de75",
"byteCount": 10150,
"lineCount": 232,
"language": "TypeScript",
"imports": [
"import { PrismaClient } from '@prisma/client';",
"import * as fs from 'fs';",
"import * as path from 'path';",
"import * as ts from 'typescript';",
"import * as vm from 'vm';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/app.controller.spec.ts",
"sha256": "43750c632fc7f5997ddd690d4c3989443ab29ebd8866ee1fec6f3885834f8054",
"byteCount": 639,
"lineCount": 23,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { AppController } from './app.controller';",
"import { AppService } from './app.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"AppController",
"root",
"should return "
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/app.controller.ts",
"sha256": "3469c5aa62e1ba5b183d9bb9d40193e91aa761fc5734d332650b0bd49c346266",
"byteCount": 286,
"lineCount": 13,
"language": "TypeScript",
"imports": [
"import { Controller, Get } from '@nestjs/common';",
"import { AppService } from './app.service';"
],
"exports": [
"export class AppController {"
],
"topLevelSymbols": [
"AppController"
],
"frameworkDecorators": [
"@Controller",
"@Get"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/app.module.ts",
"sha256": "51c23094ed88846ef86f7d8e101e8863c4225de61aee9ac01372f36a16e5b876",
"byteCount": 1399,
"lineCount": 48,
"language": "TypeScript",
"imports": [
"import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common';",
"import { PrismaModule } from './prisma/prisma.module';",
"import { ProductsModule } from './products/products.module';",
"import { UsersModule } from './users/users.module';",
"import { RedisModule } from './redis/redis.module';",
"import { AuthModule } from './auth/auth.module';",
"import { PetsModule } from './pets/pets.module';",
"import { OrdersModule } from './orders/orders.module';",
"import { SettingsModule } from './settings/settings.module';",
"import { ThrottlerModule, ThrottlerGuard } from '@nestjs/throttler';",
"import { APP_GUARD } from '@nestjs/core';",
"import { MetricsController } from './common/metrics.controller';"
],
"exports": [
"export class AppModule implements NestModule {"
],
"topLevelSymbols": [
"AppModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/app.service.ts",
"sha256": "5d4242d50092a353e5ab1f06663a89dbc714c7d9d70072ea03c83c5b14750f05",
"byteCount": 150,
"lineCount": 9,
"language": "TypeScript",
"imports": [
"import { Injectable } from '@nestjs/common';"
],
"exports": [
"export class AppService {"
],
"topLevelSymbols": [
"AppService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/auth.controller.spec.ts",
"sha256": "92c30cdac367bb8c17424dbeab672ded0c6f301d31fc81b8589379bbfbc1f71a",
"byteCount": 1564,
"lineCount": 48,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { AuthController } from './auth.controller';",
"import { AuthService } from './auth.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"AuthController",
"should be defined",
"should call sendOtp on service",
"should call verifyOtp on service"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/auth.controller.ts",
"sha256": "dc26a41ecfcfdf7ee9fd6ed8dd03e30c2fe6024f92351295a56eb46e48e578fb",
"byteCount": 3050,
"lineCount": 95,
"language": "TypeScript",
"imports": [
"import { Controller, Post, Body, HttpCode, HttpStatus } from '@nestjs/common';",
"import { AuthService } from './auth.service';",
"import { SendOtpDto } from './dto/send-otp.dto';",
"import { VerifyOtpDto } from './dto/verify-otp.dto';",
"import { ApiTags, ApiOperation, ApiResponse, ApiOkResponse, ApiBadRequestResponse } from '@nestjs/swagger';"
],
"exports": [
"export class AuthController {"
],
"topLevelSymbols": [
"AuthController"
],
"frameworkDecorators": [
"@ApiTags",
"@Controller",
"@ApiResponse",
"@Post",
"@HttpCode",
"@ApiOperation",
"@ApiOkResponse",
"@ApiBadRequestResponse",
"@Body"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/auth.module.ts",
"sha256": "e1ccf4f9a5b1de18210d49bb65868c36dcfd6a216d4c2c9e4d9e2dd490d571a1",
"byteCount": 681,
"lineCount": 23,
"language": "TypeScript",
"imports": [
"import { Module } from '@nestjs/common';",
"import { JwtModule } from '@nestjs/jwt';",
"import { PassportModule } from '@nestjs/passport';",
"import { AuthService } from './auth.service';",
"import { AuthController } from './auth.controller';",
"import { JwtStrategy } from './jwt.strategy';",
"import { UsersModule } from '../users/users.module';"
],
"exports": [
"export class AuthModule {}"
],
"topLevelSymbols": [
"AuthModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/auth.service.spec.ts",
"sha256": "177b09fdfe0f747ee1ae7df98c86fa4b644aaf8c66b33f89e0328e534fa67e01",
"byteCount": 3765,
"lineCount": 110,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { AuthService } from './auth.service';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { JwtService } from '@nestjs/jwt';",
"import { RedisService } from '../redis/redis.service';",
"import { BadRequestException } from '@nestjs/common';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"AuthService",
"should be defined",
"sendOtp",
"should generate a 5 digit OTP and save it in Redis",
"verifyOtp",
"should throw BadRequestException if OTP is expired/not found",
"should throw BadRequestException if OTP is incorrect",
"should delete OTP, find or create user and sign JWT",
"should create new user if user does not exist"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/auth.service.ts",
"sha256": "b72a2c20bbc1c0f8b4e2223c0b161747cdd8b1214fb8fe1e8a3a78223fe42bab",
"byteCount": 2024,
"lineCount": 67,
"language": "TypeScript",
"imports": [
"import { Injectable, BadRequestException } from '@nestjs/common';",
"import { JwtService } from '@nestjs/jwt';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { RedisService } from '../redis/redis.service';",
"import { SendOtpDto } from './dto/send-otp.dto';",
"import { VerifyOtpDto } from './dto/verify-otp.dto';"
],
"exports": [
"export class AuthService {"
],
"topLevelSymbols": [
"AuthService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/dto/send-otp.dto.ts",
"sha256": "df509a1e3c9fc8846ce920192a43cf38ef76db7953d07d187d477bdfe44ec157",
"byteCount": 384,
"lineCount": 11,
"language": "TypeScript",
"imports": [
"import { ApiProperty } from '@nestjs/swagger';",
"import { IsNotEmpty, IsString, Matches } from 'class-validator';"
],
"exports": [
"export class SendOtpDto {"
],
"topLevelSymbols": [
"SendOtpDto"
],
"frameworkDecorators": [
"@ApiProperty",
"@IsNotEmpty",
"@IsString",
"@Matches"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/dto/verify-otp.dto.ts",
"sha256": "4115fc64ad8a38f2c5ae933af99a611aacd02b0a8b4e2859f5d2804126850acd",
"byteCount": 610,
"lineCount": 17,
"language": "TypeScript",
"imports": [
"import { ApiProperty } from '@nestjs/swagger';",
"import { IsNotEmpty, IsString, Length, Matches } from 'class-validator';"
],
"exports": [
"export class VerifyOtpDto {"
],
"topLevelSymbols": [
"VerifyOtpDto"
],
"frameworkDecorators": [
"@ApiProperty",
"@IsNotEmpty",
"@IsString",
"@Matches",
"@Length"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/jwt-auth.guard.ts",
"sha256": "e654c3250653cb79863bc5d2ed6d89e3ab5e04f3b4945bab04fafedbaea04509",
"byteCount": 413,
"lineCount": 13,
"language": "TypeScript",
"imports": [
"import { Injectable, UnauthorizedException } from '@nestjs/common';",
"import { AuthGuard } from '@nestjs/passport';"
],
"exports": [
"export class JwtAuthGuard extends AuthGuard('jwt') {"
],
"topLevelSymbols": [
"JwtAuthGuard"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/auth/jwt.strategy.ts",
"sha256": "2fd8214610a59f1bb4fdb517946e8c1d2402b6dc88a1bd62b22719734cf969ed",
"byteCount": 787,
"lineCount": 24,
"language": "TypeScript",
"imports": [
"import { ExtractJwt, Strategy } from 'passport-jwt';",
"import { PassportStrategy } from '@nestjs/passport';",
"import { Injectable, UnauthorizedException } from '@nestjs/common';",
"import { UsersService } from '../users/users.service';"
],
"exports": [
"export class JwtStrategy extends PassportStrategy(Strategy) {"
],
"topLevelSymbols": [
"JwtStrategy"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/common/filters/http-exception.filter.ts",
"sha256": "ef8428b791bc2f4b6c1e1110f910b1cfd5d1728db572423e7859cebc1dc5559d",
"byteCount": 833,
"lineCount": 20,
"language": "TypeScript",
"imports": [
"import { ExceptionFilter, Catch, ArgumentsHost, HttpException } from '@nestjs/common';",
"import { Response } from 'express';"
],
"exports": [
"export class HttpExceptionFilter implements ExceptionFilter {"
],
"topLevelSymbols": [
"HttpExceptionFilter"
],
"frameworkDecorators": [
"@Catch"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/common/metrics.controller.ts",
"sha256": "3ed5cb3298ef3030c097703556b68fe5c4ce0a406f7f6a43b51e883a6ae3a51c",
"byteCount": 2170,
"lineCount": 68,
"language": "TypeScript",
"imports": [
"import { Controller, Get, Res } from '@nestjs/common';",
"import { ApiExcludeController } from '@nestjs/swagger';",
"import { PrismaService } from '../../src/prisma/prisma.service';",
"import { Response } from 'express';"
],
"exports": [
"export class MetricsController {"
],
"topLevelSymbols": [
"MetricsController"
],
"frameworkDecorators": [
"@ApiExcludeController",
"@Controller",
"@Get",
"@Res"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/main.ts",
"sha256": "6f6f86698f76639b26ad9a38fd6f572fe884f270cd70adf69342e4f99906a43f",
"byteCount": 1222,
"lineCount": 42,
"language": "TypeScript",
"imports": [
"import { NestFactory } from '@nestjs/core';",
"import { AppModule } from './app.module';",
"import { ValidationPipe } from '@nestjs/common';",
"import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';",
"import { HttpExceptionFilter } from './common/filters/http-exception.filter';",
"import helmet from 'helmet';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/orders/dto/create-order.dto.ts",
"sha256": "82a19cb52f0a2346fc906f46e5b05564e54b287f1b0e12da0f3e12221671c5d7",
"byteCount": 822,
"lineCount": 29,
"language": "TypeScript",
"imports": [
"import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';",
"import { IsNotEmpty, IsArray, ValidateNested, IsNumber, IsOptional, IsString } from 'class-validator';",
"import { Type } from 'class-transformer';"
],
"exports": [
"export class CreateOrderDto {"
],
"topLevelSymbols": [
"CreateOrderDto"
],
"frameworkDecorators": [
"@ApiProperty",
"@IsNotEmpty",
"@IsString",
"@IsNumber",
"@ApiPropertyOptional",
"@IsOptional",
"@IsArray",
"@ValidateNested",
"@Type"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/orders/orders.controller.spec.ts",
"sha256": "a8990002863f2f6bfd99af91e9c6f4a67e9457fbef9caf2a07e7af2c9fce3b85",
"byteCount": 1961,
"lineCount": 57,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { OrdersController } from './orders.controller';",
"import { OrdersService } from './orders.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"OrdersController",
"should be defined",
"should create order",
"should list orders of user",
"should find one order"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/orders/orders.controller.ts",
"sha256": "dc251b61af61a8c6e80aba15dbbbe27d5940e78081c369536c721ddde569a09d",
"byteCount": 4001,
"lineCount": 122,
"language": "TypeScript",
"imports": [
"import { Controller, Get, Post, Body, Param, UseGuards, Req, HttpStatus } from '@nestjs/common';",
"import { OrdersService } from './orders.service';",
"import { CreateOrderDto } from './dto/create-order.dto';",
"import { JwtAuthGuard } from '../auth/jwt-auth.guard';",
"import { ApiTags, ApiBearerAuth, ApiOperation, ApiResponse, ApiOkResponse, ApiCreatedResponse, ApiBadRequestResponse, ApiNotFoundResponse } from '@nestjs/swagger';"
],
"exports": [
"export class OrdersController {"
],
"topLevelSymbols": [
"OrdersController"
],
"frameworkDecorators": [
"@ApiTags",
"@ApiBearerAuth",
"@UseGuards",
"@Controller",
"@ApiResponse",
"@Post",
"@ApiOperation",
"@ApiCreatedResponse",
"@ApiBadRequestResponse",
"@Req",
"@Body",
"@Get",
"@ApiOkResponse",
"@ApiNotFoundResponse",
"@Param"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/orders/orders.module.ts",
"sha256": "e36df12f5dc4cc036872c3b98f01c4060d24f526c399d6c7ec193ee7220bcba3",
"byteCount": 264,
"lineCount": 10,
"language": "TypeScript",
"imports": [
"import { Module } from '@nestjs/common';",
"import { OrdersService } from './orders.service';",
"import { OrdersController } from './orders.controller';"
],
"exports": [
"export class OrdersModule {}"
],
"topLevelSymbols": [
"OrdersModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/orders/orders.service.spec.ts",
"sha256": "8fb10c94adc23816814ce5d8b92c08c898a6c8eadea36ee932f91b7bd79bc9a4",
"byteCount": 3470,
"lineCount": 104,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { OrdersService } from './orders.service';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { NotFoundException, BadRequestException } from '@nestjs/common';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"OrdersService",
"should be defined",
"create",
"should throw NotFoundException if product does not exist",
"should throw BadRequestException if items are empty",
"should successfully create order and sum amounts",
"findAllByUser",
"should find all orders of a user",
"findOne",
"should throw NotFoundException if order does not exist",
"should return order if found"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/orders/orders.service.ts",
"sha256": "50a9f0ef8b15214a9e6422ba514b9c0e81ffcbdb170210870f75cc6013d83d66",
"byteCount": 1898,
"lineCount": 70,
"language": "TypeScript",
"imports": [
"import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { CreateOrderDto } from './dto/create-order.dto';"
],
"exports": [
"export class OrdersService {"
],
"topLevelSymbols": [
"OrdersService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/dto/create-pet.dto.ts",
"sha256": "842a23c6ce7d596dcac91a0a5849422b584a7eacdcc12d28faa70f600973c976",
"byteCount": 1277,
"lineCount": 45,
"language": "TypeScript",
"imports": [
"import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';",
"import { IsNotEmpty, IsString, IsOptional, IsNumber, IsBoolean, IsDateString } from 'class-validator';"
],
"exports": [
"export class CreatePetDto {"
],
"topLevelSymbols": [
"CreatePetDto"
],
"frameworkDecorators": [
"@ApiProperty",
"@IsNotEmpty",
"@IsString",
"@ApiPropertyOptional",
"@IsOptional",
"@IsNumber",
"@IsDateString",
"@IsBoolean"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/dto/update-pet.dto.ts",
"sha256": "9215ef8d3ba4d104629e18ece5e38d8b22d5b12fa8d7b032b885923a2d00c42f",
"byteCount": 160,
"lineCount": 5,
"language": "TypeScript",
"imports": [
"import { PartialType } from '@nestjs/swagger';",
"import { CreatePetDto } from './create-pet.dto';"
],
"exports": [
"export class UpdatePetDto extends PartialType(CreatePetDto) {}"
],
"topLevelSymbols": [
"UpdatePetDto"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/pets.controller.spec.ts",
"sha256": "3bc537a47fa3bb87b9cc1916a849013b9fd94905b89b4155fe95cad5ca09b7cb",
"byteCount": 2602,
"lineCount": 74,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { PetsController } from './pets.controller';",
"import { PetsService } from './pets.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"PetsController",
"should be defined",
"should create pet",
"should findAll pets",
"should findOne pet",
"should update pet",
"should remove pet"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/pets.controller.ts",
"sha256": "f89faaeb9ead2a83b5f802577cabb39a107833429852bfeead3d06e1cc2777a8",
"byteCount": 5567,
"lineCount": 180,
"language": "TypeScript",
"imports": [
"import { Controller, Get, Post, Body, Patch, Param, Delete, UseGuards, Req, HttpStatus } from '@nestjs/common';",
"import { PetsService } from './pets.service';",
"import { CreatePetDto } from './dto/create-pet.dto';",
"import { UpdatePetDto } from './dto/update-pet.dto';",
"import { JwtAuthGuard } from '../auth/jwt-auth.guard';",
"import { ApiTags, ApiBearerAuth, ApiOperation, ApiResponse, ApiOkResponse, ApiCreatedResponse, ApiBadRequestResponse, ApiNotFoundResponse } from '@nestjs/swagger';"
],
"exports": [
"export class PetsController {"
],
"topLevelSymbols": [
"PetsController"
],
"frameworkDecorators": [
"@ApiTags",
"@ApiBearerAuth",
"@UseGuards",
"@Controller",
"@ApiResponse",
"@Post",
"@ApiOperation",
"@ApiCreatedResponse",
"@ApiBadRequestResponse",
"@Req",
"@Body",
"@Get",
"@ApiOkResponse",
"@ApiNotFoundResponse",
"@Param"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/pets.module.ts",
"sha256": "32c9118ec8ee3f83bbaebea3247ad10e6c0b257dd0ec4ae80de8fbe135cdb9e5",
"byteCount": 250,
"lineCount": 10,
"language": "TypeScript",
"imports": [
"import { Module } from '@nestjs/common';",
"import { PetsService } from './pets.service';",
"import { PetsController } from './pets.controller';"
],
"exports": [
"export class PetsModule {}"
],
"topLevelSymbols": [
"PetsModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/pets.service.spec.ts",
"sha256": "9b927330f92c4791b59152601254d48f0aa0b9d92e4f1786775cf699fd278dfe",
"byteCount": 3042,
"lineCount": 94,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { PetsService } from './pets.service';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { NotFoundException } from '@nestjs/common';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"PetsService",
"should be defined",
"should create pet",
"should find all pets by user",
"findOne",
"should throw NotFoundException if pet not found",
"should return pet if found",
"should update pet",
"should remove pet"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/pets/pets.service.ts",
"sha256": "00af95136a389248d667c4e981dbb5a12c43425054007e7b3a7ebc074d2ea07f",
"byteCount": 1745,
"lineCount": 62,
"language": "TypeScript",
"imports": [
"import { Injectable, NotFoundException } from '@nestjs/common';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { CreatePetDto } from './dto/create-pet.dto';",
"import { UpdatePetDto } from './dto/update-pet.dto';"
],
"exports": [
"export class PetsService {"
],
"topLevelSymbols": [
"PetsService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/prisma/prisma.module.ts",
"sha256": "14d19dcd7848e4d134cd9eaa205818d5e0302123a5fc5ea2440d358a39f2fd25",
"byteCount": 219,
"lineCount": 10,
"language": "TypeScript",
"imports": [
"import { Global, Module } from '@nestjs/common';",
"import { PrismaService } from './prisma.service';"
],
"exports": [
"export class PrismaModule {}"
],
"topLevelSymbols": [
"PrismaModule"
],
"frameworkDecorators": [
"@Global",
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/prisma/prisma.service.ts",
"sha256": "58334e95599a754096851809483901a14e85a9e4d190655f74be6171ce1388b7",
"byteCount": 363,
"lineCount": 14,
"language": "TypeScript",
"imports": [
"import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';",
"import { PrismaClient } from '@prisma/client';"
],
"exports": [
"export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {"
],
"topLevelSymbols": [
"PrismaService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/products/dto/get-products.dto.ts",
"sha256": "39c1ee94138e1d5c0f6aaeadfbc653a2f200a64825a0d868db937f40abb14d89",
"byteCount": 574,
"lineCount": 20,
"language": "TypeScript",
"imports": [
"import { ApiPropertyOptional } from '@nestjs/swagger';",
"import { IsOptional, IsString, IsEnum } from 'class-validator';"
],
"exports": [
"export class GetProductsDto {"
],
"topLevelSymbols": [
"GetProductsDto"
],
"frameworkDecorators": [
"@ApiPropertyOptional",
"@IsOptional",
"@IsString",
"@IsEnum"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/products/products.controller.spec.ts",
"sha256": "058f4dd9afddc070fe22d5de3ab70e85fef19fdcb9c92d2cc73a90ddc3fa493b",
"byteCount": 1905,
"lineCount": 57,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { ProductsController } from './products.controller';",
"import { ProductsService } from './products.service';",
"import { NotFoundException } from '@nestjs/common';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"ProductsController",
"should be defined",
"should list products",
"findOne",
"should throw NotFoundException if product not found",
"should return product details if found"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/products/products.controller.ts",
"sha256": "2f5f9f97e5cfc3a4679b237e373781832ba243a9a622f64c9d5ddc6ad16b744e",
"byteCount": 4161,
"lineCount": 106,
"language": "TypeScript",
"imports": [
"import { Controller, Get, Query, Param, NotFoundException, HttpStatus } from '@nestjs/common';",
"import { ProductsService } from './products.service';",
"import { GetProductsDto } from './dto/get-products.dto';",
"import { ApiTags, ApiOperation, ApiResponse, ApiOkResponse, ApiNotFoundResponse } from '@nestjs/swagger';"
],
"exports": [
"export class ProductsController {"
],
"topLevelSymbols": [
"ProductsController"
],
"frameworkDecorators": [
"@ApiTags",
"@Controller",
"@ApiResponse",
"@Get",
"@ApiOperation",
"@ApiOkResponse",
"@Query",
"@ApiNotFoundResponse",
"@Param"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/products/products.module.ts",
"sha256": "01e51354c6922d10d7fab9dd79973901219d8a8ce06aaa5ff14cae5241796f41",
"byteCount": 278,
"lineCount": 10,
"language": "TypeScript",
"imports": [
"import { Module } from '@nestjs/common';",
"import { ProductsService } from './products.service';",
"import { ProductsController } from './products.controller';"
],
"exports": [
"export class ProductsModule {}"
],
"topLevelSymbols": [
"ProductsModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/products/products.service.spec.ts",
"sha256": "316e5eadae7ab595acf34b1621353a17fdc0ed0de0a5afb546e689604f949189",
"byteCount": 2190,
"lineCount": 76,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { ProductsService } from './products.service';",
"import { PrismaService } from '../prisma/prisma.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"ProductsService",
"should be defined",
"findAll",
"should query products with correct filters",
"findOne",
"should find product by id"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/products/products.service.ts",
"sha256": "3bb43f3f8b22a8bd18fcfccf18bef45591d9564ad8e01276638c892ceea1f023",
"byteCount": 1180,
"lineCount": 50,
"language": "TypeScript",
"imports": [
"import { Injectable } from '@nestjs/common';",
"import { PrismaService } from '../prisma/prisma.service';",
"import { GetProductsDto } from './dto/get-products.dto';"
],
"exports": [
"export class ProductsService {"
],
"topLevelSymbols": [
"ProductsService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/redis/redis.module.ts",
"sha256": "d2ad5482ca33266c13666b8d6249d90dcd62527e472cb12d98c4e3ebae8fcac8",
"byteCount": 214,
"lineCount": 10,
"language": "TypeScript",
"imports": [
"import { Module, Global } from '@nestjs/common';",
"import { RedisService } from './redis.service';"
],
"exports": [
"export class RedisModule {}"
],
"topLevelSymbols": [
"RedisModule"
],
"frameworkDecorators": [
"@Global",
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/redis/redis.service.spec.ts",
"sha256": "c6782b6b177f0d73aba0501d86634f12ba1f6ddcbdb995aaf0e70a34f194e583",
"byteCount": 1581,
"lineCount": 57,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { RedisService } from './redis.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"RedisService",
"should be defined",
"should call set with or without ttl",
"should call get",
"should call del"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/redis/redis.service.ts",
"sha256": "a8f03151af8caa570f0c6ad62e726aea257012e811bad80405826c3aafac8bb7",
"byteCount": 865,
"lineCount": 35,
"language": "TypeScript",
"imports": [
"import { Injectable, OnModuleDestroy, OnModuleInit } from '@nestjs/common';",
"import Redis from 'ioredis';"
],
"exports": [
"export class RedisService implements OnModuleInit, OnModuleDestroy {"
],
"topLevelSymbols": [
"RedisService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/settings/settings.controller.spec.ts",
"sha256": "2e7ddf051244941e3c6be2486a6279f8a1bfddf59876c4dea4d0a0915eb40fc4",
"byteCount": 2375,
"lineCount": 68,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { SettingsController } from './settings.controller';",
"import { SettingsService } from './settings.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"SettingsController",
"should be defined",
"should getUiTexts",
"should updateUiText",
"should getScientificTerms",
"should upsertScientificTerm",
"should deleteScientificTerm"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/settings/settings.controller.ts",
"sha256": "9847018dda0c55aabc2299bef26b069a1962853d6dc4133d425c32dd05dd386d",
"byteCount": 4207,
"lineCount": 111,
"language": "TypeScript",
"imports": [
"import { Controller, Get, Patch, Put, Delete, Body, Param, UseGuards, HttpStatus } from '@nestjs/common';",
"import { SettingsService } from './settings.service';",
"import { JwtAuthGuard } from '../auth/jwt-auth.guard';",
"import { ApiTags, ApiOperation, ApiBearerAuth, ApiResponse, ApiOkResponse, ApiUnauthorizedResponse } from '@nestjs/swagger';"
],
"exports": [
"export class SettingsController {"
],
"topLevelSymbols": [
"SettingsController"
],
"frameworkDecorators": [
"@ApiTags",
"@Controller",
"@Get",
"@ApiOperation",
"@ApiOkResponse",
"@UseGuards",
"@ApiBearerAuth",
"@Patch",
"@ApiUnauthorizedResponse",
"@Param",
"@Body",
"@Put",
"@Delete"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/settings/settings.module.ts",
"sha256": "07af4ac2bbc8ae7ffb62ae1850c91df2672afbe5e58da93388b9aba0d691eae9",
"byteCount": 394,
"lineCount": 13,
"language": "TypeScript",
"imports": [
"import { Module } from '@nestjs/common';",
"import { SettingsService } from './settings.service';",
"import { SettingsController } from './settings.controller';",
"import { PrismaModule } from '../prisma/prisma.module';"
],
"exports": [
"export class SettingsModule {}"
],
"topLevelSymbols": [
"SettingsModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/settings/settings.service.spec.ts",
"sha256": "b5b8cdc91d26a561b7493885265e1d75a8c86f79cb0778e0f602b9d83c54b55d",
"byteCount": 2814,
"lineCount": 87,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { SettingsService } from './settings.service';",
"import { PrismaService } from '../prisma/prisma.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"SettingsService",
"should be defined",
"should getUiTexts",
"should updateUiText",
"should getScientificTerms",
"should upsertScientificTerm",
"should deleteScientificTerm"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/settings/settings.service.ts",
"sha256": "278619cac4d4ae3b85a8b3075840a5265ac2732f40e4c3161e9dd16a818761b5",
"byteCount": 1115,
"lineCount": 47,
"language": "TypeScript",
"imports": [
"import { Injectable } from '@nestjs/common';",
"import { PrismaService } from '../prisma/prisma.service';"
],
"exports": [
"export class SettingsService {"
],
"topLevelSymbols": [
"SettingsService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/dto/address.dto.ts",
"sha256": "caaf6a055df72439795c85eba8e9a78fedf0e70b4f593d4b337aaae8440af6da",
"byteCount": 1142,
"lineCount": 45,
"language": "TypeScript",
"imports": [
"import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';",
"import { IsString, IsNotEmpty, IsOptional, IsBoolean } from 'class-validator';"
],
"exports": [
"export class AddressDto {"
],
"topLevelSymbols": [
"AddressDto"
],
"frameworkDecorators": [
"@ApiProperty",
"@IsString",
"@IsNotEmpty",
"@ApiPropertyOptional",
"@IsOptional",
"@IsBoolean"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/dto/update-profile.dto.ts",
"sha256": "2a4d80862f02cfa37a3f9f8d9d9d1191c2fe611e1eea6f21cc954a77f7add959",
"byteCount": 714,
"lineCount": 25,
"language": "TypeScript",
"imports": [
"import { ApiPropertyOptional } from '@nestjs/swagger';",
"import { IsOptional, IsString, IsEmail } from 'class-validator';"
],
"exports": [
"export class UpdateProfileDto {"
],
"topLevelSymbols": [
"UpdateProfileDto"
],
"frameworkDecorators": [
"@ApiPropertyOptional",
"@IsOptional",
"@IsString",
"@IsEmail"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/users.controller.spec.ts",
"sha256": "6b9bb6e51fc866950d36e0b8d5cdd8e2ed546b7cb20351be008161534aa83748",
"byteCount": 3385,
"lineCount": 99,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { UsersController } from './users.controller';",
"import { UsersService } from './users.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"UsersController",
"should be defined",
"should getProfile",
"should updateProfile",
"should addAddress",
"should updateAddress",
"should deleteAddress",
"should setDefaultAddress"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/users.controller.ts",
"sha256": "d5a6cc93a94e871c4485ef084e277bc3476740c65502a764f90a575fac3a30f6",
"byteCount": 5842,
"lineCount": 173,
"language": "TypeScript",
"imports": [
"import { Controller, Get, Patch, Post, Delete, Body, Param, UseGuards, Req, HttpStatus } from '@nestjs/common';",
"import { UsersService } from './users.service';",
"import { JwtAuthGuard } from '../auth/jwt-auth.guard';",
"import { ApiTags, ApiBearerAuth, ApiOperation, ApiResponse, ApiOkResponse, ApiCreatedResponse, ApiBadRequestResponse } from '@nestjs/swagger';",
"import { UpdateProfileDto } from './dto/update-profile.dto';",
"import { AddressDto } from './dto/address.dto';"
],
"exports": [
"export class UsersController {"
],
"topLevelSymbols": [
"UsersController"
],
"frameworkDecorators": [
"@ApiTags",
"@ApiBearerAuth",
"@Controller",
"@ApiResponse",
"@UseGuards",
"@Get",
"@ApiOperation",
"@ApiOkResponse",
"@Req",
"@Patch",
"@ApiBadRequestResponse",
"@Body",
"@Post",
"@ApiCreatedResponse",
"@Param"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/users.module.ts",
"sha256": "e99dd0daf64179291ef9b1ffc969574be6920ae813c789845209632463c92f42",
"byteCount": 285,
"lineCount": 11,
"language": "TypeScript",
"imports": [
"import { Module } from '@nestjs/common';",
"import { UsersService } from './users.service';",
"import { UsersController } from './users.controller';"
],
"exports": [
"export class UsersModule {}"
],
"topLevelSymbols": [
"UsersModule"
],
"frameworkDecorators": [
"@Module"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/users.service.spec.ts",
"sha256": "9bde2dd4fdfbb0f3864baee7782d1cf5429f2fa371e07a336d0cf5b6a225cbd7",
"byteCount": 3496,
"lineCount": 102,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { UsersService } from './users.service';",
"import { PrismaService } from '../prisma/prisma.service';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"UsersService",
"should be defined",
"should call prisma findUnique in findById",
"should call prisma update in update",
"should addAddress",
"should updateAddress",
"should deleteAddress",
"should setDefaultAddress"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/src/users/users.service.ts",
"sha256": "1532d70fd00b84469c6805836806f4fa1bce05a3399813f101c92371387cf967",
"byteCount": 2816,
"lineCount": 112,
"language": "TypeScript",
"imports": [
"import { Injectable } from '@nestjs/common';",
"import { PrismaService } from '../prisma/prisma.service';"
],
"exports": [
"export class UsersService {"
],
"topLevelSymbols": [
"UsersService"
],
"frameworkDecorators": [
"@Injectable"
],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/test/app.e2e-spec.ts",
"sha256": "191eb3068fadbce18c31e6ffa02ed6ed0cfd133573f23ef361d9ea413539f7e1",
"byteCount": 754,
"lineCount": 30,
"language": "TypeScript",
"imports": [
"import { Test, TestingModule } from '@nestjs/testing';",
"import { INestApplication } from '@nestjs/common';",
"import request from 'supertest';",
"import { App } from 'supertest/types';",
"import { AppModule } from './../src/app.module';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"AppController (e2e)",
"/ (GET)"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/test/jest-e2e.json",
"sha256": "e5964a7412493afd594979b94374dd8e5fd87e96d23a514163bdb72198fda0ba",
"byteCount": 192,
"lineCount": 10,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"moduleFileExtensions",
"rootDir",
"testEnvironment",
"testRegex",
"transform",
"^.+\\\\.(t|j)s$"
],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/tsconfig.build.json",
"sha256": "ef5be6c06c3ac6c3eca6c81885a12d03e33059086b4b275cf39f6e9359965378",
"byteCount": 101,
"lineCount": 5,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"extends",
"exclude"
],
"readSucceeded": true,
"readError": null
},
{
"path": "backend/tsconfig.json",
"sha256": "9f14a66ca5ada4e5f20a0c5d4a1a1d1d631aeb03a5940c737b73893c897a8dad",
"byteCount": 699,
"lineCount": 26,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"compilerOptions",
"module",
"moduleResolution",
"resolvePackageJsonExports",
"esModuleInterop",
"isolatedModules",
"declaration",
"removeComments",
"emitDecoratorMetadata",
"experimentalDecorators",
"allowSyntheticDefaultImports",
"target",
"sourceMap",
"outDir",
"baseUrl"
],
"readSucceeded": true,
"readError": null
},
{
"path": "docker-compose.yml",
"sha256": "a57d52b4063ef4eb731e163947db6d3c9fb4aa7133dcb40c1ee408e351ed715d",
"byteCount": 1569,
"lineCount": 76,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "index.html",
"sha256": "a8fb6003bf328dabab868cc7e6c1189869285287a5674d9892bddcdfd3491533",
"byteCount": 811,
"lineCount": 24,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "metadata.json",
"sha256": "6effb47a4ad0cd327ac85c3e3f1d667a1fca9cd36699ae907344fa6a030d8dd8",
"byteCount": 342,
"lineCount": 9,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"name",
"description",
"requestFramePermissions",
"majorCapabilities"
],
"readSucceeded": true,
"readError": null
},
{
"path": "nginx.conf",
"sha256": "e73f55d23eb74db056c552a3c9f51ceb6ed208bd5de3e8eb07a46f1e904b9f44",
"byteCount": 992,
"lineCount": 30,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "package.json",
"sha256": "6573f481f79a240af1721a5878969c40a7f60d0c5498cab30dd427af97759445",
"byteCount": 1266,
"lineCount": 48,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"name",
"private",
"version",
"type",
"scripts",
"dev",
"build",
"preview",
"clean",
"lint",
"test",
"testwatch:",
"dependencies",
"@google/genai",
"@tailwindcss/vite"
],
"readSucceeded": true,
"readError": null
},
{
"path": "prometheus.yml",
"sha256": "c31cef7110f4965128e7dc355a77cd7f537a6383c8f62936a2d8c6ea5582898d",
"byteCount": 172,
"lineCount": 9,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "public/locales/fa/common.json",
"sha256": "8378edcaef506b34c6e243b58456fccfa657d912860ac3efc7c91de2350585c1",
"byteCount": 1238,
"lineCount": 21,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"api",
"errors",
"400",
"401",
"403",
"404",
"500",
"insufficient_balance",
"breed_mismatch",
"invalid_coupon",
"order_failed",
"messages",
"loading",
"saving",
"success_update"
],
"readSucceeded": true,
"readError": null
},
{
"path": "public/manifest.json",
"sha256": "87501de359a0c2f7a3a591fb4a0815a42b48357e9948a87406636685108fae7e",
"byteCount": 614,
"lineCount": 22,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"name",
"short_name",
"description",
"start_url",
"display",
"background_color",
"theme_color",
"icons",
"src",
"sizes",
"type"
],
"readSucceeded": true,
"readError": null
},
{
"path": "public/sw.js",
"sha256": "7827cc0749b78767bbb7218fafbbc48ed42dae16dae671ebba10f45d30a12295",
"byteCount": 500,
"lineCount": 24,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/App.tsx",
"sha256": "5a6b490104821f21f6000c514001e5a455007ebcec4cf6ac545313f251fd0d9e",
"byteCount": 21677,
"lineCount": 431,
"language": "TypeScript",
"imports": [
"import { useState, useEffect, lazy, Suspense } from \"react\";",
"import Header from \"./components/Header\";",
"import Hero from \"./components/Hero\";",
"import Footer from \"./components/Footer\";",
"import { Toaster } from \"sonner\";",
"import { Product } from \"./data/products\";",
"import { useCartStore } from \"./store/cartStore\";",
"import { usePetStore } from \"./store/usePetStore\";",
"import { useUserStore } from \"./store/userStore\";",
"import { useSettingsStore } from \"./store/settingsStore\";",
"import { NetworkBanner } from './components/NetworkBanner';",
"import { ErrorBoundary } from './components/ErrorBoundary';",
"import { NotFoundPage } from './components/ErrorPages';",
"import { toast } from \"sonner\";",
"import labImage from \"./assets/images/regenerated_image_1779109861747.png\";"
],
"exports": [
"export default function App() {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/AddressModal.tsx",
"sha256": "314720a29226a08bafb8f746cff2fb6fbad6a85b3156f67e13ce77d9ce0231c4",
"byteCount": 14652,
"lineCount": 290,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { X, MapPin, User, Phone, Hash, Save, Check } from \"lucide-react\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import { Address } from \"../store/userStore\";",
"import { toast } from \"sonner\";"
],
"exports": [
"export default function AddressModal({ isOpen, onClose, onSave, editingAddress }: AddressModalProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/ArchivePage.tsx",
"sha256": "a2a6c4131513cd9918e8ff5ded7f2542e15f9a04e5504803e665e6c9b8364237",
"byteCount": 21575,
"lineCount": 424,
"language": "TypeScript",
"imports": [
"import React, { useState, useMemo, useEffect } from \"react\";",
"import { Product, PetType } from \"../data/products\";",
"import { usePetStore } from \"../store/usePetStore\";",
"import { productService } from \"../services/productService\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { ProductCardSkeleton } from \"./Skeleton\";",
"import { toast } from \"sonner\";",
"import { useCartStore } from \"../store/cartStore\";",
"import SafeImage from \"./SafeImage\";"
],
"exports": [
"export default function ArchivePage({"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/AuthModal.tsx",
"sha256": "986be0c94060790ea5694cd9f756db4c196bc4896146d21e35e080ca837b5b21",
"byteCount": 17655,
"lineCount": 387,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect, useRef } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { X, User, Building2, Heart, ShieldCheck, Phone, Key, LogIn, ArrowRight, RefreshCw } from \"lucide-react\";",
"import { useUserStore, UserRole } from \"../store/userStore\";",
"import { authService } from \"../services/authService\";",
"import { toast } from \"sonner\";",
"import { toPersian } from \"../lib/utils\";"
],
"exports": [
"export default function AuthModal({ isOpen, onClose }: AuthModalProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/B2BPortal.tsx",
"sha256": "5fde2d75add37f0a64dccc1bd916d78ecf3ec3bf8fdffda2176e9e677ce2ae0e",
"byteCount": 8985,
"lineCount": 192,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect } from \"react\";",
"import { Product } from \"../data/products\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { productService } from \"../services/productService\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import SafeImage from \"./SafeImage\";"
],
"exports": [
"export default function B2BPortal({ onClose }: { onClose: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/BlogPage.tsx",
"sha256": "7d0ae2089eca5af4c221d7d18be199a6037f628023c3964a6df957d7a541932e",
"byteCount": 20444,
"lineCount": 342,
"language": "TypeScript",
"imports": [
"import React from \"react\";",
"import { motion } from \"motion/react\";",
"import { ChevronRight, Calendar, User, ArrowLeft, Sparkles, BookOpen } from \"lucide-react\";",
"import { Product } from \"../data/products\";",
"import { productService } from \"../services/productService\";"
],
"exports": [
"export default function BlogPage({ onBack, onProductClick }: { onBack: () => void, onProductClick: (p: Product) => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/CartDrawer.tsx",
"sha256": "faecc40e3f7c0bdfe1bacf4ba67451b9515a3837471b6e4f6554c62a155d4cdf",
"byteCount": 17956,
"lineCount": 310,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect } from \"react\";",
"import { X, Trash2, Plus, Minus, ShoppingBag, ShieldCheck, ArrowLeft, Ticket, Sparkles, CheckCircle2 } from \"lucide-react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { Product } from \"../data/products\";",
"import { productService } from \"../services/productService\";",
"import SafeImage from \"./SafeImage\";",
"import { toast } from \"sonner\";"
],
"exports": [
"export default function CartDrawer({ isOpen, onClose, onCheckout, onShopNavigate }: {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/CheckoutPage.tsx",
"sha256": "1d9470816ddd4d8dd539beba7a7d31641154ba763ff51ebdfc2804d31c4c2a5e",
"byteCount": 21057,
"lineCount": 381,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect } from \"react\";",
"import { motion } from \"motion/react\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { usePetStore } from \"../store/usePetStore\";",
"import { useUserStore } from \"../store/userStore\";",
"import { Product } from \"../data/products\";",
"import { productService } from \"../services/productService\";",
"import { toast } from \"sonner\";"
],
"exports": [
"export default function CheckoutPage({ onBack, onComplete }: { onBack: () => void; onComplete: (orderId: string) => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/DeleteConfirmModal.tsx",
"sha256": "7907927ed2d4bb1aeac9e675d77feda6b6b060a031fc7c7df01d7bca35121298",
"byteCount": 2393,
"lineCount": 62,
"language": "TypeScript",
"imports": [
"import React from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { Trash2, AlertTriangle, X } from \"lucide-react\";"
],
"exports": [
"export default function DeleteConfirmModal({ isOpen, onClose, onConfirm, title, message }: DeleteConfirmModalProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/ErrorBoundary.tsx",
"sha256": "a90fda767490f58218d82a0e3a48ecece06235248b84406220acd86b7112c740",
"byteCount": 2687,
"lineCount": 72,
"language": "TypeScript",
"imports": [
"import * as React from 'react';",
"import { Component, ErrorInfo, ReactNode } from 'react';",
"import { AlertTriangle, RefreshCcw } from 'lucide-react';"
],
"exports": [
"export class ErrorBoundary extends React.Component<Props, State> {"
],
"topLevelSymbols": [
"ErrorBoundary"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/ErrorPages.tsx",
"sha256": "ec77817519a13c04467fe2d492dc6444d06ecf052afca9ff589fd5f3e9fe4c7f",
"byteCount": 2773,
"lineCount": 60,
"language": "TypeScript",
"imports": [
"import React from 'react';",
"import { FileQuestion, AlertCircle, Home, RefreshCw } from 'lucide-react';"
],
"exports": [
"export const NotFoundPage = ({ onGoHome }: { onGoHome: () => void }) => {",
"export const ServerErrorPage = ({ onRetry }: { onRetry: () => void }) => {"
],
"topLevelSymbols": [
"NotFoundPage",
"ServerErrorPage"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/FeaturedProducts.tsx",
"sha256": "df25d1ae82b4592cb1228f33ce9b152ab1f5c150c375eedc4816303c8f76eb13",
"byteCount": 7516,
"lineCount": 148,
"language": "TypeScript",
"imports": [
"import { useState, useEffect, useMemo } from \"react\";",
"import { Product } from \"../data/products\";",
"import { usePetStore } from \"../store/usePetStore\";",
"import { productService } from \"../services/productService\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { Eye, ShoppingCart, ShieldCheck, Heart, AlertCircle, Sparkles } from \"lucide-react\";",
"import SafeImage from \"./SafeImage\";",
"import { ProductCardSkeleton } from \"./Skeleton\";"
],
"exports": [
"export default function FeaturedProducts({ onProductClick, onShopNavigate }: { onProductClick: (p: Product) => void, onShopNavigate: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/Footer.tsx",
"sha256": "120f21891ec195b502927386334d72237c1f80c04d48df725686fb9637af1c22",
"byteCount": 8311,
"lineCount": 128,
"language": "TypeScript",
"imports": [
"import React from \"react\";",
"import { Phone, Mail, MapPin, Instagram, Youtube, Linkedin, ShieldCheck, Globe } from \"lucide-react\";"
],
"exports": [
"export default function Footer({ onNavigate, onShopNavigate, onB2BOpen }: {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/Header.tsx",
"sha256": "40ac019ff77dae5aee81e888af89081c4e8193a6ff3c4f1b1481012bdfad6b01",
"byteCount": 19286,
"lineCount": 364,
"language": "TypeScript",
"imports": [
"import React, { useState, useRef, useEffect } from \"react\";",
"import { Search, ChevronDown, Menu, X, Pill, ShieldCheck, HeartPulse, Sparkles, ShoppingBag, User, PlusCircle, Check, Building2, LogIn, Wallet, LogOut, MapPin, FileHeart, Dog, Cat } from \"lucide-react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { usePetStore } from \"../store/usePetStore\";",
"import { useUserStore } from \"../store/userStore\";",
"import { toast } from \"sonner\";",
"import HeaderButton from \"./HeaderButton\";",
"import AuthModal from \"./AuthModal\";",
"import { cn } from \"../lib/utils\";"
],
"exports": [
"export default function Header({"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/HeaderButton.tsx",
"sha256": "e7e508be65aeba6771625dd43de4e84fe889c17f97a1d30a918f852b460dd8b2",
"byteCount": 1839,
"lineCount": 53,
"language": "TypeScript",
"imports": [
"import React from \"react\";",
"import { motion } from \"motion/react\";",
"import { toPersian } from \"../lib/utils\";"
],
"exports": [
"export default function HeaderButton({"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/Hero.tsx",
"sha256": "df02dbfa6f1b9c74440bac4c7695b80e8f608d2d00025d540332d2a7149c3b28",
"byteCount": 9932,
"lineCount": 196,
"language": "TypeScript",
"imports": [
"import { motion, useMotionValue, useTransform, animate } from \"motion/react\";",
"import { ChevronLeft } from \"lucide-react\";",
"import { useEffect, useState } from \"react\";",
"import { toPersian } from \"../lib/utils\";",
"import { useSettingsStore } from \"../store/settingsStore\";"
],
"exports": [
"export default function Hero({ onProfileClick, onShopNavigate }: { onProfileClick?: () => void, onShopNavigate?: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"\\n"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/IngredientWiki.tsx",
"sha256": "9112b3ad9779255ea50df40787e5a62875cc711d838aa5fb5f4ff9cd383d12ea",
"byteCount": 10104,
"lineCount": 178,
"language": "TypeScript",
"imports": [
"import { useMemo, useState, useEffect } from \"react\";",
"import { INGREDIENTS_WIKI, Product } from \"../data/products\";",
"import { motion } from \"motion/react\";",
"import { FlaskConical, CheckCircle2, ChevronRight, ChevronLeft, Beaker } from \"lucide-react\";",
"import { useSettingsStore } from \"../store/settingsStore\";",
"import { productService } from \"../services/productService\";"
],
"exports": [
"export default function IngredientWiki({ onProductClick, onBack }: { onProductClick: (p: Product) => void, onBack?: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/LoginModal.tsx",
"sha256": "a717089effda26a988fd522a14479f171cccaeedd07100c51cb8faf1f6300bfe",
"byteCount": 12362,
"lineCount": 288,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect, useRef } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { X, ShieldCheck, Phone, Key, LogIn, ArrowRight, RefreshCw } from \"lucide-react\";",
"import { authService } from \"../services/authService\";",
"import { useUserStore } from \"../store/userStore\";",
"import { toast } from \"sonner\";",
"import { toPersian } from \"../lib/utils\";"
],
"exports": [
"export default function LoginModal({ isOpen, onClose, onLogin, petName, isAdvisorContext }: LoginModalProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/NetworkBanner.tsx",
"sha256": "13abbc38af102705fe15e533304223836ed6064a0c06e5dd217693cc36668874",
"byteCount": 2318,
"lineCount": 68,
"language": "TypeScript",
"imports": [
"import React, { useState, useEffect } from 'react';",
"import { useNetworkStatus } from '../hooks/useNetworkStatus';",
"import { WifiOff, Wifi, X } from 'lucide-react';",
"import { motion, AnimatePresence } from 'motion/react';"
],
"exports": [
"export const NetworkBanner = () => {"
],
"topLevelSymbols": [
"NetworkBanner"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/OrderDetailsModal.tsx",
"sha256": "f317fb006ed49f3f859d77f76991de618df7e277f98bd8d4a0622be3c26b4e80",
"byteCount": 13314,
"lineCount": 265,
"language": "TypeScript",
"imports": [
"import React from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import SafeImage from \"./SafeImage\";"
],
"exports": [
"export default function OrderDetailsModal({ isOpen, onClose, order }: OrderDetailsModalProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/OrderSuccess.tsx",
"sha256": "0e1ee36d1658063758499b117c6bb6f13632ac80d8dc838c9dc84bf6e23cc1b6",
"byteCount": 5706,
"lineCount": 110,
"language": "TypeScript",
"imports": [
"import React, { useEffect, useState } from \"react\";",
"import { motion } from \"motion/react\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { usePetStore } from \"../store/usePetStore\";"
],
"exports": [
"export default function OrderSuccess({ orderId, onNavigate }: { orderId: string; onNavigate: (v: any) => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/OrderTracking.tsx",
"sha256": "32f28b0f1fd4b46b8f871f2b9918db6e2b06f7468d83b990bd21ce5187bd4c43",
"byteCount": 9341,
"lineCount": 168,
"language": "TypeScript",
"imports": [
"import React, { useState } from \"react\";",
"import { motion } from \"motion/react\";",
"import { useCartStore } from \"../store/cartStore\";"
],
"exports": [
"export default function OrderTracking({ onNavigate, onBack }: { onNavigate: (v: any) => void, onBack?: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/PetProfile.tsx",
"sha256": "d805ad77e12771ce2846392b74a1585c451a2581720af938bcaa39fbb2dc7af8",
"byteCount": 66705,
"lineCount": 1193,
"language": "TypeScript",
"imports": [
"import React, { useState, useMemo, useEffect } from \"react\";",
"import { Product, PetType } from \"../data/products\";",
"import { productService } from \"../services/productService\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { PetProfileSkeleton } from \"./Skeleton\";",
"import { usePetStore, PetProfile as GlobalPetProfile, Reminder, HealthLog, PetConsumption } from \"../store/usePetStore\";",
"import { useCartStore } from \"../store/cartStore\";",
"import SafeImage from \"./SafeImage\";",
"import { toast } from \"sonner\";",
"import { toPersian, cn } from \"../lib/utils\";"
],
"exports": [
"export default function PetProfile({ onProductClick, onBack, initialView, advisorNeed }: {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"T",
"T"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/ProductPage.tsx",
"sha256": "e230769b1c71419eecae57d491256e3f2d2c360dbc2245d9a009139cc2649179",
"byteCount": 33351,
"lineCount": 599,
"language": "TypeScript",
"imports": [
"import { useState, useMemo } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import { Product } from \"../data/products\";",
"import { productService } from \"../services/productService\";",
"import { SCIENTIFIC_TERMS } from \"../data/scientificTerms\";",
"import { useSettingsStore } from \"../store/settingsStore\";",
"import { create } from \"zustand\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { usePetStore } from \"../store/usePetStore\";",
"import { toast } from \"sonner\";",
"import Tooltip from \"./Tooltip\";",
"import SafeImage from \"./SafeImage\";"
],
"exports": [
"export default function ProductPage({ product, onBack, onProductClick, onWikiNavigate, onShopNavigate }: {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/SafeImage.tsx",
"sha256": "81f495bd2b062276d4838601183715aabcefe1616300e01094f089dcc1442dbf",
"byteCount": 2623,
"lineCount": 74,
"language": "TypeScript",
"imports": [
"import React from \"react\";",
"import { ImageOff, Sparkles } from \"lucide-react\";",
"import { cn } from \"../lib/utils\";"
],
"exports": [
"export default function SafeImage({"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/SearchResultsPage.tsx",
"sha256": "9f33179f6ae1fbf9514a11c6177ce7c826d6f3adc5601e33d7ab9536ac0356c2",
"byteCount": 8048,
"lineCount": 138,
"language": "TypeScript",
"imports": [
"import React, { useMemo, useState, useEffect } from \"react\";",
"import { Search, ShoppingBag, ChevronLeft, ArrowRight, Activity, Sparkles, HeartPulse, Stethoscope, ShieldCheck, Heart, AlertCircle } from \"lucide-react\";",
"import { usePetStore } from \"../store/usePetStore\";",
"import { motion } from \"motion/react\";",
"import { Product } from \"../data/products\";",
"import { productService } from \"../services/productService\";"
],
"exports": [
"export default function SearchResultsPage({ query, onProductClick, onBack }: { query: string; onProductClick: (p: Product) => void; onBack: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/Skeleton.tsx",
"sha256": "fc19633c914e81c7eef71a70082bd495cf20acfe7700ea7099d6da0b012449f4",
"byteCount": 3155,
"lineCount": 86,
"language": "TypeScript",
"imports": [
"import React from 'react';"
],
"exports": [
"export const Skeleton = ({ className }: SkeletonProps) => {",
"export const ProductCardSkeleton = () => {",
"export const PetProfileSkeleton = () => {",
"export const OrderRowSkeleton = () => {"
],
"topLevelSymbols": [
"Skeleton",
"ProductCardSkeleton",
"PetProfileSkeleton",
"OrderRowSkeleton"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/SmartAdvisor.tsx",
"sha256": "13e9aac5ae214bf4e2849d1db032d978287e766fd01335d1795d31828e9caaa0",
"byteCount": 15860,
"lineCount": 297,
"language": "TypeScript",
"imports": [
"import React, { useState } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { useSettingsStore } from \"../store/settingsStore\";",
"import { toPersian, cn } from \"../lib/utils\";"
],
"exports": [
"export default function SmartAdvisor({ onComplete }: SmartAdvisorProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/Tooltip.tsx",
"sha256": "562319624a2a6d8877e8bd68c31304b01049882a2a4e85c67216b5a74f9aef10",
"byteCount": 2561,
"lineCount": 62,
"language": "TypeScript",
"imports": [
"import React, { useState } from 'react';",
"import { motion, AnimatePresence } from 'motion/react';",
"import { Info, ExternalLink } from 'lucide-react';",
"import { SCIENTIFIC_TERMS } from '../data/scientificTerms';",
"import { useSettingsStore } from '../store/settingsStore';"
],
"exports": [
"export default function Tooltip({ termKey, children, onWikiNavigate }: TooltipProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/TopUpModal.tsx",
"sha256": "09c967e8d366ae9969f0c2e2beffb893072aa8818c3b3586ad1f9ba646f8fef4",
"byteCount": 7049,
"lineCount": 154,
"language": "TypeScript",
"imports": [
"import React, { useState } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { X, CreditCard, Sparkles, CheckCircle2, TrendingUp, DollarSign } from \"lucide-react\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import { toast } from \"sonner\";"
],
"exports": [
"export default function TopUpModal({ isOpen, onClose, onConfirm }: TopUpModalProps) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/UserDashboard.tsx",
"sha256": "9478a4057c97f362b186d81bfcdda2e8815c3118cfa07f49c38b79474a41e04b",
"byteCount": 37598,
"lineCount": 646,
"language": "TypeScript",
"imports": [
"import React, { useState } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { User, ShoppingBag, Wallet, MapPin, LogOut, ChevronRight, Package, Calendar, UserCircle, ShoppingCart, Trash2, Edit2, Phone, Hash, CheckCircle2, ArrowUpCircle, ArrowDownCircle, Info, Clock, CheckCircle, Heart, Sparkles } from \"lucide-react\";",
"import { OrderRowSkeleton } from \"./Skeleton\";",
"import { useUserStore, Address } from \"../store/userStore\";",
"import { useCartStore } from \"../store/cartStore\";",
"import { toPersian, cn } from \"../lib/utils\";",
"import { toast } from \"sonner\";",
"import OrderDetailsModal from \"./OrderDetailsModal\";",
"import AddressModal from \"./AddressModal\";",
"import DeleteConfirmModal from \"./DeleteConfirmModal\";",
"import TopUpModal from \"./TopUpModal\";"
],
"exports": [
"export default function UserDashboard({ onBack, onNavigate }: { onBack: () => void, onNavigate: (v: any) => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/VetGallery.tsx",
"sha256": "2dfbead4e5eb98a56bdff1c3a66c513254c00a3332a9271a34df481f4f47d744",
"byteCount": 7427,
"lineCount": 148,
"language": "TypeScript",
"imports": [
"import React, { useState } from \"react\";",
"import { Play, PlayCircle, Star, ShieldCheck, X } from \"lucide-react\";",
"import { motion, AnimatePresence } from \"motion/react\";"
],
"exports": [
"export default function VetGallery({ onNavigate }: { onNavigate?: (v: any) => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/VideosPage.tsx",
"sha256": "9912b04a03bb2891557a19c39b04a88b254af6375a072fbcab479524c056a49b",
"byteCount": 9112,
"lineCount": 186,
"language": "TypeScript",
"imports": [
"import React, { useState } from \"react\";",
"import { motion, AnimatePresence } from \"motion/react\";",
"import { ChevronRight, PlayCircle, Star, ShieldCheck, X, Search, Clock, User } from \"lucide-react\";"
],
"exports": [
"export default function VideosPage({ onBack }: { onBack: () => void }) {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/__tests__/CartDrawer.test.tsx",
"sha256": "fc4f95ab29d719bb152687cebf8feec8273e05caca29726ca8cdfcbf9ef91912",
"byteCount": 3131,
"lineCount": 102,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, vi, beforeEach } from 'vitest';",
"import { render, screen, fireEvent } from '@testing-library/react';",
"import React from 'react';",
"import CartDrawer from '../CartDrawer';",
"import { useCartStore } from '../../store/cartStore';",
"import { productService } from '../../services/productService';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"CartDrawer",
"renders empty cart state when no items in cart",
"renders cart items and total when items are present",
"triggers updateQuantity when plus/minus buttons are clicked"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/__tests__/FeaturedProducts.test.tsx",
"sha256": "e411316d9a5b8b0b6c7720ebd04c85075b01c38323d217badf165840f1bb100d",
"byteCount": 2945,
"lineCount": 82,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, vi, beforeEach } from 'vitest';",
"import { render, screen, fireEvent, waitFor } from '@testing-library/react';",
"import React from 'react';",
"import FeaturedProducts from '../FeaturedProducts';",
"import { productService } from '../../services/productService';",
"import { usePetStore } from '../../store/usePetStore';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"FeaturedProducts",
"renders loading skeletons initially",
"renders products once loaded",
"calls onProductClick when product card is clicked",
"calls onShopNavigate when navigation link is clicked"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/__tests__/Footer.test.tsx",
"sha256": "57dd04273765b65b4e906552e74e6d5c4d420e9d06498d8093c4abf0ed2b3c3f",
"byteCount": 1679,
"lineCount": 44,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, vi } from 'vitest';",
"import { render, screen, fireEvent } from '@testing-library/react';",
"import React from 'react';",
"import Footer from '../Footer';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"Footer",
"renders footer brand text and standard layout elements",
"triggers onNavigate and onShopNavigate when quick links are clicked"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/__tests__/Header.test.tsx",
"sha256": "5c6f361116a37b8556bb01829708e0c1490fe59e12c30b5bdda9d20cabefdde8",
"byteCount": 3156,
"lineCount": 111,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, vi, beforeEach } from 'vitest';",
"import { render, screen, fireEvent } from '@testing-library/react';",
"import React from 'react';",
"import Header from '../Header';",
"import { useCartStore } from '../../store/cartStore';",
"import { usePetStore } from '../../store/usePetStore';",
"import { useUserStore } from '../../store/userStore';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"Header",
"renders brand name and login button when guest",
"renders user first name and pet selection when logged in",
"calls onCartOpen when click on cart button"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/__tests__/Hero.test.tsx",
"sha256": "7609965c99249fb454871c286a10237c4eb9996264a68c6d25b8057477320cf5",
"byteCount": 1679,
"lineCount": 44,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, vi, beforeEach } from 'vitest';",
"import { render, screen, fireEvent } from '@testing-library/react';",
"import React from 'react';",
"import Hero from '../Hero';",
"import { useSettingsStore } from '../../store/settingsStore';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"Hero",
"renders title and description from settingsStore",
"calls onShopNavigate when "
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/components/__tests__/Tooltip.test.tsx",
"sha256": "6a25742e1d4737fdb8d7a75a1e927fb3308203bdac4dfbe540f6f988def7ee9b",
"byteCount": 1536,
"lineCount": 51,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, vi } from 'vitest';",
"import { render, screen, fireEvent } from '@testing-library/react';",
"import React from 'react';",
"import Tooltip from '../Tooltip';",
"import { useSettingsStore } from '../../store/settingsStore';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"Tooltip",
"should render children correctly",
"should display tooltip definition on hover"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/data/products.ts",
"sha256": "06775f65c485d1dbd56b0f0406fc910c94f1747c1c56422aac077caeb5c02b56",
"byteCount": 31112,
"lineCount": 514,
"language": "TypeScript",
"imports": [],
"exports": [
"export interface Specialist {",
"export type PetType = \"سگ\" | \"گربه\" | \"هر دو\";",
"export interface IngredientInfo {",
"export interface DosageResult {",
"export interface FAQ {",
"export interface Product {",
"export const INGREDIENTS_WIKI: IngredientInfo[] = [",
"export const PRODUCTS: Product[] = ["
],
"topLevelSymbols": [
"Specialist",
"PetType",
"IngredientInfo",
"DosageResult",
"FAQ",
"Product",
"INGREDIENTS_WIKI",
"PRODUCTS"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/data/scientificTerms.ts",
"sha256": "a826894be746caa0233e6362c33fdf04a386bb4779d924b37868256b5f04394f",
"byteCount": 2182,
"lineCount": 44,
"language": "TypeScript",
"imports": [],
"exports": [
"export interface ScientificTerm {",
"export const SCIENTIFIC_TERMS: Record<string, ScientificTerm> = {"
],
"topLevelSymbols": [
"ScientificTerm",
"SCIENTIFIC_TERMS"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/hooks/useNetworkStatus.ts",
"sha256": "97a1eb7b50abc7f05c6d430db307fd1739fac0732faf250986ed76e52099de78",
"byteCount": 574,
"lineCount": 21,
"language": "TypeScript",
"imports": [
"import { useState, useEffect } from 'react';"
],
"exports": [
"export function useNetworkStatus() {"
],
"topLevelSymbols": [
"useNetworkStatus"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/index.css",
"sha256": "4379a2e1316cb65fcce8b6a32e2282232b9a5f3d503e5fe1901d0405340721d3",
"byteCount": 1887,
"lineCount": 75,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/lib/utils.ts",
"sha256": "21a3949a05abd11a117ab450826d09eddde87058b80cb2f43a28158c3da3e6fc",
"byteCount": 323,
"lineCount": 9,
"language": "TypeScript",
"imports": [],
"exports": [
"export const toPersian = (n: number | string | undefined | null) => {",
"export function cn(...classes: (string | boolean | undefined)[]) {"
],
"topLevelSymbols": [
"toPersian",
"cn"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/main.tsx",
"sha256": "8b129211a1e36a01a0c294633d8463c9a661a78fe04c3f26f45ca2fdabdedff0",
"byteCount": 241,
"lineCount": 11,
"language": "TypeScript",
"imports": [
"import {StrictMode} from 'react';",
"import {createRoot} from 'react-dom/client';",
"import App from './App.tsx';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/services/api.ts",
"sha256": "da0a9cc677949951c83dc2a846072dc14744bcd84c06d68d74c7e9b52d08264b",
"byteCount": 506,
"lineCount": 24,
"language": "TypeScript",
"imports": [
"import axios from 'axios';"
],
"exports": [
"export default api;"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/services/authService.ts",
"sha256": "da9897908b19513fb41a5b09fd641fae7675091f5887641737c15fa6109e8bd1",
"byteCount": 2877,
"lineCount": 103,
"language": "TypeScript",
"imports": [
"import api from './api';"
],
"exports": [
"export interface User {",
"export interface AuthResponse {",
"export class AuthService {",
"export const authService = AuthService.getInstance();"
],
"topLevelSymbols": [
"User",
"AuthResponse",
"AuthService",
"authService"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/services/orderService.ts",
"sha256": "bafd959741e791ed278a0d6c74ae3e110f90222ed65a93565527faf64739edd1",
"byteCount": 2148,
"lineCount": 80,
"language": "TypeScript",
"imports": [
"import api from './api';",
"import { CartItem } from '../store/cartStore';"
],
"exports": [
"export interface OrderItem {",
"export interface Order {",
"export class OrderService {",
"export const orderService = OrderService.getInstance();"
],
"topLevelSymbols": [
"OrderItem",
"Order",
"OrderService",
"orderService"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/services/productService.ts",
"sha256": "cf3077a9e8f8786fb37a9f5da74400552a68df2fed0cd75c171cea25e354ceb0",
"byteCount": 3890,
"lineCount": 107,
"language": "TypeScript",
"imports": [
"import api from './api';",
"import { PRODUCTS, Product, PetType } from \"../data/products\";"
],
"exports": [
"export class ProductService {",
"export const productService = ProductService.getInstance();"
],
"topLevelSymbols": [
"ProductService",
"productService"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/__tests__/cartStore.test.ts",
"sha256": "6e8809d62f3d49ffca5146a831391e68633858dfbbae926aad1d810271d54a9a",
"byteCount": 4170,
"lineCount": 143,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, beforeEach, vi } from 'vitest';",
"import { useCartStore } from '../cartStore';",
"import { orderService } from '../../services/orderService';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"cartStore",
"should add item to cart",
"should increment quantity if item already in cart",
"should remove item from cart",
"should update quantity",
"should remove item if update quantity is <= 0",
"should apply discount coupon",
"should calculate subtotal, discount and total",
"should create order successfully via orderService"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/__tests__/settingsStore.test.ts",
"sha256": "19d9585ceb5ab219d6c475614da324711d4e40ccf476b486ba5772d8311b00f7",
"byteCount": 2011,
"lineCount": 63,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, beforeEach, vi } from 'vitest';",
"import { useSettingsStore } from '../settingsStore';",
"import api from '../../services/api';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"settingsStore",
"should return fallback if key is not found",
"should return value if key is found",
"should fetch settings successfully and map array to object"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/__tests__/userStore.test.ts",
"sha256": "728192566ff3da8a284af6b17e370b15bb4103da7f7404140daf52ade2d7a566",
"byteCount": 3690,
"lineCount": 134,
"language": "TypeScript",
"imports": [
"import { describe, it, expect, beforeEach, vi } from 'vitest';",
"import { useUserStore } from '../userStore';",
"import { authService } from '../../services/authService';",
"import api from '../../services/api';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [
"userStore",
"should logout correctly",
"should fetch profile successfully",
"should update profile correctly",
"should add address and call fetchProfile"
],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/cartStore.ts",
"sha256": "dd327a89159929614f81c1103d40a739c5e753b95f9b1bb2a823e0e2346b8e12",
"byteCount": 5694,
"lineCount": 167,
"language": "TypeScript",
"imports": [
"import { create } from \"zustand\";",
"import { persist } from \"zustand/middleware\";",
"import { Product } from \"../data/products\";",
"import { orderService } from \"../services/orderService\";"
],
"exports": [
"export interface CartItem {",
"export const useCartStore = create<CartStore>()("
],
"topLevelSymbols": [
"CartItem",
"useCartStore"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/settingsStore.ts",
"sha256": "624187b749ef26e05633e0f6f5b26e1d6509d9d7b23d1ea9c807bcb4167917f3",
"byteCount": 1644,
"lineCount": 60,
"language": "TypeScript",
"imports": [
"import { create } from \"zustand\";",
"import api from \"../services/api\";"
],
"exports": [
"export interface ScientificTerm {",
"export const useSettingsStore = create<SettingsStore>()((set, get) => ({"
],
"topLevelSymbols": [
"ScientificTerm",
"useSettingsStore"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/usePetStore.ts",
"sha256": "d44296271fb8f1bfd3f3d628c347df02b433d8abdeed835b8e1218b0f8ecb509",
"byteCount": 7771,
"lineCount": 215,
"language": "TypeScript",
"imports": [
"import { create } from \"zustand\";",
"import { persist } from \"zustand/middleware\";"
],
"exports": [
"export interface Reminder {",
"export interface HealthLog {",
"export interface PetConsumption {",
"export interface PetProfile {",
"export const usePetStore = create<PetStore>()("
],
"topLevelSymbols": [
"Reminder",
"HealthLog",
"PetConsumption",
"PetProfile",
"usePetStore"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/store/userStore.ts",
"sha256": "d58219ae73e58ba5bc7498173c9a2787d1d2a55798e38833e652c5c361a60799",
"byteCount": 7447,
"lineCount": 220,
"language": "TypeScript",
"imports": [
"import { create } from \"zustand\";",
"import { persist } from \"zustand/middleware\";",
"import { authService } from \"../services/authService\";",
"import api from \"../services/api\";",
"import { useCartStore } from \"./cartStore\";",
"import { usePetStore } from \"./usePetStore\";"
],
"exports": [
"export type UserRole = \"User_Guest\" | \"User_PetOwner\" | \"User_Partner\";",
"export interface Address {",
"export interface Transaction {",
"export const useUserStore = create<UserStore>()("
],
"topLevelSymbols": [
"UserRole",
"Address",
"Transaction",
"useUserStore"
],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/test/setup.ts",
"sha256": "9d7cdb55306fa51fd1b8badbec660b2f2e1d7d78531be1e5807f15491e93d9ef",
"byteCount": 1607,
"lineCount": 68,
"language": "TypeScript",
"imports": [
"import { vi } from 'vitest';"
],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "src/vite-env.d.ts",
"sha256": "424faf9241dd699dda995b367ed36665732da1e6ec1f33b2fd40394488ecac92",
"byteCount": 39,
"lineCount": 2,
"language": "TypeScript",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "swagger.yml",
"sha256": "800b2e02103b50a12f3ca294af2b526c32635cabe0b65f41fdb07c7c6ec1ff6b",
"byteCount": 3713,
"lineCount": 137,
"language": "Plain text",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
},
{
"path": "tsconfig.json",
"sha256": "a9d48a003eb8b17b0d5765de18a9ff32fa9d3c54ce92ac98e5784f39c2e59584",
"byteCount": 631,
"lineCount": 29,
"language": "JSON",
"imports": [],
"exports": [],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [
"compilerOptions",
"target",
"experimentalDecorators",
"useDefineForClassFields",
"module",
"lib",
"skipLibCheck",
"moduleResolution",
"isolatedModules",
"moduleDetection",
"allowJs",
"jsx",
"paths",
"@/*",
"allowImportingTsExtensions"
],
"readSucceeded": true,
"readError": null
},
{
"path": "vite.config.ts",
"sha256": "245a8a2c544f56a4c4a59be6e3afc77d74dd51311e0f8ca3fe0fcfb1959f979f",
"byteCount": 1288,
"lineCount": 44,
"language": "TypeScript",
"imports": [
"import tailwindcss from '@tailwindcss/vite';",
"import react from '@vitejs/plugin-react';",
"import path from 'path';",
"import {defineConfig, loadEnv} from 'vite';"
],
"exports": [
"export default defineConfig(({mode}) => {"
],
"topLevelSymbols": [],
"frameworkDecorators": [],
"testSuiteNames": [],
"configurationKeys": [],
"readSucceeded": true,
"readError": null
}
]