npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

@fickou/cma-cgm-codeco

v1.0.0

Published

Générateur de messages CODECO (EDI) pour CMA CGM - format SMDG21

Readme

CMA CGM CODECO Generator

Un générateur TypeScript robuste pour créer des messages CODECO (Container Discharge/Loading Order) conformes aux standards EDI UN/EDIFACT D.95B et aux spécifications SMDG21.

À Propos

Ce projet développe une solution complète de génération de messages CODECO pour l'échange standardisé d'informations sur les mouvements de conteneurs entre les terminaux portuaires et les systèmes de gestion. Il implémente les spécifications du format EDI CODECO utilisé dans l'industrie maritime internationale.

Contexte Technique

CODECO (Container Discharge/Loading Order) est un message EDI standardisé défini par les Nations Unies dans le cadre UN/EDIFACT qui permet de communiquer les informations relatives aux mouvements de conteneurs dans les ports. Cette implémentation suit les directives SMDG (Ship Management and Cargo Data Group) version 21.

Fonctionnalités Principales

Génération de Messages

  • Messages CODECO Gate In (34) : Entrée de conteneurs au terminal
  • Messages CODECO Gate Out (36) : Sortie de conteneurs du terminal
  • Format EDI UN/EDIFACT D.95B : Conformité aux standards internationaux
  • Spécifications SMDG21 : Support complet des codes et segments

Validation et Qualité

  • Validation stricte des données : Contrôle de cohérence et de format
  • Types TypeScript complets : Sécurité de typage et IntelliSense
  • Gestion des erreurs : Messages d'erreur détaillés et multilingues
  • Validation des contraintes métier : Respect des règles CODECO

Support des Standards

  • Formats de date multiples : 102, 203, 303, 610 selon les besoins
  • Codes de scellement standardisés : CA, CU, SH, TO, AB
  • Statuts d'équipement : Export, Import, Transbordement
  • Indicateurs de conteneur : Plein, Vide

Architecture du Projet

cma-cgm-codeco/
├── src/
│   ├── index.ts          # API principale et générateur de messages
│   ├── interface.ts      # Définitions des types et énumérations
│   └── validator.ts      # Système de validation robuste
├── dist/                 # Code compilé (généré par build)
├── package.json          # Configuration NPM et dépendances
├── tsconfig.json         # Configuration TypeScript
└── README.md            # Documentation du projet

Composants Principaux

index.ts - Générateur Principal

  • Fonction createMessage() : API principale de génération
  • Fonction createMessageStream() : Génération de streams pour fichiers/HTTP
  • Fonction formatDateHelper() : Utilitaire de formatage de dates
  • Logique de construction des segments EDI
  • Calcul automatique des longueurs de message

interface.ts - Définitions de Types

  • Type Message : Structure complète du message CODECO
  • Type ContainerMessage : Informations par conteneur
  • Énumérations : MessageType, EquipmentStatus, ContainerIndicator, SealingPartyCoded
  • Type MessageOptions : Options de génération

validator.ts - Système de Validation

  • Validation par schémas configurables
  • Support des types complexes (objets, tableaux, énumérations)
  • Messages d'erreur localisés en français
  • Modes de validation strict et permissif

Installation et Utilisation

Prérequis

  • Node.js >= 14.x
  • TypeScript >= 4.x

Installation des Dépendances

npm install

Compilation

npm run build

Utilisation Basique

import { 
  createMessage, 
  createMessageStream,
  MessageType, 
  EquipmentStatus, 
  ContainerIndicator, 
  SealingPartyCoded 
} from './dist/index.js';

// Configuration du message
const message = {
  controlRef: "12345",
  senderId: "MGEHLDTER",
  receiverId: "CMACGM",
  navireName: "MSC_OSCAR",
  containers: [
    {
      reference: "MSCU9876543",
      status: EquipmentStatus.export,
      indicator: ContainerIndicator.full,
      bookingRef: "BK2024001",
      sealNumber: "SEAL789456",
      sealingPartyCoded: SealingPartyCoded.Carrier,
      movementAt: new Date('2024-12-20T14:30:00Z')
    }
  ]
};

// Options de génération
const options = {
  generatedAt: new Date(),
  syntaxType: 2 // UNOA:2
};

// Génération du message CODECO
try {
  const codecoLines = createMessage(MessageType.gateIn, message, options);
  const codecoMessage = codecoLines.join('\n');
  console.log(codecoMessage);
} catch (error) {
  console.error('Erreur de génération:', error.message);
}

