Skip to content

Commit

Permalink
Merge pull request #2 from incubateur-ademe/fix-template-details
Browse files Browse the repository at this point in the history
Fix template details
  • Loading branch information
EmileRolley authored Oct 3, 2023
2 parents 8690036 + fd7a8ba commit e4bc635
Show file tree
Hide file tree
Showing 11 changed files with 159 additions and 267 deletions.
2 changes: 2 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
singleQuote: false
semi: false
54 changes: 29 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ Template dépôt GitHub pour créer un paquet Publicodes.
## Fonctionnalités

- 📦 compilation des règles publicodes en un seul fichier JSON grâce à
[`@incubateur-ademe/publicodes-tools`](https://github.com/incubateur-ademe/publicodes-tools)
[`@incubateur-ademe/publicodes-tools`](https://github.com/incubateur-ademe/publicodes-tools)
- 📖 documentation du modèle interactive disponible sur GitHub Pages grâce à
[`@publicodes/react-ui`](https://publi.codes/docs/api/react-ui)
[`@publicodes/react-ui`](https://publi.codes/docs/api/react-ui)
- 🚀 API REST pour utiliser le modèle dans une application grâce à
[`@publicodes/api`](https://publi.codes/docs/api/api-rest)
[`@publicodes/api`](https://publi.codes/docs/api/api-rest)

## Initialisation

Expand All @@ -34,53 +34,57 @@ projet :
- `%PACKAGE_NAME%` : nom du paquet npm / nom du repository GitHub
- `%GITHUB_USER%` : nom d'utilisateur GitHub / organisation GitHub

Pour garantir une utilisation de la documentation sans erreur :

- `%DEFAULT_RULE%` : nom de la règle à afficher par défaut dans la documentation en ligne

Pour utiliser les fonctionnalités de la CI :

1. Il faut décommenter les fichiers `./github/workflows/*.yaml`
2. Ajouter les variables suivantes dans les secrets du repository GitHub :
- `NPM_TOKEN` : token NPM pour publier le paquet sur [npmjs.com](https://npmjs.com)
- `PAT` : Personal Access Token pour publier la documentation sur GitHub Pages
![Screenshot from 2023-09-12 12-02-40](https://github.com/incubateur-ademe/publicodes-model-template/assets/44124798/a6fe53cc-5766-4541-8936-41d474ed0069)
3. Aller dans les paramètres du repository GitHub et :
- modifier les droits des worflows
![image](https://github.com/incubateur-ademe/publicodes-model-template/assets/44124798/cd7e37f9-0641-44f2-b968-79faa778b832)
- sélectionner la branche `gh-pages` dans les paramètres du repository
![image](https://github.com/incubateur-ademe/publicodes-model-template/assets/44124798/77191750-12f1-4ab4-94a4-7447f1b77624)

2. Ajouter les variables suivantes dans les secrets du repository GitHub : - `NPM_TOKEN` : token NPM pour publier le paquet sur [npmjs.com](https://npmjs.com) - `PAT` : Personal Access Token pour publier la documentation sur GitHub Pages
![Screenshot from 2023-09-12 12-02-40](https://github.com/incubateur-ademe/publicodes-model-template/assets/44124798/a6fe53cc-5766-4541-8936-41d474ed0069)
3. Aller dans les paramètres du repository GitHub et : - modifier les droits des worflows
![image](https://github.com/incubateur-ademe/publicodes-model-template/assets/44124798/cd7e37f9-0641-44f2-b968-79faa778b832) - sélectionner la branche `gh-pages` dans les paramètres du repository
![image](https://github.com/incubateur-ademe/publicodes-model-template/assets/44124798/77191750-12f1-4ab4-94a4-7447f1b77624)

## Exemples de dépôts utilisant ce template

- [`@incubateur-ademe/publicodes-commun`](https://github.com/incubateur-ademe/publicodes-commun) -
_Ensemble de règles communes utilisées pour l'implémentation des modèles Publicodes de l'incubateur_
_Ensemble de règles communes utilisées pour l'implémentation des modèles Publicodes de l'incubateur_
- [`@incubateur-ademe/publicodes-negaoctet`](https://github.com/incubateur-ademe/publicodes-negaoctet) -
_Modèle Publicodes pour la base de données NegaOctet_
_Modèle Publicodes pour la base de données NegaOctet_
- [`@incubateur-ademe/publicodes-impact-livraison`](https://github.com/incubateur-ademe/publicodes-negaoctet) -
_Modèle [Publicodes](https://publi.codes) pour le simulateur [Impact Livraison](https://impactco2.fr/livraison)_

## Usage
## Usage

Ajouter le paquet à vos dépendances :

Ajouter le paquet à vos dépendances :
```
bun add %PACKAGE_NAME%
```

Instancier un nouveau moteur Publicode :

```typescript
import Engine from 'publicodes'
import rules from '%PACKAGE_NAME%'
import Engine from "publicodes"
import rules from "%PACKAGE_NAME%"

const engine = new Engine(rules)

engine.evaluate('tablette . consommation en mode actif')
engine.evaluate("tablette . consommation en mode actif")
```

Utiliser certaines règles dans un autre modèle publicodes :

```yaml
importer!:
depuis:
nom: %PACKAGE_NAME%
nom: %PACKAGE_NAME%
url: https://github.com/%GITHUB_USER%/%PACKAGE_NAME%
dans: modèle numérique
les règles:
- numérique . internet . consommation horaire
- numérique . internet . consommation horaire
- ordinateur portable . construction
```
Expand All @@ -92,7 +96,7 @@ importer!:
> [`rules/`](https://github.com/%GITHUB_USER%/%PACKAGE_NAME%/tree/main/rules).

Pour installer les dépendances et compiler tous les fichiers `.publicodes` en
un seul fichier JSON, il suffit d'exécuter la commande suivante :
un seul fichier JSON, il suffit d'exécuter la commande suivante :

```
bun && bun run build
Expand All @@ -109,7 +113,7 @@ modèle, il suffit d'exécuter la commande suivante :
```
bun i --cwd doc
bun run doc
bun run doc:start
```

#### Lancer l'API
Expand All @@ -118,7 +122,7 @@ bun run doc
> [`api/`](https://github.com/%GITHUB_USER%/%PACKAGE_NAME%/tree/main/api).

Pour lancer le serveur Node permettant d'utiliser l'API REST, il faut utiliser les commandes
suivantes :
suivantes :

```
bun run api
Expand Down
40 changes: 20 additions & 20 deletions build.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,47 @@
import { writeFileSync } from "fs";
import { getModelFromSource } from "@incubateur-ademe/publicodes-tools/compilation";
import { disabledLogger } from "@incubateur-ademe/publicodes-tools";
import Engine from "publicodes";
import { writeFileSync } from "fs"
import { getModelFromSource } from "@incubateur-ademe/publicodes-tools/compilation"
import { disabledLogger } from "@incubateur-ademe/publicodes-tools"
import Engine from "publicodes"

const srcFiles = "rules/**/*.publicodes";
const destPath = "%PACKAGE_NAME%.model.json";
const srcFiles = "rules/**/*.publicodes"
const destPath = "%PACKAGE_NAME%.model.json"

const model = getModelFromSource(srcFiles, { verbose: true });
const model = getModelFromSource(srcFiles, { verbose: true })

try {
new Engine(model, { logger: disabledLogger });
new Engine(model, { logger: disabledLogger })
} catch (e) {
console.error(`❌ Model compilation failed:\n${e.message}\n`);
process.exit(-1);
console.error(`❌ Model compilation failed:\n${e.message}\n`)
process.exit(-1)
}

writeFileSync(destPath, JSON.stringify(model, null, 2));
console.log(`✅ ${destPath} generated`);
writeFileSync(destPath, JSON.stringify(model, null, 2))
console.log(`✅ ${destPath} generated`)

writeFileSync(
"index.js",
`
import rules from "./${destPath}";
export default rules;
`,
);
console.log(`✅ index.js generated`);
`
)
console.log(`✅ index.js generated`)

let indexDTypes = Object.keys(model).reduce(
(acc, dottedName) => acc + `| "${dottedName}"\n`,
`
import { Rule } from "publicodes";
export type DottedName =
`,
);
`
)

indexDTypes += `
declare let rules: Record<DottedName, Rule>
export default rules;
`;
`

writeFileSync("index.d.ts", indexDTypes);
console.log(`✅ index.d.ts generated`);
writeFileSync("index.d.ts", indexDTypes)
console.log(`✅ index.d.ts generated`)
37 changes: 23 additions & 14 deletions doc/public/404.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta charset="utf-8" />
<title>Single Page Apps for GitHub Pages</title>
<script type="text/javascript">
// Single Page Apps for GitHub Pages
Expand All @@ -22,20 +22,29 @@
// https://username.github.io/repo-name/one/two?a=b&c=d#qwe becomes
// https://username.github.io/repo-name/?/one/two&a=b~and~c=d#qwe
// Otherwise, leave pathSegmentsToKeep as 0.
var pathSegmentsToKeep = 1;


var l = window.location;
l.replace(
l.protocol + '//' + l.hostname + (l.port ? ':' + l.port : '') +
l.pathname.split('/').slice(0, 1 + pathSegmentsToKeep).join('/') + '/?/' +
l.pathname.slice(1).split('/').slice(pathSegmentsToKeep).join('/').replace(/&/g, '~and~') +
(l.search ? '&' + l.search.slice(1).replace(/&/g, '~and~') : '') +
l.hash
);
var pathSegmentsToKeep = 1

var l = window.location
l.replace(
l.protocol +
"//" +
l.hostname +
(l.port ? ":" + l.port : "") +
l.pathname
.split("/")
.slice(0, 1 + pathSegmentsToKeep)
.join("/") +
"/?/" +
l.pathname
.slice(1)
.split("/")
.slice(pathSegmentsToKeep)
.join("/")
.replace(/&/g, "~and~") +
(l.search ? "&" + l.search.slice(1).replace(/&/g, "~and~") : "") +
l.hash
)
</script>
</head>
<body>
</body>
<body></body>
</html>
32 changes: 20 additions & 12 deletions doc/public/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Documentation for the publicodes modèle : Numérique"
content="Documentation for the publicodes modèle : %PACKAGE_NAME%"
/>
<!-- Start Single Page Apps for GitHub Pages -->
<!-- Start Single Page Apps for GitHub Pages -->
<script type="text/javascript">
// Single Page Apps for GitHub Pages
// MIT License
Expand All @@ -20,15 +20,23 @@
// When the single page app is loaded further down in this file,
// the correct url will be waiting in the browser's history for
// the single page app to route accordingly.
(function(l) {
if (l.search[1] === '/' ) {
var decoded = l.search.slice(1).split('&').map(function(s) {
return s.replace(/~and~/g, '&')
}).join('?');
window.history.replaceState(null, null,
l.pathname.slice(0, -1) + decoded + l.hash
);
}(window.location)})
;(function (l) {
if (l.search[1] === "/") {
var decoded = l.search
.slice(1)
.split("&")
.map(function (s) {
return s.replace(/~and~/g, "&")
})
.join("?")
window.history.replaceState(
null,
null,
l.pathname.slice(0, -1) + decoded + l.hash
)
}
window.location
})
</script>
<!--
Notice the use of %PUBLIC_URL% in the tags above.
Expand All @@ -39,7 +47,7 @@
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Modèle Numérique - Documentation</title>
<title>Modèle %PACKAGE_NAME% - Documentation</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
Expand Down
9 changes: 4 additions & 5 deletions doc/src/App.css
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
* {
--textColor: #2975d1;
--darkerColor: #333350;
--textColor: #2975d1;
--darkerColor: #333350;
}

.App {
Expand All @@ -19,8 +19,7 @@ header {

background: linear-gradient(60deg, var(--darkColor) 0%, var(--color) 100%);
padding: 0.6rem 1rem;
box-shadow:
0 1px 3px rgba(var(--rgbColor), 0.12),
box-shadow: 0 1px 3px rgba(var(--rgbColor), 0.12),
0 1px 2px rgba(var(--rgbColor), 0.24);
border-radius: 0.4rem;
}
Expand Down Expand Up @@ -54,7 +53,7 @@ small {
background: none;
}

li &.active .content {
li &.active .content {
background-color: transparent;
}

Expand Down
30 changes: 15 additions & 15 deletions doc/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
import Engine from "publicodes";
import "./App.css";
import { RulePage } from "publicodes-react";
import { Link, Route, Routes, useParams } from "react-router-dom";
import { ComponentProps, useRef } from "react";
import ReactMardown from "react-markdown";
import Engine from "publicodes"
import "./App.css"
import { RulePage } from "publicodes-react"
import { Link, Route, Routes, useParams } from "react-router-dom"
import { ComponentProps, useRef } from "react"
import ReactMardown from "react-markdown"

import model from "./%PACKAGE_NAME%.model.json";
import model from "./%PACKAGE_NAME%.model.json"

const engine = new Engine(model as {});
const engine = new Engine(model as {})

const baseUrl = process.env.NODE_ENV === "development" ? "" : "/%PACKAGE_NAME%";
const baseUrl = process.env.NODE_ENV === "development" ? "" : "/%PACKAGE_NAME%"

const defaultRule = "intensité électricité";
const defaultRule = "%DEFAULT_RULE%"

function Documentation() {
const url = useParams()["*"];
const url = useParams()["*"]
const { current: renderers } = useRef({
Link,
Text: ({ children }) => <ReactMardown children={children} />,
} as ComponentProps<typeof RulePage>["renderers"]);
} as ComponentProps<typeof RulePage>["renderers"])

return (
<div>
Expand All @@ -31,7 +31,7 @@ function Documentation() {
npmPackage="%PACKAGE_NAME%"
/>
</div>
);
)
}

function Landing() {
Expand All @@ -46,7 +46,7 @@ function Landing() {
</li>
</ul>
</div>
);
)
}

export default function App() {
Expand All @@ -57,5 +57,5 @@ export default function App() {
<Route path={`${baseUrl}/doc/*`} element={<Documentation />} />
</Routes>
</div>
);
)
}
Loading

0 comments on commit e4bc635

Please sign in to comment.