better docs, ide-tool-utils as ts, es6 and es5
10 files modified
1 files added
5 files renamed
| | |
| | | docs/ |
| | | node_modules/ |
| | | .nyc_output/ |
| | | coverage/ |
| | | coverage/ |
| | | .cache/ |
| | | dist/ |
| | |
| | | Änderungen der API werden hier dokumentiert. |
| | | |
| | | |
| | | ## [Unreleased] |
| | | ## [3.0.0] - 2020-02-05 |
| | | ### Added |
| | | - Dokumentation zu einem Werkzeug kann nun über die Werkzeug-Deklaration verlinkt werden |
| | | ### Changed |
| | | - `./dist/es6/` Ausgabeverzeichnis: Hilfsfunktionen als ES6 JavaScript Dateien zur |
| | | Verwendung in Kombination mit einem Build-System oder modernem Browser. |
| | | - `./dist/lib/` Ausgabeverzeichnis: Hilfsfunktionen als Standalone ES5 Bibliothek |
| | | zur direkten Verwendung als lokale Kopie |
| | | ### Fixed |
| | | - Beim Einbinden dieses npm Pakets stehen Typdefinitionen automatisch in der verwendeten |
| | | Entwicklungsumgebung zur Verfügung |
| | | ### Removed |
| | | |
| | | - `mathcoach-api.d.ts` entfällt. `./src/MathCoach.ts` spezifiziert nun die öffentliche |
| | | MathCoach IDE API. |
| | | |
| | | ## [2.0.1] - 2019-12-21 |
| | | ### Fixed |
| | |
| | | |
| | | # MathCoach IDE API <small>`Version 2.0.1`</small> |
| | | # MathCoach IDE API <small>`Version 3.0.0`</small> |
| | | |
| | | In diesem Paket ([Das Gitblit Repository findet sich hier](https://newton.htwsaar.de/gitblit/summary/mathcoach!mathcoach-ide-api.git)) |
| | | ist die öffentliche Schnittstelle zur MathCoach Entwicklungsumgebung (IDE) definiert. Mithilfe |
| | |
| | | ## Idee |
| | | Grundlegende Idee ist, dass ein externes Werkzeug nahtlos in die MathCoach IDE integriert werden |
| | | kann. Bestimmte Dateien werden anhand ihrer Dateiendung mit dem Werkzeug verknüpft, sodass der |
| | | Benutzer das passende Werkzeug durch einen einfache Klick im Dateie-Explorer starten kann. Diese |
| | | Datei wird im folgenden Kontext-Datei genannt und soll dazu dienen das interene Datenmodell (also |
| | | Benutzer das passende Werkzeug durch einen einfache Klick im Datei-Explorer starten kann. Diese |
| | | Datei wird im folgenden *Kontext-Datei* genannt und soll dazu dienen, das interene Datenmodell (also |
| | | alle Informationen, die der Benutzer im Werkzeug angibt) zu speichern. Das Werkzeug soll das gespeicherte |
| | | Datenmodell zu einem späteren Zeitpunkt wieder laden können. |
| | | |
| | | Ein Werkzeug kann beispielsweise MathCoach-Aufgabe (Groovy-Datei) generieren. Weitere Funktionalitäten |
| | | Ein Werkzeug kann beispielsweise MathCoach-Aufgaben (Groovy-Datei) generieren. Weitere Funktionalitäten |
| | | der IDE - beispielsweise das Starten der generierten Aufgabe in der Aufgaben-Vorschau der IDE - sind |
| | | ebenfalls für den Werkzeugentwickler verfügbar. |
| | | |
| | |
| | | auf `HTML`, `JavaScript` und `CSS` gesetzt werden. Außerdem muss das Werkzeug unter |
| | | der Domain des jeweiligen MathCoach-Servers erreichbar sein. Zur Entwicklungszeit legt man das Werkzeug |
| | | dazu im www-Verzeichnis ab. Die von der IDE bereitgestellte `ide-lib.js` Bibliothek |
| | | muss eingebunden werden. |
| | | muss eingebunden werden. |
| | | |
| | | <script src="/mathcoach/ui/ide/ide-lib.js"/> |
| | | |
| | |
| | | - Sich initialisieren. Es ist sinnvoll, dass das Werkzeug mit einem beispielhaften |
| | | Datenmodell inititalisiert wird. |
| | | - Das interne Datenmodell in die Kontext-Datei schreiben |
| | | - Die zugehörige Aufgabe generieren. Siehe auch `contextFileToExerciseFile` weiter unten. |
| | | - Die zugehörige Aufgabe generieren. Siehe auch `contextFileToExerciseFile` in der [Dokumentation der Hilfsfunktionen](./modules/helpers.html). |
| | | |
| | | Andernfalls kann das zuvor gespeichertes Datenmodell aus der Kontext-Datei in den |
| | | Editor geladen werden. Anschließend sollte die generierten Aufgaben in der Vorschau gestartet werden, sodass der |
| | |
| | | |
| | | |
| | | |
| | | ### Hilfsunktionen für Werkzeug-Entwickler |
| | | ### Hilfsunktionen für Werkzeug-Entwickler (IDE-Tool-Utils) |
| | | |
| | | [Dokumentation der Hilfsfunktionen](./modules/helpers.html) |
| | | |
| | | Dieses Paket beinhaltet zusätzlich Hilfsfunktionen für Werkzeug-Entwickler. Diese sind aktuell |
| | | in `TypeScript` implementiert und können bei Bedarf auch zukünftig als ES6-JavaScript |
| | | bereitgestellt werden. Zum Einbinden der Funktionen wird demzufolge ein Build-System |
| | | vorausgesetzt. Keine der Hilfsfunktionen wird durch die `ide-lib.js` ausgeliefert! |
| | | |
| | | Beispielsweise werden diese wie folgt eingebunden und genutzt: |
| | | |
| | | import { Helpers } from "@mathcoach/ide-api"; |
| | | Helpers.enableOfflineUsageIfNecessary() |
| | | |
| | | Dieses Paket beinhaltet zusätzlich Hilfsfunktionen (auch IDE-Tool-Utils genannt) für |
| | | Werkzeug-Entwickler. Diese sind aktuell in `TypeScript` implementiert, liegen jedoch |
| | | auch als ES6-JavaScript und Standalone-Bibliothek zur direkten Verwendung vor. Keine der |
| | | Hilfsfunktionen wird durch die `ide-lib.js` ausgeliefert! |
| | | |
| | | > **Hinweis**: Hilfunktionen ohne Build-System bereitzustellen gestaltet sich schwierig und |
| | | > bringt große Nachteile mit sich: |
| | | > - Als reine JavaScript-Datei - platziert auf einem Server - ist die die |
| | | > Offline-Fähigkeit (siehe `Helpers.enableOfflineUsageIfNecessary()`) von Werkzeugen nicht |
| | | > gewährleistet. |
| | | > gewährleistet, da eine Internetverbindung zum Zugriff notwendig ist. |
| | | > - Werden Dateien oder Code-Ausschnitte von Hand kopiert, muss der Werkzeug-Entwickler sich |
| | | > um das Aktualisieren kümmern. |
| | | > |
| | | > Ein möglicher Kompromiss wäre die Hilsfunktionen als reine JavaScript-Datei (ES5 oder ES6) |
| | | > bereitzustellen und eine Kopie mit dem Werkezug auszuliefern. Der aktuelle Ansatz bettet |
| | | > Hilfsfunktionen durch den Build-Prozess in das Werkzeug ein. |
| | | > Als Kompromiss werden die Hilsfunktionen als reine JavaScript-Datei (ES5 oder ES6) |
| | | > bereitgestellt, sodass diese auch ohne TypeScript nutzbar sind. |
| | | |
| | | Die IDE-Tool-Utils können wie folgt genutzt werden |
| | | |
| | | #### Build-System mit TypeScript (empfohlen) |
| | | |
| | | Das Paket `@mathcaoch/ide-api` muss als npm-Abhängikeit in der `package.json` des Werkzeugs |
| | | angegeben werden. Fortan können die in TypeScript implementierten Hilfsfunktionen - aber |
| | | auch die Schnittstellen der IDE-API - komfortabel verwendet werden. Eine bestmögliche Typsicherheit ist |
| | | gegeben. |
| | | |
| | | import { Helpers, MathCoach } from "@mathcoach/ide-api"; |
| | | Helpers.enableOfflineUsageIfNecessary() |
| | | ... |
| | | const file:MathCoach.File = await MC.ide.getContextFile() |
| | | |
| | | |
| | | #### Build-System ES6+ JavaScript |
| | | |
| | | Das Paket `@mathcaoch/ide-api` muss als npm-Abhängikeit in der `package.json` des Werkzeugs |
| | | angegeben werden. Fortan können die in ES6 JavaScript vorliegenden Hilfsfunktionen |
| | | verwendet werden. Die Entwicklungsumgebung sollte grundlegende Hilfen (Autovervollständigung und eingebettete Dokumentation) anbieten. |
| | | |
| | | import { Helpers } from "@mathcoach/ide-api/dist/es6" |
| | | Helpers.enableOfflineUsageIfNecessary(); |
| | | ... |
| | | const file = await MC.ide.getContextFile(); |
| | | |
| | | |
| | | #### Standalone |
| | | |
| | | Die Hilfsfunktionen liegen als eigenständige Bibliothek vor ( siehe |
| | | `./dist/lib/mathcoach-ide-tool-utils.js`). Diese muss händisch kopiert, in das Werkzeug |
| | | eingebunden und mit ihm ausgeliefert werden. Über die globale Variable `MC_IDE_TOOL_UTILS` |
| | | können die Hilfsfunktionen angesprochen werden. Die verwendete Entwicklungsumgebung kann |
| | | in der Regel nur wenig Unterstütztung anbieten (siehe auch *Typdefinition auch ohne Build-System nutzen*). |
| | | |
| | | // tool.html |
| | | <script src="/mathcoach/ui/ide/ide-lib.js"/> |
| | | <script src="mathcoach-ide-tool-utils.js"/> |
| | | <script src="tool.js"/> |
| | | |
| | | // tool.js |
| | | const { Helpers } = MC_IDE_TOOL_UTILS; |
| | | Helpers.enableOfflineUsageIfNecessary(); |
| | | ... |
| | | const file = await MC.ide.getContextFile(); |
| | | |
| | | |
| | | |
| | | |
| | | ### Beispiele |
| | |
| | | ... |
| | | } |
| | | |
| | | Der Git-Repo URL kann man eine Versionsnummer anhängen (z.B. `".../mathcoach/mathcoach-ide-api.git#2.0.0"` |
| | | für Version `2.0.0`), sodass die API falls notwendig versioniert [(Semantic Versioning)](https://semver.org/lang/de/) w |
| | | erden kann. |
| | | Der Git-Repo URL kann man eine Versionsnummer anhängen (z.B. `".../mathcoach/mathcoach-ide-api.git#3.0.0"` |
| | | für Version `3.0.0`), sodass die API, falls notwendig, versioniert [(Semantic Versioning)](https://semver.org/lang/de/) werden kann. Verfügbare Versionen sind Git-Tags und können in der Weboberfläche des Git-Repositories |
| | | oder über die Konsole (`git tag --list`) eingesehen werden. |
| | | |
| | | Nun können Hilfsfunktionen (in TypeScript) wie folgt eingebunden werden. |
| | | |
| | | import { Helpers } from "@mathcoach/ide-api"; |
| | | |
| | | |
| | | Die Typedefinition sollte automatisch verfügbar sein, sodass der Umgang mit der |
| | | IDE API (Einstiegspunkt ist die globale Variable `MC`) durch eine Entwicklungsumgebung |
| | | wie Visual Studio Code unterstützt wird. Falls nicht, muss man die Typdefinition händisch |
| | |
| | | Kommentar (Triple-Slash Directive) an den Anfang der JavaScript-Datei platziert |
| | | werden (`path` falls nötig anpassen): |
| | | |
| | | /// <reference path="../node_modules/@mathcoach/ide-api/mathcoach-api.d.ts"/> |
| | | /// <reference path="../node_modules/@mathcoach/ide-api/dist/es6/MathCoach.d.ts"/> |
| | | |
| | | Dies sorgt dafür, dass Visual Studio Code Autovervollständigung samt Dokumentation der |
| | | IDE API anbieten kann. Sollte es bei Verwendung von TypeScript notwendig sein, kann man eine |
| | |
| | | # Beispiele |
| | | - `example-ide`: |
| | | Entwickeln eines externen Werkzeuges in der MathCoach-IDE |
| | | - `example-standalone`: |
| | | Entwickeln eines externen Werkzeuges in der MathCoach-IDE |
File was renamed from examples/example-ide/MyEditor/editor.html |
| | |
| | | </ul> |
| | | |
| | | <script src="/mathcoach/ui/ide/api/ide-lib.js"></script> |
| | | <!-- |
| | | Falls gewünscht: "mathcoach-ide-tool-utils.js" aus "/dist/lib/" |
| | | in dieses Verzeichnis kopieren und einbinden. |
| | | |
| | | <script src="mathcoach-ide-tool-utils.js"></script> |
| | | --> |
| | | <script src="./editor.js"></script> |
| | | </body> |
| | | </html> |
File was renamed from examples/example-ide/MyEditor/editor.js |
| | |
| | | |
| | | // // Falls mathcoach-ide-tool-utils.js eingebunden wurde |
| | | // const { Helpers } = MC_IDE_TOOL_UTILS; |
| | | // Helpers.enableOfflineUsageIfNecessary(); // Hilfsfunktion verwenden |
| | | |
| | | |
| | | (async function () { |
| | | const isReady = typeof MC !== "undefined" ? await MC.isReady() : false; |
| | | if(!isReady){ |
| | |
| | | { |
| | | "name": "@mathcoach/ide-api", |
| | | "version": "2.0.1", |
| | | "version": "3.0.0", |
| | | "description": "API zur MathCoach IDE", |
| | | "main": "./src/index.ts", |
| | | "types": "dist/es6/index.d.ts", |
| | | "directories": { |
| | | "example": "examples" |
| | | }, |
| | | "devDependencies": { |
| | | "ava": "^2.4.0", |
| | | "nyc": "^14.1.1", |
| | | "rimraf": "^3.0.0", |
| | | "ts-node": "^8.5.4", |
| | | "typedoc": "^0.15.5" |
| | | "ava": "^3.2.0", |
| | | "nyc": "^15.0.0", |
| | | "parcel": "^1.12.4", |
| | | "rimraf": "^3.0.1", |
| | | "ts-node": "^8.6.2", |
| | | "tsconfig-paths": "^3.9.0", |
| | | "typedoc": "^0.16.9" |
| | | }, |
| | | "scripts": { |
| | | "clean": "rimraf dist/ && rimraf docs/", |
| | | "test": "nyc ava", |
| | | "build": "npm run clean && npm run build-docs", |
| | | "build-docs": "typedoc mathcoach-api.d.ts src/ --out docs/ --mode file --hideGenerator --theme minimal --includeDeclarations --excludeExternals --media ./media" |
| | | "build": "npm run clean && npm run build-docs && npm run build-utils-es6 && npm run build-utils-lib", |
| | | "build-docs": "typedoc src/ --out docs/ --mode file --hideGenerator --theme minimal --includeDeclarations --excludeExternals --media ./media", |
| | | "build-utils-es6": "npx tsc --project tsconfig-es6.json", |
| | | "build-utils-lib": "parcel build src/index.ts --target node --bundle-node-modules --global MC_IDE_TOOL_UTILS --out-dir dist/lib --out-file mathcoach-ide-tool-utils.js --public-url ./" |
| | | }, |
| | | "author": "jsteuer", |
| | | "license": "", |
| | | "ava": { |
| | | "compileEnhancements": false, |
| | | "files": [ |
| | | "./test/**/*.spec.ts" |
| | | ], |
| | | "extensions": [ |
| | | "ts" |
| | | ], |
| | | "require": [ |
| | | "ts-node/register" |
| | | ] |
| | | "ts-node/register/transpile-only", |
| | | "tsconfig-paths/register" |
| | | ], |
| | | "concurrency": 5, |
| | | "failFast": true, |
| | | "failWithoutAssertions": false, |
| | | "tap": false, |
| | | "verbose": true |
| | | }, |
| | | "nyc": { |
| | | "include": [ |
| | | "src/**/*.ts", |
| | | "src/**/*.tsx" |
| | | "src/**/*.ts" |
| | | ], |
| | | "exclude": [ |
| | | "**/*.d.ts" |
| | |
| | | ".tsx" |
| | | ], |
| | | "require": [ |
| | | "ts-node/register" |
| | | "ts-node/register/transpile-only" |
| | | ], |
| | | "reporter": [ |
| | | "text-summary", |
| | |
| | | /// <reference path="../mathcoach-api.d.ts"/> |
| | | |
| | | |
| | | import { MathCoach } from "./MathCoach"; |
| | | |
| | | /** |
| | | * Hilfsfunktionen für Werkzeug-Entwickler. Diese werden nicht durch die `ide-lib.js` |
| | | * ausgeliefert! |
| | |
| | | const value = this.items.get(key); |
| | | return value ? value : null; |
| | | } |
| | | key(index: number): string | null { |
| | | key(_index: number): string | null { |
| | | throw new Error("InMemoryStorage: key function is not implemented now"); |
| | | } |
| | | removeItem(key: string): void { |
File was renamed from mathcoach-api.d.ts |
| | |
| | | /** |
| | | * Wenn die Bibliothek zur Erweiterung der IDE eingebunden (`ide-lib.js`) wurde, |
| | | * steht diese globale Variable mit Zugang zur öffentlichen Schnittstelle |
| | | * zur Verfügung. |
| | | */ |
| | | declare const MC: MathCoach.Api; |
| | | declare global { |
| | | /** |
| | | * Wenn die Bibliothek zur Erweiterung der IDE eingebunden (`ide-lib.js`) wurde, |
| | | * steht diese globale Variable mit Zugang zur öffentlichen Schnittstelle |
| | | * zur Verfügung. |
| | | */ |
| | | const MC: MathCoach.Api; |
| | | } |
| | | |
| | | |
| | | |
| | | /** |
| | | * Der MathCoach-Namensraum ist die Sammelstelle für alle öffentlichen Schnittstellen. |
| | |
| | | * Als Einstiegspunkt dient das interface `MathCoach.Api` - eine Implementierung dieser Schnittstelle |
| | | * wird von der IDE (siehe `ide-lib.js`) bereitgestellt und kann über die globale Variable |
| | | * `MC` zugegriffen werden. |
| | | * |
| | | * Beispiel: |
| | | * |
| | | * const isReady = await MC.ide.isReady(); // true oder false |
| | | */ |
| | | declare namespace MathCoach { |
| | | export namespace MathCoach { |
| | | |
| | | /** |
| | | * Als Einstiegspunkt dient das interface `MathCoach.Api` - eine Implementierung dieser Schnittstelle |
| | | * wird von der IDE (siehe `ide-lib.js`) bereitgestellt und kann über die globale Variable |
| | | * `MC` zugegriffen werden. |
| | | * |
| | | * |
| | | * Beispiel: |
| | | * |
| | | * const isReady = await MC.ide.isReady(); // true oder false |
| | | */ |
| | | interface Api { |
| | | export interface Api { |
| | | /** |
| | | * Die Schnittstelle zur Entwicklungsumgebung (IDE) von MathCoach. |
| | | */ |
| | |
| | | /** |
| | | * Schnittstelle zur IDE von MathCoach |
| | | */ |
| | | interface IdeApi { |
| | | export interface IdeApi { |
| | | /** |
| | | * Gibt den Namen des aktuellen Benutzers zurück, der mit dem Werkzeug arbeitet. |
| | | * |
| | |
| | | /** |
| | | * Schnittstelle zur Navigation der Vorschau |
| | | */ |
| | | interface NavigatorApi { |
| | | export interface NavigatorApi { |
| | | /** |
| | | * Navigiert die Vorschau zu einem Link. |
| | | * |
| | |
| | | /** |
| | | * Schnittstelle zum Dateisystem |
| | | */ |
| | | interface FileSystemApi { |
| | | export interface FileSystemApi { |
| | | /** |
| | | * Liest eine Datei und gibt den Textinhalt zurück. |
| | | * |
| | |
| | | * Siehe auch: `MC.ide.getContextFile()` |
| | | * |
| | | */ |
| | | interface File { |
| | | export interface File { |
| | | /** |
| | | * Name des Besitzers. Hinweis: Der Besitzter kann vom angemeldeten |
| | | * Benutzer abweichen (z.B. wenn das Teilen von Inhalten zukünftig unterstützt wird) |
| | |
| | | export * from "./Helpers" |
| | | export * from "./MathCoach" |
| | | export * from "./Helpers" |
| | |
| | | import test, { ExecutionContext } from "ava"; |
| | | |
| | | import { Helpers } from "../src/Helpers"; |
| | | import { Helpers } from "@mathcoach-ide-api"; |
| | | import { MathCoach } from "@mathcoach-ide-api"; |
| | | |
| | | |
| | | test("Helpers.contextFileToExerciseFile works as expected", t => { |
| | | t.deepEqual( |
| | |
| | | }) |
| | | |
| | | test("Helpers.contextFileToExerciseFile check params", t => { |
| | | const expectedErrorMessage = "no valid file reference given, expected object like {owner:'demo', part:'vfs'|'www', path: '/...'}" |
| | | t.throws(() => Helpers.contextFileToExerciseFile(null as any), expectedErrorMessage); |
| | | t.throws(() => Helpers.contextFileToExerciseFile("null" as any), expectedErrorMessage); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: 1, part: 2, path: 3 } as any), expectedErrorMessage); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: "", part: "vfs", path: "/aufgabe.tool.json" } as any), expectedErrorMessage); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: "demo", part: "xxx", path: "/aufgabe.tool.json" } as any), expectedErrorMessage); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "notAbsolute.tool.json" } as any), expectedErrorMessage); |
| | | const expected = { message: "no valid file reference given, expected object like {owner:'demo', part:'vfs'|'www', path: '/...'}" } |
| | | t.throws(() => Helpers.contextFileToExerciseFile(null as any), expected); |
| | | t.throws(() => Helpers.contextFileToExerciseFile("null" as any), expected); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: 1, part: 2, path: 3 } as any), expected); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: "", part: "vfs", path: "/aufgabe.tool.json" } as any), expected); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: "demo", part: "xxx", path: "/aufgabe.tool.json" } as any), expected); |
| | | t.throws(() => Helpers.contextFileToExerciseFile({ owner: "demo", part: "vfs", path: "notAbsolute.tool.json" } as any), expected); |
| | | }) |
| | | |
| | | test("Helpers.isFile", t => { |
New file |
| | |
| | | { |
| | | "compilerOptions": { |
| | | "target": "es6", |
| | | "module": "es6", |
| | | "moduleResolution": "node", |
| | | "sourceMap": true, |
| | | "declaration": true, |
| | | "lib": [ |
| | | "es2016", |
| | | "dom" |
| | | ], |
| | | "rootDir": "src", |
| | | "outDir": "dist/es6", |
| | | "baseUrl": ".", |
| | | "strict": true, |
| | | "noImplicitReturns": true, |
| | | "noImplicitThis": true, |
| | | "noUnusedLocals": true, |
| | | "noUnusedParameters": true |
| | | }, |
| | | "include": [ |
| | | "src" |
| | | ] |
| | | } |
| | |
| | | { |
| | | "compilerOptions": { |
| | | "target": "es6", |
| | | "module": "commonjs", |
| | | "target": "es5", |
| | | "declaration": true, |
| | | "outDir": "./dist", |
| | | "moduleResolution": "node", |
| | | "sourceMap": true, |
| | | "lib": [ |
| | | "DOM", |
| | | "ES2016" |
| | | "es2016", |
| | | "dom" |
| | | ], |
| | | "strict": true |
| | | } |
| | | "rootDir": ".", |
| | | "outDir": "dist", |
| | | "baseUrl": ".", |
| | | "paths": { |
| | | "@mathcoach-ide-api": [ |
| | | "src" |
| | | ], |
| | | }, |
| | | "strict": true, |
| | | "noImplicitReturns": true, |
| | | "noImplicitThis": true, |
| | | "noUnusedLocals": true, |
| | | "noUnusedParameters": true |
| | | }, |
| | | "include": [ |
| | | "src", |
| | | "test" |
| | | ] |
| | | } |