Validation Personnalisée

import { validateData, validateDataSafe, messageSchema } from './dist/validator.js';

// Validation avec exception
try {
  validateData(message);
  console.log('✅ Message valide');
} catch (error) {
  console.error('❌ Validation échouée:', error.message);
}

// Validation sécurisée (sans exception)
const errors = validateDataSafe(message);
if (errors.length === 0) {
  console.log('✅ Message valide');
} else {
  console.error('❌ Erreurs trouvées:', errors);
}

Génération de Stream (Nouveau)

La bibliothèque supporte maintenant la génération de streams pour une intégration facilité avec les systèmes de fichiers et les réponses HTTP.

import { createMessageStream } from './dist/index.js';
import { writeFile, createWriteStream } from 'fs';

// Génération de stream non compressé (avec sauts de ligne)
const streamOptions = {
  generatedAt: new Date(),
  syntaxType: 2,
  compress: false // Par défaut : false
};

const stream = createMessageStream(MessageType.gateIn, message, streamOptions);

// Utilisation 1: Écriture directe dans un fichier
const fileStream = createWriteStream('codeco-message.edi');
stream.pipe(fileStream);

// Utilisation 2: Réponse HTTP Express.js
app.get('/codeco/:messageId', (req, res) => {
  const stream = createMessageStream(MessageType.gateOut, message, {
    compress: true // Sans sauts de ligne pour HTTP
  });
  
  res.setHeader('Content-Type', 'application/edi-x12');
  res.setHeader('Content-Disposition', 'attachment; filename="codeco.edi"');
  stream.pipe(res);
});

// Utilisation 3: Lecture complète du stream
async function getMessageContent() {
  const stream = createMessageStream(MessageType.gateIn, message, streamOptions);
  
  let content = '';
  for await (const chunk of stream) {
    content += chunk.toString();
  }
  
  return content;
}

Options de Compression

  • compress: false (défaut) : Les segments EDI sont séparés par des sauts de ligne (\n)
  • compress: true : Les segments sont concaténés sans séparateur pour un format compact
// Mode non compressé - Lisible
const uncompressed = createMessageStream(MessageType.gateIn, message, { compress: false });
// Résultat:
// UNB+UNOA:2+...+12345'
// UNH+12345+...+12345'
// BGM+34+12345+5'
// ...

// Mode compressé - Compact pour transmission
const compressed = createMessageStream(MessageType.gateIn, message, { compress: true });
// Résultat:
// UNB+UNOA:2+...+12345'UNH+12345+...+12345'BGM+34+12345+5'...

Spécifications Techniques

Types de Messages Supportés

| Type | Code | Description | Usage | |------|------|-------------|-------| | Gate In | 34 | Entrée de conteneur | Arrivée au terminal | | Gate Out | 36 | Sortie de conteneur | Départ du terminal |

Statuts d'Équipement

| Statut | Code | Description | |--------|------|-------------| | Export | 2 | Conteneur à l'export | | Import | 3 | Conteneur à l'import | | Transbordement | 6 | Conteneur en transit |

Indicateurs de Conteneur

| Indicateur | Code | Description | |------------|------|-------------| | Vide | 4 | Conteneur vide | | Plein | 5 | Conteneur chargé |

Parties Responsables du Scellement

| Partie | Code | Description | |--------|------|-------------| | Transporteur | CA | Carrier | | Douanes | CU | Customs | | Expéditeur | SH | Shipper | | Opérateur Terminal | TO | Terminal Operator | | Inconnu | AB | Unknown/Other |

Formats de Date EDI

| Code | Format | Exemple | Utilisation | |------|--------|---------|-------------| | 102 | YYYYMMDD | 20241220 | Dates simples | | 203 | YYYYMMDDHHMM | 202412201430 | Dates avec heure | | 303 | YYYYMMDDHHMMSS | 20241220143045 | Horodatage précis | | 610 | WWYYYY | 512024 | Semaine/année |

Structure du Message CODECO Généré

Un message CODECO complet suit cette structure EDI standardisée :

