Table des matières

µcBlockly — noyau (KERNEL)

Ce document décrit la surface publique du noyau embeddable et ce qui reste interne / démo. Complète ARCHITECTURE.md (vue contributeur) et INTEGRATION_DEPOT.md (intégration dans un autre dépôt).

1. Pile à trois niveaux

flowchart TB
  subgraph L1["Niveau 1 — Blockly"]
    B[Blockly 13 + plugins @blockly]
  end
  subgraph L2["Niveau 2 — µcBlockly noyau"]
    K[src/core/ · blocs · générateur Arduino]
  end
  subgraph L3["Niveau 3 — produits dérivés"]
    D[demo · BlocklyDuino · intégrations custom]
  end
  B --> K
  K --> D
Niveau Rôle Exemple
Blockly Moteur visuel générique workspace, toolbox, sérialisation
µcBlockly (noyau) Blocs Arduino typés, générateur C++, API embed createUcBlockly()
Produit dérivé UI métier, cartes, déploiement démo µcBlockly, BlocklyDuino

Le noyau ne doit pas embarquer Monaco, la topbar démo, ni les getElementById du shell.

2. Surface publique (''µcBlockly'' / ''µcBlockly/core'')

Point d’entrée TypeScript : src/core/index.tsbuild/src/core/index.js.

API principale

Export Description
createUcBlockly(container, options) Injecte Blockly + générateur dans un conteneur DOM
registerUcBlocklyKernel(options?) Enregistrement idempotent des blocs / types (appelé par createUcBlockly)
applyUcBlocklyLocale(language) Locale Blockly + messages µcBlockly
sanitizeSerializedWorkspaceState(state) Nettoie les coordonnées NaN avant load/save

Types

Type Usage
UcBlocklyOptions toolbox, language, theme, media, enforcers, plugins, onCodeChange, …
UcBlocklyInstance workspace, getCode(), saveWorkspace(), loadWorkspace(), resize(), dispose()
UcBlocklyEnforcerOptions strictTypes, programStructure, strictConnectionChecker
UcBlocklyPluginOptions backpack, minimap, workspaceSearch, …
UcBlocklyWorkspaceManagerOptions Config avancée (lifecycle sans shell)

Classes avancées (embed / produits)

Export Description
UcBlocklyWorkspaceManager Cycle de vie workspace (reboot, plugins, persistence) sans DOM démo
UcBlocklyPluginHost Init / dispose des plugins Blockly configurables
DEFAULT_UCBLOCKLY_* / resolve*Options() Valeurs par défaut enforceurs & plugins

Réexports utiles

Export Source
arduinoGenerator Génération C++
basic_toolbox, getToolboxForCurrentBoard, getToolboxWithoutBoardCategory Toolbox JSON
ToolboxConfiguration Type toolbox

Pour les aides produit / coque (thème UI, langues DOM, a11y, cartes) : importer µcBlockly/host plutôt que le noyau.

Exemple minimal

import { createUcBlockly, basic_toolbox } from "µcBlockly/core";
 
const editor = createUcBlockly(document.getElementById("editor")!, {
  toolbox: basic_toolbox,
  language: "fr",
  enforcers: { strictTypes: true, programStructure: true },
  plugins: { minimap: false, workspaceSearch: true },
  onCodeChange: (code) => console.log(code),
});

3. Surface interne (ne pas importer depuis un produit dérivé)

Zone Fichiers Pourquoi interne
Shell démo src/demo/blockly_application_shell.ts, src/index.ts Menus HTML, Monaco, URL, sessionStorage
Compat re-export src/blockly_application_type.ts Alias vers le shell démo
Éditeur Monaco src/code_editor.ts ~3 Mo, panel C++ de la démo
Layout flex src/workspace_flex.ts, src/workspace_layout_utils.ts, src/workspace_resize.ts Panneaux redimensionnables démo
A11y coque src/shell_a11y.ts, src/a11y_labels.ts HTML public/index.html
Thème UI coque src/ui_palette_theme.ts Sync CSS topbar ↔ thème Blockly
Debug démo src/block_debug_context_menu.ts Menu contextuel développeur

Ces modules peuvent être importés dans le dépôt µcBlockly pour la démo ; un produit tiers doit s’appuyer sur ./core uniquement.

4. Noyau vs démo — dépendances

src/core/
  create_ucblockly.ts      ← API embed
  register.ts              ← blocs / registry
  locale.ts                ← i18n noyau
  ucblockly_workspace_manager.ts
  ucblockly_plugins.ts
  default_options.ts

src/categories/blockly/    ← définitions de blocs (public implicite via kernel)
src/generators/arduino/    ← générateur (public via arduinoGenerator)
src/toolbox.ts             ← toolbox JSON
src/languages/             ← messages
src/boards.ts              ← profils cartes

src/demo/                  ← INTERNe (exemple embed + shell)
src/index.ts               ← INTERNe (webpack main)

5. Builds

Script Produit Contenu
npm run build:core build/src/core/ (+ deps compilées) Lib TypeScript noyau — sans index.ts, sans Monaco
npm run build:core:bundle dist/core/ Page embed statique — JS + index.html + media/, sans Monaco
npm run build:demo dist/bundle/ Démo complète — Monaco + public/index.html
npm run build les deux build:demo puis build:core:bundle
npm run build:lib build/ Compile tout src/ (dev local, inclut démo)
npm run dev build/ (dev server) Démo hot-reload
npm run dev:embed dist/core/ (port 8081) Exemple embed noyau seul

Exports npm (''package.json'')

Chemin Cible
“.” / “./core” build/src/core/index.jsnoyau
“./host” build/src/host/index.js — aides produit (thèmes, a11y, Monaco)
“./demo” build/src/index.js — point d’entrée démo (Monaco, shell)

Artefact navigateur embed : servir le dossier dist/core/ (pas dist/bundle/).

6. Options configurables (rappel)

Voir src/core/types.ts et src/core/default_options.ts.

Enforceurs (défauts : strictTypes ✓, programStructure ✓, strictConnectionChecker ✗) :

enforcers: {
  strictTypes: true,
  programStructure: true,
  strictConnectionChecker: false,
}

Plugins workspace (via UcBlocklyPluginHost / plugins dans createUcBlockly) :

plugins: {
  backpack: true,
  minimap: true,
  workspaceSearch: true,
  contentHighlight: false,
  // …
}

Toolbox : obligatoire dans UcBlocklyOptions.toolbox ; utiliser basic_toolbox ou une variante filtrée (getToolboxWithoutBoardCategory, etc.).

7. Évolutions prévues (roadmap)

Priorité Sujet État
P0 createUcBlockly(container)
P0 Séparer demo / export npm
P1 Workspace vs shell
P1 Options plugins / enforceurs
P2 Build core sans Monaco ✅ (build:core, dist/core/)
P2 Ce document KERNEL.md
P3 Publication npm (private: false, exports) À faire

8. Liens