Last Updated: 2025-10-12
Complete documentation of module dependencies, data flow patterns, and external dependencies for the CoMapeo Category Set Spreadsheet Plugin.
- External Dependencies
- Module Organization
- Data Flow Architecture
- Module Dependency Graph
- Critical Dependencies
{
"@types/bun": "latest",
"@types/google-apps-script": "^1.0.91",
"biome": "^0.3.3",
"typescript": "^5.7.3"
}Purpose:
- @types/bun: TypeScript type definitions for Bun runtime (development only)
- @types/google-apps-script: TypeScript type definitions for Google Apps Script APIs
- biome: Fast linter and formatter for JavaScript/TypeScript
- typescript: TypeScript compiler for type checking and compilation
These are built-in APIs provided by Google Apps Script runtime:
-
SpreadsheetApp: Spreadsheet manipulation API
- Used in: All core modules, processing modules, import modules
- Primary operations: Read/write cells, create sheets, format ranges
-
DriveApp: Google Drive file operations API
- Used in:
driveService.ts,importCategory/fileExtractor.ts - Primary operations: Create folders, save files, manage import/export assets
- Used in:
-
UrlFetchApp: HTTP request API
- Used in:
apiService.ts,iconApi.ts,spreadsheetData.ts - Primary operations: Fetch icons, call external API, download language data
- Used in:
-
LanguageApp: Translation API
- Used in:
translation.ts - Primary operations: Translate text between languages using Google Translate
- Used in:
-
Utilities: Utility functions API
- Used in:
driveService.ts,apiService.ts,importCategory/fileExtractor.ts - Primary operations: ZIP/Unzip helpers, sleep/retry logic, date formatting
- Used in:
-
PropertiesService: Persistent storage API
- Used in:
apiService.ts - Primary operations: Store and retrieve API URL configuration
- Used in:
-
CacheService: Caching API
- Used in:
spreadsheetData.ts - Primary operations: Cache language data to reduce API calls
- Used in:
-
Logger: Logging API
- Used in:
apiService.ts,spreadsheetData.ts - Primary operations: Log information for debugging
- Used in:
-
Icon API:
http://137.184.153.36:3000/icons/(configurable)- Used in:
generateIcons/iconApi.ts - Purpose: Fetch SVG icons for categories
- Retry logic: 3 attempts with exponential backoff
- Used in:
-
CoMapeo Build API:
http://137.184.153.36:3000/(configurable)- Used in:
apiService.ts - Purpose: Accept JSON build payload at
/v2and return a.comapeocatZIP - Retry logic: 3 attempts with exponential backoff
- Used in:
-
GitHub Languages API:
https://unpkg.com/@cospired/i18n-iso-languages@4.3.0/langs/en.json- Used in:
spreadsheetData.ts - Purpose: Fetch comprehensive language list
- Caching: 6-hour TTL in CacheService
- Used in:
Purpose: Main entry point for config generation workflow
Dependencies:
spreadsheetData.ts: Get spreadsheet databuilders/payloadBuilder.ts: Build JSON payloadapiService.ts: Send JSON build request and save.comapeocatto Drivedialog.ts: Show progress and resultslint.ts: Validate sheetsvalidation.ts: Validate configurationlogger.ts: Loggingutils.ts: Utility functions
Data Flow: Orchestrator → Payload Builder → API → Drive → User
Purpose: Main entry point for importing .comapeocat files
Dependencies:
importCategory/fileExtractor.ts: Extract ZIP/TAR archivesimportCategory/parseFiles.ts: Parse JSON config filesimportCategory/parseIconSprite.ts: Extract SVG icons from spriteimportCategory/applyConfiguration.ts: Main orchestrator for applying configimportCategory/importProgressHandler.ts: Progress reportingimportDropzone.ts: File upload UIdialog.ts: Show progress and resultslogger.ts: Logging
Data Flow: Upload → Extract → Parse → Apply → User
Purpose: Generate and save category icons
Dependencies:
generateIcons/iconProcessor.ts: Process and optimize iconsspreadsheetData.ts: Get category namesdriveService.ts: Get config folderdialog.ts: Show success dialogutils.ts: Utility functions (slugify)
Data Flow: Categories → Icon API → Process → Drive → User
Purpose: Manage translation workflows
Dependencies:
spreadsheetData.ts: Get language data and primary language- Google LanguageApp: Translate text
logger.ts: Logging (implicit via console.log)
Data Flow: Source Text → Google Translate → Target Cells
Purpose: Validate spreadsheet data and highlight errors
Dependencies:
spreadsheetData.ts: Get spreadsheet datavalidation.ts: Validation functionsdialog.ts: Show validation resultslogger.ts: Logging
Data Flow: Sheets → Validate → Highlight Errors → User
Purpose: Clean up spreadsheet data and Drive folders
Dependencies:
spreadsheetData.ts: Get spreadsheet datadriveService.ts: Get config folderdialog.ts: Show cleanup resultslogger.ts: Logging
Data Flow: Sheets/Drive → Clean → Report → User
Purpose: Build the v2 JSON payload from SheetData
Dependencies:
spreadsheetData.ts: SheetData shape and helpersutils.ts: slugify helpers
Called By: generateCoMapeoConfig.ts
Purpose: Legacy metadata/package.json generator (pre-v2)
Dependencies:
utils.ts: slugify()- Google Utilities: Date formatting
Called By: Legacy build flow (not used in v2)
Purpose: Legacy field processor (pre-v2)
Dependencies:
utils.ts: slugify(), getFieldType(), getFieldOptions()validation.ts: validateFieldDefinition()
Called By: Legacy build flow (not used in v2)
Purpose: Legacy preset processor (pre-v2)
Dependencies:
utils.ts: slugify()validation.ts: validateCategoryDefinition()
Called By: Legacy build flow (not used in v2)
Purpose: Legacy translation aggregator (pre-v2)
Dependencies:
spreadsheetData.ts: getPrimaryLanguage(), getAllLanguages(), sheets()utils.ts: getFieldType()logger.ts: Logging (implicit via console.log)
Called By: Legacy build flow (not used in v2)
Purpose: Main orchestrator for applying imported config to spreadsheet
Dependencies:
importCategory/applyMetadata.ts: Apply metadataimportCategory/applyCategories.ts: Apply categoriesimportCategory/applyFields.ts: Apply fieldsimportCategory/applyTranslations.ts: Apply translationsimportCategory/clearValidations.ts: Clear existing validationsimportCategory/addDetailsDropdown.ts: Add field type dropdownsimportCategory/debugLogger.ts: Debug loggingimportCategory/importProgressHandler.ts: Progress reportingutils.ts: Utility functions
Called By: importCategory.ts
Purpose: Extract tar archive to Google Drive temp folder
Dependencies:
- Google DriveApp: Create folders, save files
importCategory/debugLogger.ts: Debug loggingutils.ts: slugify()
Called By: importCategory.ts
Purpose: Parse JSON config files and extract data structures
Dependencies:
- Google DriveApp: Read files
importCategory/debugLogger.ts: Debug loggingtypes.ts: Type definitions
Called By: importCategory.ts
Purpose: Extract individual SVG icons from icon sprite
Dependencies:
- Google DriveApp: Read sprite file, save individual icons
importCategory/debugLogger.ts: Debug logging
Called By: importCategory.ts
Purpose: Comprehensive input validation system
Dependencies:
spreadsheetData.ts: getAllLanguages()utils.ts: getFieldType()
Called By:
generateConfig/processFields.ts: Field validationgenerateConfig/processPresets.ts: Category validationspreadsheetData.ts: Language validationlint.ts: Sheet validation
Purpose: Centralized logging system with log levels
Dependencies: None (standalone utility)
Called By: All modules (via Logger.scope())
Purpose: Shared utility functions
Dependencies: None (standalone utility)
Called By: All modules
- slugify(): URL-safe string conversion
- getFieldType(): Map spreadsheet field types to CoMapeo types
- getFieldOptions(): Parse field options from CSV
- isOptionField(): Check if field has options
Purpose: TypeScript type definitions
Dependencies: None (type-only file)
Used By: All modules
Purpose: Google Drive operations (folders, files, optional ZIP helpers)
Dependencies:
- Google DriveApp: Folder/file operations
- Google Utilities: ZIP creation (shareable bundles), sleep
generateIcons/iconProcessor.ts: processIcons()utils.ts: slugify()logger.ts: Logging
Called By:
apiService.ts: Get config folder and save build outputsicons.ts: Get config foldercleanup.ts: Get config folder for cleanup
Purpose: External API communication
Dependencies:
- Google UrlFetchApp: HTTP requests
- Google PropertiesService: Store API URL
- Google Utilities: Sleep for retry
driveService.ts: getConfigFolder()logger.ts: Logging (implicit via console.log)
Called By: generateCoMapeoConfig.ts
Purpose: Spreadsheet data access and language management
Dependencies:
- Google SpreadsheetApp: Read spreadsheet data
- Google UrlFetchApp: Fetch language data from GitHub
- Google CacheService: Cache language data
data/languagesFallback.ts: Fallback language datavalidation.ts: validatePrimaryLanguage()logger.ts: Logging
Called By: All modules that need spreadsheet data or language information
Purpose: Process and optimize SVG icons
Dependencies:
generateIcons/iconApi.ts: Fetch icons from API- Google DriveApp: Save icons to Drive
logger.ts: Logging (implicit via console.log)
Called By: driveService.ts
Purpose: Fetch SVG icons from external API
Dependencies:
- Google UrlFetchApp: HTTP requests
- Google Utilities: Sleep for retry
apiService.ts: getApiUrl()logger.ts: Logging (implicit via console.log)
Called By: generateIcons/iconProcessor.ts
Purpose: Generate HTML dialogs for user interactions
Dependencies:
text/dialog.ts: Dialog text templatesutils.ts: HTML escaping
Called By:
generateCoMapeoConfig.ts: Progress and result dialogsimportCategory.ts: Progress and result dialogsicons.ts: Success dialoglint.ts: Validation resultscleanup.ts: Cleanup results
Purpose: Localized text strings for dialogs
Dependencies: None (data-only file)
Called By: dialog.ts
Purpose: Localized text strings for menu items
Dependencies: None (data-only file)
Called By: Menu creation in main App Script file
Purpose: Fallback language data if GitHub API fails
Dependencies: None (data-only file)
Called By: spreadsheetData.ts
User Action (Menu: "Generate CoMapeo Category")
↓
generateCoMapeoConfig.ts (Entry Point)
↓
lint.ts → Validate sheets + translation mismatches
↓
spreadsheetData.ts → Get all sheet data
↓
builders/payloadBuilder.ts → Build JSON payload
↓
apiService.ts → sendBuildRequest() (POST /v2)
↓
apiService.ts → saveComapeocatToDrive() (Drive builds folder)
↓
dialog.ts → Show success dialog with Drive link
↓
User downloads .comapeocat file from Drive
User Action (Menu: "Import Category File")
↓
importDropzone.ts → Show file upload UI
↓
User uploads .comapeocat file
↓
importCategory.ts (Entry Point)
↓
importProgressHandler.ts → Show progress dialog
↓
fileExtractor.ts → Extract ZIP/TAR archive to Drive temp folder
↓
parseFiles.ts → Parse all JSON config files
│
├─→ Read metadata.json
├─→ Read package.json
├─→ Read fields/*.json
├─→ Read presets/*.json
└─→ Read messages/*.json (translations)
↓
parseIconSprite.ts → Extract individual SVG icons from sprite
↓
applyConfiguration.ts (Orchestrator)
│
├─→ clearValidations.ts → Clear existing validations
│
├─→ applyMetadata.ts → Set metadata in spreadsheet
│
├─→ applyCategories.ts → Populate Categories sheet
│
├─→ applyFields.ts → Populate Details sheet
│
├─→ applyTranslations.ts → Populate translation sheets
│
└─→ addDetailsDropdown.ts → Add field type dropdowns
↓
Cleanup: Delete temp folder from Drive
↓
dialog.ts → Show success dialog
↓
User sees imported config in spreadsheet
User Action (Menu: "Generate Icons")
↓
icons.ts → generateIconsConfig()
↓
spreadsheetData.ts → Get category names from Categories sheet
↓
driveService.ts → getConfigFolder() → Get or create config folder
↓
iconProcessor.ts → processIcons()
│
├─→ For each category:
│ │
│ ├─→ iconApi.ts → searchIcons() → Search icon API
│ │ └─→ Return first matching icon
│ │
│ ├─→ iconApi.ts → fetchIcon() → Download SVG icon
│ │ └─→ Retry 3 times with exponential backoff
│ │
│ └─→ Save SVG to Drive icons folder
│
└─→ Return icon metadata
↓
dialog.ts → Show success dialog with folder link
↓
User sees icons in Drive folder
User Action (Menu: "Manage Languages & Translate")
↓
dialog.ts → Show combined language management dialog
↓
User selects auto-translate targets and optional custom languages
↓
translation.ts → addCustomLanguagesToTranslationSheets()
↓
translation.ts → autoTranslateSheetsBidirectional()
│
├─→ Validate target languages
│
├─→ For each translation sheet:
│ │
│ ├─→ createTranslationSheet() or ensureLanguageColumnsExist()
│ │
│ └─→ translateSheetBidirectional()
│ │
│ ├─→ For each row in sheet:
│ │ │
│ │ ├─→ Read source text (column A)
│ │ │
│ │ └─→ For each target language:
│ │ │
│ │ └─→ LanguageApp.translate() → Google Translate API
│ │ └─→ Write translation to target column
│ │
│ └─→ Skip cells that already have translations
│
└─→ Translation sheets:
├─→ Category Translations
├─→ Detail Label Translations
├─→ Detail Helper Text Translations
└─→ Detail Option Translations
↓
dialog.ts → Show success dialog
↓
User sees translations in spreadsheet
User Action (Menu: "Lint")
↓
lint.ts → validateSheet()
│
├─→ spreadsheetData.ts → Get all sheet data
│
├─→ validation.ts → validateSheetData()
│ │
│ ├─→ Check required sheets exist
│ ├─→ Check required columns exist
│ ├─→ validateFieldDefinition() for each field
│ └─→ validateCategoryDefinition() for each category
│
├─→ validateSheetConsistency()
│ │
│ ├─→ Check translation sheets have matching row counts
│ ├─→ Check translation sheets have matching language columns
│ └─→ Highlight inconsistencies in red
│
└─→ Collect all errors and warnings
↓
dialog.ts → Show validation results
↓
User sees highlighted errors in spreadsheet
User Action (Menu: "Cleanup")
↓
cleanup.ts → cleanupSheet()
│
├─→ spreadsheetData.ts → Get all sheet data
│
├─→ Remove whitespace-only cells
│
└─→ Fix data inconsistencies
↓
cleanup.ts → cleanupOldTempFolders()
│
├─→ driveService.ts → getConfigFolder()
│
├─→ Find temp folders matching pattern:
│ - temp-comapeocat-extract-*
│ - comapeocat-extract-temp-*
│
├─→ Check folder age (default: > 24 hours)
│
└─→ Move old folders to trash
↓
dialog.ts → Show cleanup results
↓
User sees cleaned spreadsheet and Drive
generateCoMapeoConfig.ts
├── spreadsheetData.ts
│ ├── data/languagesFallback.ts
│ └── validation.ts
├── translation.ts
│ └── spreadsheetData.ts
├── validation.ts
│ ├── spreadsheetData.ts
│ └── utils.ts
├── generateConfig/processMetadata.ts
│ └── utils.ts
├── generateConfig/processFields.ts
│ ├── utils.ts
│ └── validation.ts
├── generateConfig/processPresets.ts
│ ├── utils.ts
│ └── validation.ts
├── generateConfig/processTranslations.ts
│ ├── spreadsheetData.ts
│ └── utils.ts
├── driveService.ts
│ ├── generateIcons/iconProcessor.ts
│ │ └── generateIcons/iconApi.ts
│ │ └── apiService.ts
│ ├── utils.ts
│ └── logger.ts
├── apiService.ts
│ ├── driveService.ts (saveZipToDrive)
│ └── logger.ts
├── dialog.ts
│ ├── text/dialog.ts
│ └── utils.ts
├── logger.ts
└── utils.ts
importCategory.ts
├── importDropzone.ts
├── importCategory/fileExtractor.ts
│ ├── importCategory/debugLogger.ts
│ └── utils.ts
├── importCategory/parseFiles.ts
│ ├── importCategory/debugLogger.ts
│ └── types.ts
├── importCategory/parseIconSprite.ts
│ └── importCategory/debugLogger.ts
├── importCategory/applyConfiguration.ts
│ ├── importCategory/applyMetadata.ts
│ ├── importCategory/applyCategories.ts
│ ├── importCategory/applyFields.ts
│ ├── importCategory/applyTranslations.ts
│ ├── importCategory/clearValidations.ts
│ ├── importCategory/addDetailsDropdown.ts
│ ├── importCategory/debugLogger.ts
│ ├── importCategory/importProgressHandler.ts
│ └── utils.ts
├── importCategory/importProgressHandler.ts
├── dialog.ts
│ ├── text/dialog.ts
│ └── utils.ts
└── logger.ts
icons.ts
├── generateIcons/iconProcessor.ts
│ └── generateIcons/iconApi.ts
│ └── apiService.ts
├── spreadsheetData.ts
│ ├── data/languagesFallback.ts
│ └── validation.ts
├── driveService.ts
│ ├── generateIcons/iconProcessor.ts (circular via processIcons)
│ ├── utils.ts
│ └── logger.ts
├── dialog.ts
│ ├── text/dialog.ts
│ └── utils.ts
└── utils.ts
lint.ts
├── spreadsheetData.ts
│ ├── data/languagesFallback.ts
│ └── validation.ts
├── validation.ts
│ ├── spreadsheetData.ts
│ └── utils.ts
├── dialog.ts
│ ├── text/dialog.ts
│ └── utils.ts
└── logger.ts
cleanup.ts
├── spreadsheetData.ts
│ ├── data/languagesFallback.ts
│ └── validation.ts
├── driveService.ts
│ ├── generateIcons/iconProcessor.ts
│ ├── utils.ts
│ └── logger.ts
├── dialog.ts
│ ├── text/dialog.ts
│ └── utils.ts
└── logger.ts
driveService.ts → iconProcessor.ts → iconApi.ts → apiService.ts
↓
saveZipToDrive()
↓
driveService.ts
Resolution: The circular dependency is resolved because:
iconApi.tsonly usesgetApiUrl()fromapiService.tsapiService.tsonly usessaveZipToDrive()fromdriveService.ts- These functions don't call back into the modules that depend on them
- Google Apps Script's global scope allows this pattern
Alternative: Extract getApiUrl() to a separate config.ts module to eliminate the circular dependency.
All modules depend on:
- utils.ts: Core utility functions (slugify, field type mapping)
- logger.ts: Logging infrastructure
- types.ts: TypeScript type definitions
All modules depend on Google Apps Script runtime APIs:
- SpreadsheetApp (most common)
- DriveApp (file operations)
- UrlFetchApp (HTTP requests)
- Utilities (ZIP/Unzip, sleep, date formatting)
- LanguageApp (translation)
- PropertiesService (configuration)
- CacheService (caching)
- Minimize Circular Dependencies: Keep data flow unidirectional where possible
- Centralize Utilities: Use
utils.ts,logger.ts, andvalidation.tsfor shared functionality - Isolate External Dependencies: Wrap external APIs in dedicated modules (
apiService.ts,iconApi.ts) - Modular Processing: Keep processing modules focused on single responsibility
- Clear Data Flow: Maintain clear orchestration in entry point modules
- Entry Points: Orchestrate workflows (generateCoMapeoConfig.ts, importCategory.ts)
- Processors: Transform data (
builders/payloadBuilder.ts; legacy processors ingenerateConfig/*) - Services: Interface with external systems (apiService.ts, driveService.ts)
- Utilities: Shared helper functions (utils.ts, logger.ts, validation.ts)
- Data: Pure data modules (languagesFallback.ts, dialog text files)
Test modules depend on:
- All core modules: For end-to-end testing
- test/testHelpers.ts: Test infrastructure (backup/restore, assertions, test runner)
- Google Apps Script APIs: For spreadsheet manipulation in tests
Test helper dependencies:
logger.ts: Loggingtypes.ts: Type definitions- No circular dependencies with production code
- 2025-10-12: Initial comprehensive dependency documentation
- Documented 54+ source files
- Mapped 6 major data flows
- Identified 1 circular dependency with resolution
- Listed 8 Google Apps Script API dependencies
- Listed 3 external HTTP API dependencies
See Also:
- Architecture Documentation
- Module Reviews
- Coding Assistant Guide - Development guidance