UNB+UNOA:2+MGEHLDTER+CMACGM+241220:1430+12345'          # En-tête interchange
UNH+12345+CODECO:D:95B:UN:SMDG21+12345'                 # En-tête message
BGM+34+12345+5'                                          # Début de message
TDT+20++1++:172:20'                                      # Transport
NAD+MS+MGEHLDTER'                                        # Expéditeur
NAD+CA+MSC_OSCAR:160:20'                                 # Navire
EQD+CN+MSCU9876543+4210:102:5++2+5'                    # Équipement
RFF+BN:BK2024001'                                       # Référence
DTM+203:20241220143000:203'                             # Date/heure
LOC+165+MGEHL:139:6+MGEHLDTER:TER:ZZZ'                  # Localisation
MEA+AAE+G+KGM:24280'                                    # Poids
SEL+SEAL789456+CA'                                       # Scellé
CNT+1:1'                                                # Compteur
UNT+13+12345'                                           # Fin message
UNZ+1+12345'                                            # Fin interchange

Explication des Segments

  • UNB : En-tête d'interchange (expéditeur, destinataire, horodatage)
  • UNH : En-tête de message (type CODECO, version D.95B)
  • BGM : Début du message (type d'opération, référence)
  • TDT : Informations de transport
  • NAD : Nom et adresse (terminal, navire)
  • EQD : Détails de l'équipement (conteneur, statut, indicateur)
  • RFF : Référence de réservation
  • DTM : Date et heure du mouvement
  • LOC : Localisation géographique
  • MEA : Mesures (poids, dimensions)
  • SEL : Information de scellé
  • CNT : Compteur de conteneurs
  • UNT : Fin de message
  • UNZ : Fin d'interchange

Validation et Contrôles Qualité

Règles de Validation Appliquées

Validation des Champs Obligatoires

  • controlRef : Référence de contrôle (max 14 caractères)
  • senderId, receiverId : Identifiants des parties (max 35 caractères)
  • navireName : Nom du navire (max 35 caractères)
  • containers : Liste non vide de conteneurs

Validation des Conteneurs

  • reference : Référence conteneur (max 11 caractères, format ISO)
  • status : Statut valide (export/import/transbordement)
  • indicator : Indicateur valide (plein/vide)
  • bookingRef : Référence de réservation (max 35 caractères)
  • sealNumber : Numéro de scellé (max 20 caractères)
  • sealingPartyCoded : Partie responsable valide
  • movementAt : Date de mouvement valide

Validation des Formats

  • Dates : Validation de la cohérence des dates
  • Énumérations : Vérification des valeurs autorisées
  • Longueurs : Respect des limites EDI
  • Types : Contrôle de typage strict

Messages d'Erreur Localisés

Le système de validation produit des messages d'erreur en français, détaillés et précis :

Validation échouée :
message.controlRef est obligatoire
message.containers[0].reference ne peut dépasser 11 caractères
message.containers[0].status doit être parmi: 2, 3, 6
message.containers[1].movementAt doit être une date valide

Développement et Contribution

Structure de Développement

Le projet utilise TypeScript avec une configuration stricte pour assurer la qualité du code :

{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs", 
    "strict": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "skipLibCheck": true,
    "outDir": "dist"
  }
}

Workflow de Développement

  1. Développement : Modification des fichiers dans src/
  2. Compilation : npm run build pour générer dist/
  3. Test : Validation avec des cas de test réels
  4. Documentation : Mise à jour du README si nécessaire

Standards de Code

  • Typage strict : Tous les types doivent être explicites
  • Validation complète : Toute donnée d'entrée doit être validée
  • Gestion d'erreurs : Messages d'erreur clairs et exploitables
  • Documentation : Commentaires pour la logique métier complexe

Support et Maintenance

Compatibilité

  • Node.js : Versions LTS supportées (14.x, 16.x, 18.x, 20.x)
  • TypeScript : Compatible avec 4.x et 5.x
  • Standards EDI : UN/EDIFACT D.95B, SMDG21

Dépendances

Le projet maintient un nombre minimal de dépendances :

  • Production : dayjs pour la manipulation des dates
  • Développement : typescript pour la compilation

Roadmap

  • [ ] Support des messages CODECO additionnels (discharge, loading)
  • [ ] Validation étendue avec règles métier CMA CGM
  • [ ] Export en formats multiples (JSON, XML, CSV)
  • [ ] Interface de test et d'validation interactive
  • [ ] Documentation API complète avec exemples

Licence

Projet privé CMA CGM - Tous droits réservés

Ce logiciel est la propriété de CMA CGM et est destiné à un usage interne uniquement. Toute reproduction, distribution ou modification sans autorisation expresse est interdite.