{"_id":"@amsom-habitat/request-data-handling","name":"@amsom-habitat/request-data-handling","dist-tags":{"latest":"1.0.1"},"versions":{"1.0.1":{"name":"@amsom-habitat/request-data-handling","version":"1.0.1","description":"Normalisation des données échangées avec Oracle : mise en forme des paramètres envoyés aux fonctions stockées, et typage des lignes lues (portage Node du package PHP amsom-habitat/request-data-handling).","keywords":["oracle","normalisation","camelcase","amsom"],"license":"UNLICENSED","author":{"name":"Amsom Habitat"},"repository":{"type":"git","url":"git+https://gitlab.com/amsom-package/request-data-handling-node.git","directory":"package_src"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.js","default":"./dist/index.js"}},"engines":{"node":">=18"},"scripts":{"build":"tsc","lint":"eslint","lint:fix":"eslint --fix","test":"jest","prepublishOnly":"npm run build"},"devDependencies":{"@eslint/js":"^9.39.0","@types/jest":"^30.0.0","@types/node":"^26.1.1","eslint":"^9.39.0","globals":"^15.15.0","jest":"^30.4.2","ts-jest":"^29.4.12","typescript":"^5.9.3","typescript-eslint":"^8.65.0"},"_id":"@amsom-habitat/request-data-handling@1.0.1","gitHead":"fad7b21f893629bc7bbd0e0ea550420cc730ac8a","bugs":{"url":"https://gitlab.com/amsom-package/request-data-handling-node/issues"},"homepage":"https://gitlab.com/amsom-package/request-data-handling-node#readme","_nodeVersion":"24.20.0","_npmVersion":"11.5.2","dist":{"integrity":"sha512-w221XLNVK9zQ3UXHn76tY7TqXRQnYrQKaeTuDqk5a0LXAjT7feE1+9ROXElaBvLrKl6E0flhj63+eMfPCnpw2w==","shasum":"bf46f7db1c01e895dd7e6f5479a1d93ec1e91f52","tarball":"https://registry.npmjs.org/@amsom-habitat/request-data-handling/-/request-data-handling-1.0.1.tgz","fileCount":18,"unpackedSize":42706,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIDDDmEPB8XzpqNVJYzB5zgUbcEv2DEXXwvEC8EKdYFFgAiEAyT+4EK3tV6D5nIewlBv/qATlRh8UacC2NpePLAS7LNQ="}]},"_npmUser":{"name":"amsom-habitat","email":"dev@amsom-habitat.fr"},"directories":{},"maintainers":[{"name":"amsom-habitat","email":"dev@amsom-habitat.fr"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/request-data-handling_1.0.1_1788443259097_0.4592389256073255"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-03T13:47:38.798Z","1.0.1":"2026-09-03T13:47:39.240Z","modified":"2026-09-03T13:47:39.583Z"},"maintainers":[{"name":"amsom-habitat","email":"dev@amsom-habitat.fr"}],"description":"Normalisation des données échangées avec Oracle : mise en forme des paramètres envoyés aux fonctions stockées, et typage des lignes lues (portage Node du package PHP amsom-habitat/request-data-handling).","homepage":"https://gitlab.com/amsom-package/request-data-handling-node#readme","keywords":["oracle","normalisation","camelcase","amsom"],"repository":{"type":"git","url":"git+https://gitlab.com/amsom-package/request-data-handling-node.git","directory":"package_src"},"author":{"name":"Amsom Habitat"},"bugs":{"url":"https://gitlab.com/amsom-package/request-data-handling-node/issues"},"license":"UNLICENSED","readme":"# @amsom-habitat/request-data-handling\n\nNormalisation des données échangées avec **Oracle** : mise en forme des valeurs envoyées aux fonctions\nstockées, typage des valeurs lues, passage d'une ligne Oracle à un objet JSON.\n\nPortage Node du package Composer [`amsom-habitat/request-data-handling`](https://gitlab.com/amsom-package/requestdatahandling),\nélargi à la lecture. La raison d'être n°1 de l'original — doubler les quotes (`'` → `''`) avant de\nconcaténer la valeur dans une requête SQL — **disparaît côté Node** : les pilotes passent les valeurs en\n*bind variables*. Ce qui reste utile, ce sont les conversions de forme, plus le typage des colonnes en\nsortie, que le package couvre désormais aussi.\n\n**Zéro dépendance runtime** : ni driver, ni framework.\n\n## Installation\n\n```sh\nnpm install @amsom-habitat/request-data-handling\n```\n\n## Utilisation\n\n### Vers Oracle — mise en forme des paramètres\n\n```ts\nimport { oracleValue, toOracleJson } from '@amsom-habitat/request-data-handling'\n\nawait oracle.callFunction('AH_CALLY_SOLLICITATION_CREER', [\n  dto.idIndividu,\n  oracleValue(dto.motif, 'upper'),   // 'abe1' → 'ABE1'\n  toOracleJson(dto.pieces),          // [] → null, sinon chaîne JSON\n])\n```\n\n| Fonction | Effet |\n|---|---|\n| `toOracleJson(value)` | encode en JSON ; **un tableau vide devient `null`** |\n| `oracleValue(value, directive?)` | applique `'json'`, `'upper'` ou `'lower'` ; sans directive, rend la valeur telle quelle |\n| `toOracleScalar(value)` | booléen → `1`/`0` (Oracle SQL n'a pas de booléen), `undefined` → `null` |\n\n### Depuis Oracle — typage des valeurs lues\n\n```ts\nimport { toBool, toFloat, toJson, FORMAT_DATE_ORACLE } from '@amsom-habitat/request-data-handling'\n\nconst rows = await db('AHVWS_CALLY_CONTRAT')\n  .select('ID', 'EST_ACTIF', 'SOLDE')\n  .select(db.raw(`TO_CHAR(DATE_DEBUT, '${FORMAT_DATE_ORACLE}') AS DATE_DEBUT`))\n\ntoBool(rows[0].EST_ACTIF)  // 1 | '1' → true, null → null, 'O' → null\ntoFloat('1.234,56')        // 1234.56\ntoJson('[{\"id\":1}]')       // [{ id: 1 }] — jamais d'exception, null si illisible\n```\n\n| Fonction | Effet |\n|---|---|\n| `toFloat(v)` | nombre au format français (`\"1.234,56\"` → `1234.56`) |\n| `toBool(v)` | `NUMBER(1)` ou `VARCHAR2` 0/1 → `boolean \\| null` |\n| `toInt(v)` | sémantique `(int)` de **PHP** : `\"12abc\"` → `12`, `\"abc\"` → `0`, jamais `NaN` |\n| `toStringOrNumber(v)` | type Doctrine `string_or_integer` : nombre si numérique, chaîne sinon |\n| `toJson(v)` | décode une colonne texte/CLOB JSON, `null` si absente ou illisible |\n| `removeAccents(s)` | retire les diacritiques côté JS |\n| `oracleUnaccent(champ)` | génère le `TRANSLATE(…)` SQL équivalent d'`UNACCENT` |\n| `FORMAT_DATE_ORACLE` | `'DD/MM/RR'`, à passer à `TO_CHAR` pour retrouver le format `oci8` |\n\n### Ligne Oracle → objet JSON\n\n```ts\nimport { mapRows, type ViewSchema } from '@amsom-habitat/request-data-handling'\n\nconst SCHEMA: ViewSchema = {\n  booleans: ['EST_ACTIF'],\n  json: ['ROLE_FILTRES_WRITE'],\n  decimals: ['SOLDE'],\n}\n\nmapRows(rows, SCHEMA)\n// [{ id: 1, estActif: true, roleFiltresWrite: ['ROLE_A'], solde: -331.5 }]\n```\n\n| Fonction | Effet |\n|---|---|\n| `toCamel(row, schema?)` | `ID_CONTRAT` → `idContrat`, typage optionnel par `ViewSchema` |\n| `mapRows(rows, schema?)` | `toCamel` sur chaque ligne, puis `dedupById` |\n| `toCles(row, cles, schema?)` | table **ordonnée** colonne → clé JSON, quand la camelisation ne tombe pas juste |\n| `mapRowsCles(rows, cles, schema?)` | pendant de `mapRows` pour `toCles` |\n| `dedupById(rows)` | garde la 1re occurrence par `id`, seulement si toutes les lignes en ont un |\n| `omitNullJson(row, champs)` | **omet** la clé quand la colonne JSON est nulle (au lieu de rendre `null`) |\n\n`ViewSchema` décrit le type attendu des colonnes, par **nom Oracle brut** (avant camelisation) :\n\n```ts\ninterface ViewSchema {\n  booleans?: readonly string[]        // NUMBER(1) ou '0'/'1' → boolean\n  json?: readonly string[]            // texte/CLOB JSON → objet | tableau\n  decimals?: readonly string[]        // montants → number\n  stringOrNumbers?: readonly string[] // nombre si numérique, chaîne sinon\n  strings?: readonly string[]         // forcé en chaîne\n  integers?: readonly string[]        // entiers, sémantique (int) de PHP\n}\n```\n\nLe schéma est **passé en paramètre**, jamais lu dans un catalogue interne : le package ne connaît aucune\nvue métier, c'est l'application qui déclare les siennes.\n\n### Pourquoi ces conversions imitent PHP\n\n`toInt` et `toStringOrNumber` rejouent volontairement la sémantique des types Doctrine des API Symfony\nqu'elles remplacent. C'est ce qui permet à une réécriture Node de rendre **exactement** le même JSON qu'une\nv1 encore en production — y compris ses bizarreries (`\"12abc\"` vaut 12).\n\n## API publique\n\nTout est exporté depuis la racine du package ; il n'y a pas de sous-export.\nVoir [`EXAMPLES.ts`](./EXAMPLES.ts) pour un condensé exécutable.\n\n## Développement\n\n```sh\nnpm install\nnpm run build   # tsc → dist/ (CommonJS + .d.ts)\nnpm run lint\nnpm test        # jest\n```\n\nLe package est publié en **CommonJS** : les API NestJS maison sont en CJS, un paquet ESM-only n'y serait\npas importable. La carte `exports` du `package.json` laisse la place à un build ESM ultérieur.\n\n## Versionnage\n\nSemVer, une entrée par version dans [`changelog.md`](./changelog.md) (`## VX.Y.Z - JJ/MM/AAAA`).\n`check-version.sh` refuse une publication dont la version n'est pas décrite dans le changelog, ou qui porte\nun suffixe de pré-release.\n\n```sh\nmake publish        # main : lint + build + test + check-version + tag git + npm publish\nmake alpha_publish  # dev  : publication d'une beta\n```\n","readmeFilename":"README.md","_rev":"1-2ed2345040c67a493632acbdbcf97149"}