diff --git a/package-lock.json b/package-lock.json index bac5a1ae1b1ee398e3ab5e2ca13ef484cdea2e35..382b9d62d8d9c2efe6672cda64d4adf02c289847 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,111 +1,17 @@ { - "name": "epoc-types", - "version": "1.0.0", + "name": "@epoc/epoc-types", + "version": "2.0.0-beta.8", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "epoc-types", - "version": "1.0.0", + "name": "@epoc/epoc-types", + "version": "2.0.0-beta.8", "license": "CeCILL-B", "devDependencies": { - "typedoc": "^0.23.25", "typescript": "^4.9.5" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "node_modules/marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/typedoc": { - "version": "0.23.25", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.25.tgz", - "integrity": "sha512-O1he153qVyoCgJYSvIyY3bPP1wAJTegZfa6tL3APinSZhJOf8CSd8F/21M6ex8pUY/fuY6n0jAsT4fIuMGA6sA==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^6.1.6", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" - }, - "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x" - } - }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -118,110 +24,14 @@ "engines": { "node": ">=4.2.0" } - }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true } }, "dependencies": { - "ansi-sequence-parser": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, - "marked": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.12.tgz", - "integrity": "sha512-yr8hSKa3Fv4D3jdZmtMMPghgVt6TWbk86WQaWhDloQjRSQhMMYCAro7jP7VDJrjjdV8pxVxMssXS8B8Y5DZ5aw==", - "dev": true - }, - "minimatch": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz", - "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", - "dev": true, - "requires": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "typedoc": { - "version": "0.23.25", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.25.tgz", - "integrity": "sha512-O1he153qVyoCgJYSvIyY3bPP1wAJTegZfa6tL3APinSZhJOf8CSd8F/21M6ex8pUY/fuY6n0jAsT4fIuMGA6sA==", - "dev": true, - "requires": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^6.1.6", - "shiki": "^0.14.1" - } - }, "typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true - }, - "vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true } } } diff --git a/package.json b/package.json index f8c8777a3d718ed185fb76be6018161c7624e495..838943c6c457e3488b85faa32171a273e9d15eda 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@epoc/epoc-types", - "version": "2.0.0-beta.8", + "version": "2.0.0-beta.9", "description": "ePoc (Electronic Pocket Open Course) types specifications", "main": "dist/index.ts", "types": "dist/index.d.ts", diff --git a/src/v1/badge.ts b/src/v1/badge.ts new file mode 100644 index 0000000000000000000000000000000000000000..6cd55ea49519fc8e0939c0b5e27174527129e8d0 --- /dev/null +++ b/src/v1/badge.ts @@ -0,0 +1,10 @@ +import {uid} from './types'; +import {Rule} from './rule'; + +export interface Badge { + id?: uid; + title: string; + description: string; + icon: string; + rule: Rule +} \ No newline at end of file diff --git a/src/v1/epoc.ts b/src/v1/epoc.ts index e9976662b99f05466d2d3bd1cab07062ffd4525f..c8f6790342d6cd85edb7c0c0ec2126f7f84c7671 100644 --- a/src/v1/epoc.ts +++ b/src/v1/epoc.ts @@ -2,6 +2,7 @@ import {Author} from './author'; import {Content} from './content'; import {html, uid} from './types'; import {Question} from './question'; +import {Badge} from './badge'; export interface EpocMetadata { lastModif : string; @@ -26,12 +27,14 @@ export interface EpocMetadata { } export interface Epoc extends EpocMetadata { + certificateBadgeCount: number; certificateScore: number; parameters: Parameters; plugins: string[]; contents: Record<uid, Content>; chapters: Record<uid, Chapter>; questions: Record<uid, Question>; + badges: Record<uid, Badge>; } export interface Chapter { diff --git a/src/v1/rule.ts b/src/v1/rule.ts new file mode 100644 index 0000000000000000000000000000000000000000..fca5b7f10f6d236ddf46dc8d2ff5bcc3b426d9b8 --- /dev/null +++ b/src/v1/rule.ts @@ -0,0 +1,8 @@ +// Types to represents jsonlogic rules https://jsonlogic.com/ +export type Operators = "var" | ">" | ">=" | "<" | "<=" | "===" | "!==" | "and" | "or"; +export type Operand = number | string | boolean | Rule; +export type Operands = string | [Operand, Operand, ...Operand[]]; // minimum 2 operands or a value if operator is var + +export type Rule = { + [key in Operators]?: Operands; +}; diff --git a/src/v2/achievement.ts b/src/v2/achievement.ts deleted file mode 100644 index c8884593a4458e05a417ce109f0cb201ba1bf6eb..0000000000000000000000000000000000000000 --- a/src/v2/achievement.ts +++ /dev/null @@ -1,22 +0,0 @@ -import {uid} from './types'; -import {Rule} from './rule' - -/** -* Describe a pedagogical achievement and conditions to unlock it -*/ -export interface Achievement { - /** - * Achievement unique id - */ - id: uid; - - /** - * Achievement title that will be shown in the course - */ - title: string; - - /** - * The rule to obtain the achievement - */ - rule: Rule -} diff --git a/src/v2/badge.ts b/src/v2/badge.ts new file mode 100644 index 0000000000000000000000000000000000000000..6cd55ea49519fc8e0939c0b5e27174527129e8d0 --- /dev/null +++ b/src/v2/badge.ts @@ -0,0 +1,10 @@ +import {uid} from './types'; +import {Rule} from './rule'; + +export interface Badge { + id?: uid; + title: string; + description: string; + icon: string; + rule: Rule +} \ No newline at end of file diff --git a/src/v2/epoc.ts b/src/v2/epoc.ts index e5e7505c4cc6555bf2095f9645c3ac06d9cc3fb5..776e753639fe8c710fb7721cedfb31e9d7719c1f 100644 --- a/src/v2/epoc.ts +++ b/src/v2/epoc.ts @@ -1,7 +1,7 @@ import {Content} from './content'; import {html, uid, uri, langcode} from './types'; import {Question} from './question'; -import {Achievement} from './achievement'; +import {Badge} from './badge'; /** * Contains all the ePoc metadata that can be retrieved from the library API @@ -136,14 +136,14 @@ export interface Epoc extends EpocMetadata { /** * The score to obtain the certificate - * @deprecated Use pedagogical achievements instead + * @deprecated Use badges instead */ certificateScore?: number; /** - * Map of all contents (id, content) of the ePoc + * Map of all badges (id, badge) of the ePoc */ - achievements: Map<uid, Achievement> + badges: Map<uid, Badge> /** * List of plugins of the ePoc diff --git a/src/v2/index.ts b/src/v2/index.ts index b7fb3c4193e3f61143f92abf588cc6fe74c75733..197d82d883dcf8f586305609bba0a05bf1c430b7 100644 --- a/src/v2/index.ts +++ b/src/v2/index.ts @@ -1,6 +1,6 @@ export * from './epoc' export * from './types' -export * from './achievement' +export * from './badge' export * from './content' export * from './question' export * from './rule' \ No newline at end of file diff --git a/src/v2/question.ts b/src/v2/question.ts index ec40df55716a4fb579d1173034f198a7d3877610..6f4d6600cb7b18a2a47f27d42d5eded3ec3d3117 100644 --- a/src/v2/question.ts +++ b/src/v2/question.ts @@ -11,7 +11,7 @@ export interface Question { /** * The score of this question - * @deprecated Use pedagogical achievements instead + * @deprecated Use badges instead */ score: number;