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 🙏

© 2026 – Pkg Stats / Ryan Hefner

@zevra/bureau-maj

v0.1.2

Published

Mise à jour automatique des applications de bureau Zevra (Mac, Windows) : contrat de nommage, route du flux, moteur côté app, configuration du build, publication vérifiée.

Downloads

701

Readme

@zevra/bureau-maj

Mise à jour automatique des applications de bureau Zevra (lexform, ZOS, Zevra Admin), Mac et Windows : téléchargée seule, installée au clic, sans jamais re-télécharger un installeur à la main.

Un seul module pour les trois bouts de la chaîne — qui divergeaient par app :

| Morceau | Import | Rôle | |---|---|---| | Contrat | @zevra/bureau-maj | Nommage des fichiers, clés du bucket, liste blanche, adresses. Pur. | | Route | @zevra/bureau-maj/route | GET /api/desktop-maj/<os>/<fichier> sur chaque site : sert le pointeur, redirige les binaires, propose l'installeur. | | Moteur | @zevra/bureau-maj/moteur | Autour d'electron-updater dans la coquille : télécharge seul, n'installe qu'au clic, survit aux pannes passagères. | | Signature Windows | @zevra/bureau-maj/signature-windows | Vérification Authenticode stricte (celle d'electron-updater échoue ouverte). | | Construction | @zevra/bureau-maj/construction | Les morceaux de configuration electron-builder : cibles, artifactName, publish, droit au flux. | | Publication | zevra-bureau-maj (CLI) | Publier sur dev, promouvoir en prod, repointer, retirer. Pointeur écrit en dernier. |

Où vivent les fichiers

Bucket OVH Object Storage zevra-telechargements (EU-WEST-PAR), privé, chaque objet en lecture publique (OVH n'a pas de politique de bucket ; une liste publique dirait tout ce qu'on a publié). Un utilisateur S3 par (app, env), borné à <app>/<env>/*, sans droit d'effacer.

<app>/<env>/maj/versions/<v>/<Prefixe>-<v>-mac-arm64.zip (+ .blockmap)   immuable une fois scellée
<app>/<env>/maj/versions/<v>/<Prefixe>-<v>-mac-arm64.dmg
<app>/<env>/maj/versions/<v>/<Prefixe>-<v>-windows-x64.exe (+ .blockmap)
<app>/<env>/maj/versions/<v>/latest-mac.yml, latest.yml, manifeste.json      le SCEAU
<app>/<env>/maj/mac/latest-mac.yml                                            POINTEUR
<app>/<env>/maj/windows/latest.yml                                            POINTEUR

Les apps installées ne connaissent que le site (https://<app>/api/desktop-maj/<os>/), jamais le bucket : on peut changer d'hébergeur sans toucher au parc.

Brancher une app

  1. La définition, une fois, dans l'app (desktop/bureau-maj.config.mjs) — une DONNÉE brute, sans import, pour que la CI la lise sans installer le dépôt :
    export default { nom: 'lexform', prefixeFichier: 'lexform', archsMac: ['arm64', 'x64'], windows: true }
    La route et le build l'enveloppent dans definirApp(...) (qui valide) ; la CLI le fait seule.
  2. La route (Next) : src/app/api/desktop-maj/[os]/[fichier]/route.ts
    import { creerRouteMaj } from '@zevra/bureau-maj/route'
    import app from '../../../../../../desktop/bureau-maj.config.mjs'
    const route = creerRouteMaj(app, { env: estProd() ? 'prod' : 'dev' })
    export const dynamic = 'force-dynamic'
    export async function GET(req: Request, ctx: { params: Promise<{ os: string; fichier: string }> }) {
      return route(req, await ctx.params)
    }
    L'environnement est celui du site : un pod de prod ne sert que ce qui a été promu.
  3. Le build : fusionner configurationMiseAJour(app, origineMaj(env, …), etatMaj(app, env, …)) dans la configuration electron-builder. Pas de notarisation ⇒ pas de flux Mac ; pas de signature ou pas de DN ⇒ pas de flux Windows.
  4. La coquille : creerMoteur({ app, plateforme: plateformeMac(), origine, charger: () => require('electron-updater').autoUpdater, surAction, surIncident }). Appeler verifier() au lancement puis toutes les heures ; installer() après le clic et la boîte de confirmation de l'app. Sous Windows, passer verifierSignature: verifierSignatureStricte. Brancher la veille : suivreVeille(moteur, powerMonitor). Sans elle, un Mac capot fermé lance des vérifications pendant ses micro-réveils (Power Nap), qui échouent et remontent de faux incidents « reseau » (bureau-maj#1).
  5. La CI : secrets MAJ_S3_ACCESS_KEY_DEV / MAJ_S3_SECRET_KEY_DEV (dépôt) et _PROD (environnement production), puis :
    zevra-bureau-maj --config desktop/bureau-maj.config.mjs --verifier --dossier <sortie> --version X.Y.Z
    zevra-bureau-maj --config … --env dev --version X.Y.Z --dossier <sortie>        # sur un tag desktop-vX.Y.Z
    zevra-bureau-maj --config … --env prod --promouvoir --version X.Y.Z             # geste explicite
    zevra-bureau-maj --config … --env prod --repointer --version X.Y.Z [--os mac]   # arrêter une diffusion
    zevra-bureau-maj --config … --env prod --retirer --os windows                   # arrêter sans version de repli

Ce qui est tenu par les tests (pnpm test)

  • la liste blanche refuse une autre app, une autre architecture, une traversée ;
  • la route ne sert que l'environnement du site, jamais en cache, 404 ≠ 503 ;
  • le moteur télécharge seul, n'installe jamais sans installer(), lit un pointeur absent comme « rien », survit à hors-ligne / 5xx / 429 avec recul, ne rend la main qu'après trois téléchargements ratés, ne vérifie pas pendant la veille et ne compte pas une demande coupée par elle, relit le pointeur avant d'installer et renonce si la diffusion a été arrêtée ;
  • la publication écrit les pointeurs en dernier, chaque objet en public-read, refuse de réécrire une version scellée et de faire reculer un pointeur, reprend une version coupée en route, refuse de repointer en laissant un système servi, et sait retirer un système par la sentinelle 0.0.0 ;
  • la vérification Authenticode refuse tout ce qui n'est pas une preuve.

Tests en français, un commentaire quand le cas n'est pas évident.