diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 7228c339..00000000 --- a/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.git -.idea -node_modules -nbproject -admin/i18n/flat.txt -admin/i18n/*/flat.txt \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index e966b4f6..00000000 --- a/.npmignore +++ /dev/null @@ -1,10 +0,0 @@ -gulpfile.js -admin/i18n -tasks -node_modules -.idea -.git -/node_modules -test -.travis.yml -appveyor.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2456688c..00000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -os: - - linux - - osx -language: node_js -node_js: - - '4' - - '6' - - '8' - - '10' -before_script: - - export NPMVERSION=$(echo "$($(which npm) -v)"|cut -c1) - - 'if [[ $NPMVERSION == 5 ]]; then npm install -g npm@5; fi' - - npm -v - - npm install winston@2.3.1 - - 'npm install https://github.com/ioBroker/ioBroker.js-controller/tarball/master --production' -env: - - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d91b0adf..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 @@Author@@ <@@email@@> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/README.md b/README.md index 8eae7676..074be258 100644 --- a/README.md +++ b/README.md @@ -1,98 +1,47 @@ -![Logo](admin/template.png) -# ioBroker.template -================= - -This adapter is a template for the creation of an ioBroker adapter. You do not need it unless you plan on developing your own adapter. - -It includes both code running within iobroker and as vis widget. If you only plan to create a vis widget then you should use the [iobroker.vis-template](https://github.com/ioBroker/ioBroker.vis-template) instead. - -## Steps -1. download and unpack this packet from github ```https://github.com/ioBroker/ioBroker.template/archive/master.zip``` - or clone git repository ```git clone --depth=1 https://github.com/ioBroker/ioBroker.template.git``` - -2. download required npm packets. Write in ioBroker.template directory: - - ```npm install``` - -3. set name of this template. Call - - ```gulp rename --name mynewname --email email@mail.com --author "Author Name"``` - - *mynewname* must be **lower** case and with no spaces. - - If gulp is not available, install gulp globally: - - ```npm install -g gulp-cli``` - -4. rename directory from *ioBroker.template* (can be *ioBroker.template-master*) to *iobroker.mynewname* - -5. to use this template you should copy it into *.../iobroker/node_modules* directory and then create an instance for it with iobroker.admin - -6. create your adapter: - - * you might want to start with main.js (code running within iobroker) and admin/index.html (the adapter settings page). - - * [Adapter-Development-Documentation](https://github.com/ioBroker/ioBroker/wiki/Adapter-Development-Documentation), - - * [Installation, setup and first steps with an ioBroker Development Environment](https://github.com/ioBroker/ioBroker/wiki/Installation,-setup-and-first-steps-with-an-ioBroker-Development-Environment) - - * [Write and debug vis widgets](https://github.com/ioBroker/ioBroker/wiki/How-to-debug-vis-and-to-write-own-widget-set) - - * files under the www folders are made available under http://<iobrokerIP>:8082/<adapter-name>/ - * for this to work the iobroker.vis adapter has to be installed - * delete this folder if you do not plan to export any files this way - * call ```iobroker upload ``` after you change files in the www folder to get the new files uploaded to vis - * the widget folder contains an example of a vis widget - * you might want to start with *widget/.html* and *widget/js/.js* - * call ```iobroker visdebug ``` to enable debugging and upload widget to "vis". (This works only from V0.7.15 of js-controller) - * If you do not plan to export any widget then delete the whole widget folder and remove the ```"restartAdapters": ["vis"]``` statement from *io-package.json* - * After admin/index.html is changed you must execute ```iobroker upload mynewname``` to see changes in admin console. The same is valid for any files in *admin* and *www* directory - -7. change version: edit package.json and then call ```grunt p``` in your adapter directory. - -8. share it with the community - -## Requirements -* your github repository must have name "ioBroker.". **B** is capital in "ioBroker", but in the package.json the *name* must be low case, because npm does not allow upper case letters. -* *title* in io-package.json (common) is simple short name of adapter in english. *titleLang* is object that consist short names in many languages. *Lang* ist not german Länge, but english LANGuages. -* Do not use in the title the words "ioBroker" or "Adapter". It is clear anyway, that it is adapter for ioBroker. - -## Changelog - -### 0.7.0 (2019.01.08) -* (jogibear998) compact mode and fixes - -### 0.6.0 (2017.01.02) -* (bluefox) Support of admin3 - -### 0.5.0 -* (vegetto) include vis widget - -### 0.4.0 -* (bluefox) fix errors with grunt - -### 0.2.0 -* (bluefox) initial release - -## License -The MIT License (MIT) - -Copyright (c) 2018 @@Author@@ <@@email@@> - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. +# ioBroker templates + +This is a collection of templates for ioBroker developers. Just select the template you need, copy its contents from the sub directory and begin working on your project. + + + +## Templates +Currently, the following templates are available: + +### Adapter and visualization + +#### JavaScript + +#### TypeScript + +### Adapter only + +#### JavaScript + +#### TypeScript + +## Visualization only + +#### JavaScript + +#### TypeScript + + +## Features +All templates come with the following features: +* IntelliSense (auto completion and tooltips) in supporting editors +* JavaScript only: + * [ESLint](https://github.com/eslint/eslint) for code quality + * Type checking based on the ioBroker declarations +* TypeScript only: + * [TSLint](https://github.com/palantir/tslint) for code quality + * [nyc](https://github.com/istanbuljs/nyc) for code coverage +* Built-in component tests using `mocha` & `chai` (with `chai-as-promised`) and `sinon` (with `sinon-chai`) for: + * Correctly defined package files + * and your own tests +* ... [and more to come](https://github.com/ioBroker/create-adapter/blob/master/README.md#roadmap) + +## Anything missing? +The templates are automatically generated using [`@iobroker/create-adapter`](https://github.com/ioBroker/create-adapter). If you're missing a feature or found a bug, please open an issue in that repository. Or consider using the tool directly for much more configuration goodness. + +## For developers +Please don't edit these files directly (except this README). Instead the CI builds in the `create-adapter` repo should be updated. diff --git a/admin/template.png b/admin/template.png deleted file mode 100644 index a16caf48..00000000 Binary files a/admin/template.png and /dev/null differ diff --git a/admin/words.js b/admin/words.js deleted file mode 100644 index af567238..00000000 --- a/admin/words.js +++ /dev/null @@ -1,13 +0,0 @@ -// DO NOT EDIT THIS FILE!!! IT WILL BE AUTOMATICALLY GENERATED FROM src/i18n -/*global systemDictionary:true */ -'use strict'; - -systemDictionary = { - "Auto": { "en": "Auto", "de": "Auto", "ru": "Автоматически", "pt": "Auto", "nl": "Auto", "fr": "Auto", "it": "Auto", "es": "Auto"}, - "Manual": { "en": "Manual", "de": "Manual", "ru": "Вручную", "pt": "Manual", "nl": "Met de hand", "fr": "Manuel", "it": "Manuale", "es": "Manual"}, - "My select": { "en": "My select", "de": "Mein Auswahl", "ru": "Выбор", "pt": "Meu selecionado", "nl": "Mijn select", "fr": "Mon choix", "it": "La mia selezione", "es": "Mi seleccion"}, - "on save adapter restarts with new config immediately": {"en": "on save adapter restarts with new config immediately", "de": "Beim Speichern von Einstellungen der Adapter wird sofort neu gestartet.", "ru": "При сохранении настроек адаптера он сразу же перезапускается", "pt": "no adaptador de salvar reinicia com nova configuração imediatamente", "nl": "on save-adapter wordt onmiddellijk opnieuw opgestart met nieuwe config", "fr": "sur l'adaptateur de sauvegarde redémarre avec la nouvelle config immédiatement", "it": "su save adapter si riavvia immediatamente con la nuova configurazione", "es": "en el adaptador de guardar se reinicia con nueva configuración de inmediato"}, - "template adapter settings": { "en": "template adapter settings", "de": "Beispiel", "ru": "Пример", "pt": "configurações do adaptador de modelo", "nl": "sjabloon-adapterinstellingen", "fr": "paramètres de l'adaptateur de modèle", "it": "impostazioni dell'adattatore del modello", "es": "configuración del adaptador de plantilla"}, - "test1": { "en": "Test 1", "de": "Test 1", "ru": "Тест 1", "pt": "Teste 1", "nl": "Test 1", "fr": "Test 1", "it": "Test 1", "es": "Prueba 1"}, - "test2": { "en": "Test 2", "de": "Test 2", "ru": "Тест 2", "pt": "Teste 2", "nl": "Test 2", "fr": "Test 2", "it": "Test 2", "es": "Prueba 2"} -}; \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 84ca0a91..00000000 --- a/appveyor.yml +++ /dev/null @@ -1,25 +0,0 @@ -version: 'test-{build}' -environment: - matrix: - - nodejs_version: '4' - - nodejs_version: '6' - - nodejs_version: '8' - - nodejs_version: '10' -platform: - - x86 - - x64 -clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%' -install: - - ps: 'Install-Product node $env:nodejs_version $env:platform' - - ps: '$NpmVersion = (npm -v).Substring(0,1)' - - ps: 'if($NpmVersion -eq 5) { npm install -g npm@5 }' - - ps: npm --version - - npm install - - npm install winston@2.3.1 - - 'npm install https://github.com/ioBroker/ioBroker.js-controller/tarball/master --production' -test_script: - - echo %cd% - - node --version - - npm --version - - npm test -build: 'off' diff --git a/docs/de/img/picture.png b/docs/de/img/picture.png deleted file mode 100644 index a16caf48..00000000 Binary files a/docs/de/img/picture.png and /dev/null differ diff --git a/docs/de/template.md b/docs/de/template.md deleted file mode 100644 index 468acb06..00000000 --- a/docs/de/template.md +++ /dev/null @@ -1,3 +0,0 @@ -# Das ist die Dokumentation - -(Picture)[img/picture.png) \ No newline at end of file diff --git a/docs/en/img/picture.png b/docs/en/img/picture.png deleted file mode 100644 index a16caf48..00000000 Binary files a/docs/en/img/picture.png and /dev/null differ diff --git a/docs/en/template.md b/docs/en/template.md deleted file mode 100644 index c930e13e..00000000 --- a/docs/en/template.md +++ /dev/null @@ -1,3 +0,0 @@ -# This is Documentation - -(Picture)[img/picture.png) \ No newline at end of file diff --git a/docs/ru/img/picture.png b/docs/ru/img/picture.png deleted file mode 100644 index a16caf48..00000000 Binary files a/docs/ru/img/picture.png and /dev/null differ diff --git a/docs/ru/template.md b/docs/ru/template.md deleted file mode 100644 index 22026012..00000000 --- a/docs/ru/template.md +++ /dev/null @@ -1,3 +0,0 @@ -# Это документация - -(Picture)[img/picture.png) \ No newline at end of file diff --git a/icon.png b/icon.png new file mode 100644 index 00000000..20ed1008 Binary files /dev/null and b/icon.png differ diff --git a/io-package.json b/io-package.json deleted file mode 100644 index a1afc7b0..00000000 --- a/io-package.json +++ /dev/null @@ -1,101 +0,0 @@ -{ - "common": { - "name": "template", - "version": "0.7.0", - "news": { - "0.7.0": { - "en": "compact mode and fixes", - "de": "Kompaktmodus und Korrekturen", - "ru": "компактный режим и исправления", - "pt": "modo compacto e correções", - "nl": "compacte modus en oplossingen", - "fr": "mode compact et correctifs", - "it": "modalità compatta e correzioni", - "es": "Modo compacto y correcciones.", - "pl": "tryb kompaktowy i poprawki" - }, - "0.6.0": { - "en": "Support of admin3", - "de": "Unterstützung von admin3", - "ru": "Поддержка admin3", - "pt": "Suporte de admin3", - "nl": "Ondersteuning van admin3", - "fr": "Support de admin3", - "it": "Supporto di admin3", - "es": "Soporte de admin3" - }, - "0.5.0": { - "en": "beta version", - "de": "Betaversion", - "ru": "Бета версия", - "pt": "Versão beta", - "fr": "Version bêta", - "nl": "Beta versie" - }, - "0.0.1": { - "en": "initial adapter", - "de": "Initiale Version", - "ru": "Первоначальный адаптер", - "pt": "Versão inicial", - "fr": "Version initiale", - "nl": "Eerste release" - } - }, - "title": "Javascript/Node.js based template", - "titleLang": { - "en": "Javascript/Node.js based template", - "de": "Javascript / Node.js basierte Vorlagenadapter", - "ru": "Адаптер шаблонов на основе Javascript / Node.js", - "pt": "Adaptador de modelo baseado em Javascript / Node.js", - "nl": "Javascript / Node.js gebaseerde sjabloonadapter", - "fr": "Javascript / Node.js basé adaptateur de modèle", - "it": "Adattatore modello basato su Javascript / Node.js", - "es": "Adaptador de plantilla basado en JavaScript / Node.js" - }, - "desc": { - "en": "ioBroker template", - "de": "ioBroker Template", - "ru": "ioBroker Template как образец", - "pt": "Modelo de adaptador para o ioBroker", - "fr": "ioBroker adaptateur modèle", - "nl": "ioBroker Template", - "it": "Adattatore modello ioBroker", - "es": "Adaptador de plantilla ioBroker" - }, - "authors": [ - "@@Author@@ <@@email@@>" - ], - "docs": { - "en": "docs/en/admin.md", - "ru": "docs/ru/admin.md", - "de": "docs/de/admin.md", - "es": "docs/es/admin.md", - "it": "docs/it/admin.md", - "fr": "docs/fr/admin.md", - "nl": "docs/nl/admin.md", - "pt": "docs/pt/admin.md" - }, - "platform": "Javascript/Node.js", - "mode": "daemon", - "compact": true, - "icon": "template.png", - "materialize": true, - "enabled": true, - "extIcon": "https://raw.githubusercontent.com/ioBroker/ioBroker.template/master/admin/template.png", - "keywords": ["template", "vis", "GUI", "graphical", "scada"], - "readme": "https://github.com/ioBroker/ioBroker.template/blob/master/README.md", - "loglevel": "info", - "type": "general", - "license": "MIT", - "messagebox": false, - "restartAdapters": ["vis"] - }, - "native": { - "test1": true, - "test2": 42, - "mySelect": "auto" - }, - "objects": [ - - ] -} diff --git a/main.js b/main.js deleted file mode 100644 index 9036afb6..00000000 --- a/main.js +++ /dev/null @@ -1,170 +0,0 @@ -/** - * - * template adapter - * - * - * file io-package.json comments: - * - * { - * "common": { - * "name": "template", // name has to be set and has to be equal to adapters folder name and main file name excluding extension - * "version": "0.0.0", // use "Semantic Versioning"! see http://semver.org/ - * "title": "Node.js template Adapter", // Adapter title shown in User Interfaces - * "authors": [ // Array of authord - * "name " - * ] - * "desc": "template adapter", // Adapter description shown in User Interfaces. Can be a language object {de:"...",ru:"..."} or a string - * "platform": "Javascript/Node.js", // possible values "javascript", "javascript/Node.js" - more coming - * "mode": "daemon", // possible values "daemon", "schedule", "subscribe" - * "materialize": true, // support of admin3 - * "schedule": "0 0 * * *" // cron-style schedule. Only needed if mode=schedule - * "loglevel": "info" // Adapters Log Level - * }, - * "native": { // the native object is available via adapter.config in your adapters code - use it for configuration - * "test1": true, - * "test2": 42, - * "mySelect": "auto" - * } - * } - * - */ - -/* jshint -W097 */// jshint strict:false -/*jslint node: true */ -'use strict'; - -// you have to require the utils module and call adapter function -const utils = require('@iobroker/adapter-core'); // Get common adapter utils - -// read the adapter name from package.json -const adapterName = require('./package.json').name.split('.').pop(); - -/*Variable declaration, since ES6 there are let to declare variables. Let has a more clearer definition where -it is available then var.The variable is available inside a block and it's childs, but not outside. -You can define the same variable name inside a child without produce a conflict with the variable of the parent block.*/ -let variable = 1234; - -// create adapter instance wich will be used for communication with controller -let adapter; -function startAdapter(options) { - options = options || {}; - Object.assign(options, { - // name has to be set and has to be equal to adapters folder name and main file name excluding extension - name: adapterName, - // is called when adapter shuts down - callback has to be called under any circumstances! - unload: function (callback) { - try { - adapter.log.info('cleaned everything up...'); - callback(); - } catch (e) { - callback(); - } - }, - // is called if a subscribed object changes - objectChange: function (id, obj) { - // Warning, obj can be null if it was deleted - adapter.log.info('objectChange ' + id + ' ' + JSON.stringify(obj)); - }, - // is called if a subscribed state changes - stateChange: function (id, state) { - // Warning, state can be null if it was deleted - adapter.log.info('stateChange ' + id + ' ' + JSON.stringify(state)); - - // you can use the ack flag to detect if it is status (true) or command (false) - if (state && !state.ack) { - adapter.log.info('ack is not set!'); - } - }, - // Some message was sent to adapter instance over message box. Used by email, pushover, text2speech, ... - message: function (obj) { - if (typeof obj === 'object' && obj.message) { - if (obj.command === 'send') { - // e.g. send email or pushover or whatever - console.log('send command'); - - // Send response in callback if required - if (obj.callback) adapter.sendTo(obj.from, obj.command, 'Message received', obj.callback); - } - } - }, - // is called when databases are connected and adapter received configuration. - // start here! - ready: () => main() - }); - // you have to call the adapter function and pass a options object - // adapter will be restarted automatically every time as the configuration changed, e.g system.adapter.template.0 - adapter = new utils.Adapter(options); - - return adapter; -}; - -function main() { - - // The adapters config (in the instance object everything under the attribute "native") is accessible via - // adapter.config: - adapter.log.info('config test1: ' + adapter.config.test1); - adapter.log.info('config test1: ' + adapter.config.test2); - adapter.log.info('config mySelect: ' + adapter.config.mySelect); - - - /** - * - * For every state in the system there has to be also an object of type state - * - * Here a simple template for a boolean variable named "testVariable" - * - * Because every adapter instance uses its own unique namespace variable names can't collide with other adapters variables - * - */ - - adapter.setObject('testVariable', { - type: 'state', - common: { - name: 'testVariable', - type: 'boolean', - role: 'indicator' - }, - native: {} - }); - - // in this template all states changes inside the adapters namespace are subscribed - adapter.subscribeStates('*'); - - - /** - * setState examples - * - * you will notice that each setState will cause the stateChange event to fire (because of above subscribeStates cmd) - * - */ - - // the variable testVariable is set to true as command (ack=false) - adapter.setState('testVariable', true); - - // same thing, but the value is flagged "ack" - // ack should be always set to true if the value is received from or acknowledged from the target system - adapter.setState('testVariable', {val: true, ack: true}); - - // same thing, but the state is deleted after 30s (getState will return null afterwards) - adapter.setState('testVariable', {val: true, ack: true, expire: 30}); - - - - // examples for the checkPassword/checkGroup functions - adapter.checkPassword('admin', 'iobroker', function (res) { - console.log('check user admin pw ioboker: ' + res); - }); - - adapter.checkGroup('admin', 'admin', function (res) { - console.log('check group user admin group admin: ' + res); - }); - -} - -// If started as allInOne/compact mode => return function to create instance -if (module && module.parent) { - module.exports = startAdapter; -} else { - // or start the instance directly - startAdapter(); -} diff --git a/package.json b/package.json deleted file mode 100644 index 868827c2..00000000 --- a/package.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "name": "iobroker.template", - "version": "0.7.0", - "description": "ioBroker template Adapter", - "author": { - "name": "@@Author@@", - "email": "@@email@@" - }, - "contributors": [ - { - "name": "@@Author@@", - "email": "@@email@@" - } - ], - "homepage": "https://github.com/ioBroker/ioBroker.template", - "license": "MIT", - "keywords": [ - "ioBroker", - "template", - "Smart Home", - "home automation" - ], - "repository": { - "type": "git", - "url": "https://github.com/ioBroker/ioBroker.template" - }, - "dependencies": { - "@iobroker/adapter-core": "^1.0.3" - }, - "devDependencies": { - "gulp": "^3.9.1", - "mocha": "^4.1.0", - "chai": "^4.1.2" - }, - "main": "main.js", - "scripts": { - "test": "node node_modules/mocha/bin/mocha --exit" - }, - "bugs": { - "url": "https://github.com/ioBroker/ioBroker.template/issues" - }, - "readmeFilename": "README.md" -} \ No newline at end of file diff --git a/test/lib/setup.js b/test/lib/setup.js deleted file mode 100644 index 16857ed6..00000000 --- a/test/lib/setup.js +++ /dev/null @@ -1,728 +0,0 @@ -/* jshint -W097 */// jshint strict:false -/*jslint node: true */ -// check if tmp directory exists -var fs = require('fs'); -var path = require('path'); -var child_process = require('child_process'); -var rootDir = path.normalize(__dirname + '/../../'); -var pkg = require(rootDir + 'package.json'); -var debug = typeof v8debug === 'object'; -pkg.main = pkg.main || 'main.js'; - -var adapterName = path.normalize(rootDir).replace(/\\/g, '/').split('/'); -adapterName = adapterName[adapterName.length - 2]; -var adapterStarted = false; - -function getAppName() { - var parts = __dirname.replace(/\\/g, '/').split('/'); - return parts[parts.length - 3].split('.')[0]; -} - -var appName = getAppName().toLowerCase(); - -var objects; -var states; - -var pid = null; - -function copyFileSync(source, target) { - - var targetFile = target; - - //if target is a directory a new file with the same name will be created - if (fs.existsSync(target)) { - if ( fs.lstatSync( target ).isDirectory() ) { - targetFile = path.join(target, path.basename(source)); - } - } - - try { - fs.writeFileSync(targetFile, fs.readFileSync(source)); - } - catch (err) { - console.log("file copy error: " +source +" -> " + targetFile + " (error ignored)"); - } -} - -function copyFolderRecursiveSync(source, target, ignore) { - var files = []; - - var base = path.basename(source); - if (base === adapterName) { - base = pkg.name; - } - //check if folder needs to be created or integrated - var targetFolder = path.join(target, base); - if (!fs.existsSync(targetFolder)) { - fs.mkdirSync(targetFolder); - } - - //copy - if (fs.lstatSync(source).isDirectory()) { - files = fs.readdirSync(source); - files.forEach(function (file) { - if (ignore && ignore.indexOf(file) !== -1) { - return; - } - - var curSource = path.join(source, file); - var curTarget = path.join(targetFolder, file); - if (fs.lstatSync(curSource).isDirectory()) { - // ignore grunt files - if (file.indexOf('grunt') !== -1) return; - if (file === 'chai') return; - if (file === 'mocha') return; - copyFolderRecursiveSync(curSource, targetFolder, ignore); - } else { - copyFileSync(curSource, curTarget); - } - }); - } -} - -if (!fs.existsSync(rootDir + 'tmp')) { - fs.mkdirSync(rootDir + 'tmp'); -} - -function storeOriginalFiles() { - console.log('Store original files...'); - var dataDir = rootDir + 'tmp/' + appName + '-data/'; - - var f = fs.readFileSync(dataDir + 'objects.json'); - var objects = JSON.parse(f.toString()); - if (objects['system.adapter.admin.0'] && objects['system.adapter.admin.0'].common) { - objects['system.adapter.admin.0'].common.enabled = false; - } - if (objects['system.adapter.admin.1'] && objects['system.adapter.admin.1'].common) { - objects['system.adapter.admin.1'].common.enabled = false; - } - - fs.writeFileSync(dataDir + 'objects.json.original', JSON.stringify(objects)); - try { - f = fs.readFileSync(dataDir + 'states.json'); - fs.writeFileSync(dataDir + 'states.json.original', f); - } - catch (err) { - console.log('no states.json found - ignore'); - } -} - -function restoreOriginalFiles() { - console.log('restoreOriginalFiles...'); - var dataDir = rootDir + 'tmp/' + appName + '-data/'; - - var f = fs.readFileSync(dataDir + 'objects.json.original'); - fs.writeFileSync(dataDir + 'objects.json', f); - try { - f = fs.readFileSync(dataDir + 'states.json.original'); - fs.writeFileSync(dataDir + 'states.json', f); - } - catch (err) { - console.log('no states.json.original found - ignore'); - } - -} - -function checkIsAdapterInstalled(cb, counter, customName) { - customName = customName || pkg.name.split('.').pop(); - counter = counter || 0; - var dataDir = rootDir + 'tmp/' + appName + '-data/'; - console.log('checkIsAdapterInstalled...'); - - try { - var f = fs.readFileSync(dataDir + 'objects.json'); - var objects = JSON.parse(f.toString()); - if (objects['system.adapter.' + customName + '.0']) { - console.log('checkIsAdapterInstalled: ready!'); - setTimeout(function () { - if (cb) cb(); - }, 100); - return; - } else { - console.warn('checkIsAdapterInstalled: still not ready'); - } - } catch (err) { - - } - - if (counter > 20) { - console.error('checkIsAdapterInstalled: Cannot install!'); - if (cb) cb('Cannot install'); - } else { - console.log('checkIsAdapterInstalled: wait...'); - setTimeout(function() { - checkIsAdapterInstalled(cb, counter + 1); - }, 1000); - } -} - -function checkIsControllerInstalled(cb, counter) { - counter = counter || 0; - var dataDir = rootDir + 'tmp/' + appName + '-data/'; - - console.log('checkIsControllerInstalled...'); - try { - var f = fs.readFileSync(dataDir + 'objects.json'); - var objects = JSON.parse(f.toString()); - if (objects['system.adapter.admin.0']) { - console.log('checkIsControllerInstalled: installed!'); - setTimeout(function () { - if (cb) cb(); - }, 100); - return; - } - } catch (err) { - - } - - if (counter > 20) { - console.log('checkIsControllerInstalled: Cannot install!'); - if (cb) cb('Cannot install'); - } else { - console.log('checkIsControllerInstalled: wait...'); - setTimeout(function() { - checkIsControllerInstalled(cb, counter + 1); - }, 1000); - } -} - -function installAdapter(customName, cb) { - if (typeof customName === 'function') { - cb = customName; - customName = null; - } - customName = customName || pkg.name.split('.').pop(); - console.log('Install adapter...'); - var startFile = 'node_modules/' + appName + '.js-controller/' + appName + '.js'; - // make first install - if (debug) { - child_process.execSync('node ' + startFile + ' add ' + customName + ' --enabled false', { - cwd: rootDir + 'tmp', - stdio: [0, 1, 2] - }); - checkIsAdapterInstalled(function (error) { - if (error) console.error(error); - console.log('Adapter installed.'); - if (cb) cb(); - }); - } else { - // add controller - var _pid = child_process.fork(startFile, ['add', customName, '--enabled', 'false'], { - cwd: rootDir + 'tmp', - stdio: [0, 1, 2, 'ipc'] - }); - - waitForEnd(_pid, function () { - checkIsAdapterInstalled(function (error) { - if (error) console.error(error); - console.log('Adapter installed.'); - if (cb) cb(); - }); - }); - } -} - -function waitForEnd(_pid, cb) { - if (!_pid) { - cb(-1, -1); - return; - } - _pid.on('exit', function (code, signal) { - if (_pid) { - _pid = null; - cb(code, signal); - } - }); - _pid.on('close', function (code, signal) { - if (_pid) { - _pid = null; - cb(code, signal); - } - }); -} - -function installJsController(cb) { - console.log('installJsController...'); - if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller') || - !fs.existsSync(rootDir + 'tmp/' + appName + '-data')) { - // try to detect appName.js-controller in node_modules/appName.js-controller - // travis CI installs js-controller into node_modules - if (fs.existsSync(rootDir + 'node_modules/' + appName + '.js-controller')) { - console.log('installJsController: no js-controller => copy it from "' + rootDir + 'node_modules/' + appName + '.js-controller"'); - // copy all - // stop controller - console.log('Stop controller if running...'); - var _pid; - if (debug) { - // start controller - _pid = child_process.exec('node ' + appName + '.js stop', { - cwd: rootDir + 'node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2] - }); - } else { - _pid = child_process.fork(appName + '.js', ['stop'], { - cwd: rootDir + 'node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2, 'ipc'] - }); - } - - waitForEnd(_pid, function () { - // copy all files into - if (!fs.existsSync(rootDir + 'tmp')) fs.mkdirSync(rootDir + 'tmp'); - if (!fs.existsSync(rootDir + 'tmp/node_modules')) fs.mkdirSync(rootDir + 'tmp/node_modules'); - - if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller')){ - console.log('Copy js-controller...'); - copyFolderRecursiveSync(rootDir + 'node_modules/' + appName + '.js-controller', rootDir + 'tmp/node_modules/'); - } - - console.log('Setup js-controller...'); - var __pid; - if (debug) { - // start controller - _pid = child_process.exec('node ' + appName + '.js setup first --console', { - cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2] - }); - } else { - __pid = child_process.fork(appName + '.js', ['setup', 'first', '--console'], { - cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2, 'ipc'] - }); - } - waitForEnd(__pid, function () { - checkIsControllerInstalled(function () { - // change ports for object and state DBs - var config = require(rootDir + 'tmp/' + appName + '-data/' + appName + '.json'); - config.objects.port = 19001; - config.states.port = 19000; - fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/' + appName + '.json', JSON.stringify(config, null, 2)); - console.log('Setup finished.'); - - copyAdapterToController(); - - installAdapter(function () { - storeOriginalFiles(); - if (cb) cb(true); - }); - }); - }); - }); - } else { - // check if port 9000 is free, else admin adapter will be added to running instance - var client = new require('net').Socket(); - client.connect(9000, '127.0.0.1', function() { - console.error('Cannot initiate fisrt run of test, because one instance of application is running on this PC. Stop it and repeat.'); - process.exit(0); - }); - - setTimeout(function () { - client.destroy(); - if (!fs.existsSync(rootDir + 'tmp/node_modules/' + appName + '.js-controller')) { - console.log('installJsController: no js-controller => install from git'); - - child_process.execSync('npm install https://github.com/' + appName + '/' + appName + '.js-controller/tarball/master --prefix ./ --production', { - cwd: rootDir + 'tmp/', - stdio: [0, 1, 2] - }); - } else { - console.log('Setup js-controller...'); - var __pid; - if (debug) { - // start controller - child_process.exec('node ' + appName + '.js setup first', { - cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2] - }); - } else { - child_process.fork(appName + '.js', ['setup', 'first'], { - cwd: rootDir + 'tmp/node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2, 'ipc'] - }); - } - } - - // let npm install admin and run setup - checkIsControllerInstalled(function () { - var _pid; - - if (fs.existsSync(rootDir + 'node_modules/' + appName + '.js-controller/' + appName + '.js')) { - _pid = child_process.fork(appName + '.js', ['stop'], { - cwd: rootDir + 'node_modules/' + appName + '.js-controller', - stdio: [0, 1, 2, 'ipc'] - }); - } - - waitForEnd(_pid, function () { - // change ports for object and state DBs - var config = require(rootDir + 'tmp/' + appName + '-data/' + appName + '.json'); - config.objects.port = 19001; - config.states.port = 19000; - fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/' + appName + '.json', JSON.stringify(config, null, 2)); - - copyAdapterToController(); - - installAdapter(function () { - storeOriginalFiles(); - if (cb) cb(true); - }); - }); - }); - }, 1000); - } - } else { - setTimeout(function () { - console.log('installJsController: js-controller installed'); - if (cb) cb(false); - }, 0); - } -} - -function copyAdapterToController() { - console.log('Copy adapter...'); - // Copy adapter to tmp/node_modules/appName.adapter - copyFolderRecursiveSync(rootDir, rootDir + 'tmp/node_modules/', ['.idea', 'test', 'tmp', '.git', appName + '.js-controller']); - console.log('Adapter copied.'); -} - -function clearControllerLog() { - var dirPath = rootDir + 'tmp/log'; - var files; - try { - if (fs.existsSync(dirPath)) { - console.log('Clear controller log...'); - files = fs.readdirSync(dirPath); - } else { - console.log('Create controller log directory...'); - files = []; - fs.mkdirSync(dirPath); - } - } catch(e) { - console.error('Cannot read "' + dirPath + '"'); - return; - } - if (files.length > 0) { - try { - for (var i = 0; i < files.length; i++) { - var filePath = dirPath + '/' + files[i]; - fs.unlinkSync(filePath); - } - console.log('Controller log cleared'); - } catch (err) { - console.error('cannot clear log: ' + err); - } - } -} - -function clearDB() { - var dirPath = rootDir + 'tmp/iobroker-data/sqlite'; - var files; - try { - if (fs.existsSync(dirPath)) { - console.log('Clear sqlite DB...'); - files = fs.readdirSync(dirPath); - } else { - console.log('Create controller log directory...'); - files = []; - fs.mkdirSync(dirPath); - } - } catch(e) { - console.error('Cannot read "' + dirPath + '"'); - return; - } - if (files.length > 0) { - try { - for (var i = 0; i < files.length; i++) { - var filePath = dirPath + '/' + files[i]; - fs.unlinkSync(filePath); - } - console.log('Clear sqlite DB'); - } catch (err) { - console.error('cannot clear DB: ' + err); - } - } -} - -function setupController(cb) { - installJsController(function (isInited) { - clearControllerLog(); - clearDB(); - - if (!isInited) { - restoreOriginalFiles(); - copyAdapterToController(); - } - // read system.config object - var dataDir = rootDir + 'tmp/' + appName + '-data/'; - - var objs; - try { - objs = fs.readFileSync(dataDir + 'objects.json'); - objs = JSON.parse(objs); - } - catch (e) { - console.log('ERROR reading/parsing system configuration. Ignore'); - objs = {'system.config': {}}; - } - if (!objs || !objs['system.config']) { - objs = {'system.config': {}}; - } - - if (cb) cb(objs['system.config']); - }); -} - -function startAdapter(objects, states, callback) { - if (adapterStarted) { - console.log('Adapter already started ...'); - if (callback) callback(objects, states); - return; - } - adapterStarted = true; - console.log('startAdapter...'); - if (fs.existsSync(rootDir + 'tmp/node_modules/' + pkg.name + '/' + pkg.main)) { - try { - if (debug) { - // start controller - pid = child_process.exec('node node_modules/' + pkg.name + '/' + pkg.main + ' --console silly', { - cwd: rootDir + 'tmp', - stdio: [0, 1, 2] - }); - } else { - // start controller - pid = child_process.fork('node_modules/' + pkg.name + '/' + pkg.main, ['--console', 'silly'], { - cwd: rootDir + 'tmp', - stdio: [0, 1, 2, 'ipc'] - }); - } - } catch (error) { - console.error(JSON.stringify(error)); - } - } else { - console.error('Cannot find: ' + rootDir + 'tmp/node_modules/' + pkg.name + '/' + pkg.main); - } - if (callback) callback(objects, states); -} - -function startController(isStartAdapter, onObjectChange, onStateChange, callback) { - if (typeof isStartAdapter === 'function') { - callback = onStateChange; - onStateChange = onObjectChange; - onObjectChange = isStartAdapter; - isStartAdapter = true; - } - - if (onStateChange === undefined) { - callback = onObjectChange; - onObjectChange = undefined; - } - - if (pid) { - console.error('Controller is already started!'); - } else { - console.log('startController...'); - adapterStarted = false; - var isObjectConnected; - var isStatesConnected; - - var Objects = require(rootDir + 'tmp/node_modules/' + appName + '.js-controller/lib/objects/objectsInMemServer'); - objects = new Objects({ - connection: { - "type" : "file", - "host" : "127.0.0.1", - "port" : 19001, - "user" : "", - "pass" : "", - "noFileCache": false, - "connectTimeout": 2000 - }, - logger: { - silly: function (msg) { - console.log(msg); - }, - debug: function (msg) { - console.log(msg); - }, - info: function (msg) { - console.log(msg); - }, - warn: function (msg) { - console.warn(msg); - }, - error: function (msg) { - console.error(msg); - } - }, - connected: function () { - isObjectConnected = true; - if (isStatesConnected) { - console.log('startController: started!'); - if (isStartAdapter) { - startAdapter(objects, states, callback); - } else { - if (callback) { - callback(objects, states); - callback = null; - } - } - } - }, - change: onObjectChange - }); - - // Just open in memory DB itself - var States = require(rootDir + 'tmp/node_modules/' + appName + '.js-controller/lib/states/statesInMemServer'); - states = new States({ - connection: { - type: 'file', - host: '127.0.0.1', - port: 19000, - options: { - auth_pass: null, - retry_max_delay: 15000 - } - }, - logger: { - silly: function (msg) { - console.log(msg); - }, - debug: function (msg) { - console.log(msg); - }, - info: function (msg) { - console.log(msg); - }, - warn: function (msg) { - console.log(msg); - }, - error: function (msg) { - console.log(msg); - } - }, - connected: function () { - isStatesConnected = true; - if (isObjectConnected) { - console.log('startController: started!!'); - if (isStartAdapter) { - startAdapter(objects, states, callback); - } else { - if (callback) { - callback(objects, states); - callback = null; - } - } - } - }, - change: onStateChange - }); - } -} - -function stopAdapter(cb) { - if (!pid) { - console.error('Controller is not running!'); - if (cb) { - setTimeout(function () { - cb(false); - }, 0); - } - } else { - adapterStarted = false; - pid.on('exit', function (code, signal) { - if (pid) { - console.log('child process terminated due to receipt of signal ' + signal); - if (cb) cb(); - pid = null; - } - }); - - pid.on('close', function (code, signal) { - if (pid) { - if (cb) cb(); - pid = null; - } - }); - - pid.kill('SIGTERM'); - } -} - -function _stopController() { - if (objects) { - objects.destroy(); - objects = null; - } - if (states) { - states.destroy(); - states = null; - } -} - -function stopController(cb) { - var timeout; - if (objects) { - console.log('Set system.adapter.' + pkg.name + '.0'); - objects.setObject('system.adapter.' + pkg.name + '.0', { - common:{ - enabled: false - } - }); - } - - stopAdapter(function () { - if (timeout) { - clearTimeout(timeout); - timeout = null; - } - - _stopController(); - - if (cb) { - cb(true); - cb = null; - } - }); - - timeout = setTimeout(function () { - timeout = null; - console.log('child process NOT terminated'); - - _stopController(); - - if (cb) { - cb(false); - cb = null; - } - pid = null; - }, 5000); -} - -// Setup the adapter -function setAdapterConfig(common, native, instance) { - var objects = JSON.parse(fs.readFileSync(rootDir + 'tmp/' + appName + '-data/objects.json').toString()); - var id = 'system.adapter.' + adapterName.split('.').pop() + '.' + (instance || 0); - if (common) objects[id].common = common; - if (native) objects[id].native = native; - fs.writeFileSync(rootDir + 'tmp/' + appName + '-data/objects.json', JSON.stringify(objects)); -} - -// Read config of the adapter -function getAdapterConfig(instance) { - var objects = JSON.parse(fs.readFileSync(rootDir + 'tmp/' + appName + '-data/objects.json').toString()); - var id = 'system.adapter.' + adapterName.split('.').pop() + '.' + (instance || 0); - return objects[id]; -} - -if (typeof module !== undefined && module.parent) { - module.exports.getAdapterConfig = getAdapterConfig; - module.exports.setAdapterConfig = setAdapterConfig; - module.exports.startController = startController; - module.exports.stopController = stopController; - module.exports.setupController = setupController; - module.exports.stopAdapter = stopAdapter; - module.exports.startAdapter = startAdapter; - module.exports.installAdapter = installAdapter; - module.exports.appName = appName; - module.exports.adapterName = adapterName; - module.exports.adapterStarted = adapterStarted; -} diff --git a/test/testAdapter.js b/test/testAdapter.js deleted file mode 100644 index ae9c2892..00000000 --- a/test/testAdapter.js +++ /dev/null @@ -1,140 +0,0 @@ -/* jshint -W097 */// jshint strict:false -/*jslint node: true */ -var expect = require('chai').expect; -var setup = require(__dirname + '/lib/setup'); - -var objects = null; -var states = null; -var onStateChanged = null; -var onObjectChanged = null; -var sendToID = 1; - -var adapterShortName = setup.adapterName.substring(setup.adapterName.indexOf('.')+1); - -function checkConnectionOfAdapter(cb, counter) { - counter = counter || 0; - console.log('Try check #' + counter); - if (counter > 30) { - if (cb) cb('Cannot check connection'); - return; - } - - states.getState('system.adapter.' + adapterShortName + '.0.alive', function (err, state) { - if (err) console.error(err); - if (state && state.val) { - if (cb) cb(); - } else { - setTimeout(function () { - checkConnectionOfAdapter(cb, counter + 1); - }, 1000); - } - }); -} - -function checkValueOfState(id, value, cb, counter) { - counter = counter || 0; - if (counter > 20) { - if (cb) cb('Cannot check value Of State ' + id); - return; - } - - states.getState(id, function (err, state) { - if (err) console.error(err); - if (value === null && !state) { - if (cb) cb(); - } else - if (state && (value === undefined || state.val === value)) { - if (cb) cb(); - } else { - setTimeout(function () { - checkValueOfState(id, value, cb, counter + 1); - }, 500); - } - }); -} - -function sendTo(target, command, message, callback) { - onStateChanged = function (id, state) { - if (id === 'messagebox.system.adapter.test.0') { - callback(state.message); - } - }; - - states.pushMessage('system.adapter.' + target, { - command: command, - message: message, - from: 'system.adapter.test.0', - callback: { - message: message, - id: sendToID++, - ack: false, - time: (new Date()).getTime() - } - }); -} - -describe('Test ' + adapterShortName + ' adapter', function() { - before('Test ' + adapterShortName + ' adapter: Start js-controller', function (_done) { - this.timeout(600000); // because of first install from npm - - setup.setupController(function () { - var config = setup.getAdapterConfig(); - // enable adapter - config.common.enabled = true; - config.common.loglevel = 'debug'; - - //config.native.dbtype = 'sqlite'; - - setup.setAdapterConfig(config.common, config.native); - - setup.startController(true, function(id, obj) {}, function (id, state) { - if (onStateChanged) onStateChanged(id, state); - }, - function (_objects, _states) { - objects = _objects; - states = _states; - _done(); - }); - }); - }); - -/* - ENABLE THIS WHEN ADAPTER RUNS IN DEAMON MODE TO CHECK THAT IT HAS STARTED SUCCESSFULLY -*/ - it('Test ' + adapterShortName + ' adapter: Check if adapter started', function (done) { - this.timeout(60000); - checkConnectionOfAdapter(function (res) { - if (res) console.log(res); - expect(res).not.to.be.equal('Cannot check connection'); - objects.setObject('system.adapter.test.0', { - common: { - - }, - type: 'instance' - }, - function () { - states.subscribeMessage('system.adapter.test.0'); - done(); - }); - }); - }); -/**/ - -/* - PUT YOUR OWN TESTS HERE USING - it('Testname', function ( done) { - ... - }); - - You can also use "sendTo" method to send messages to the started adapter -*/ - - after('Test ' + adapterShortName + ' adapter: Stop js-controller', function (done) { - this.timeout(10000); - - setup.stopController(function (normalTerminated) { - console.log('Adapter normal terminated: ' + normalTerminated); - done(); - }); - }); -}); diff --git a/test/testPackageFiles.js b/test/testPackageFiles.js deleted file mode 100644 index c600a605..00000000 --- a/test/testPackageFiles.js +++ /dev/null @@ -1,91 +0,0 @@ -/* jshint -W097 */ -/* jshint strict:false */ -/* jslint node: true */ -/* jshint expr: true */ -var expect = require('chai').expect; -var fs = require('fs'); - -describe('Test package.json and io-package.json', function() { - it('Test package files', function (done) { - console.log(); - - var fileContentIOPackage = fs.readFileSync(__dirname + '/../io-package.json', 'utf8'); - var ioPackage = JSON.parse(fileContentIOPackage); - - var fileContentNPMPackage = fs.readFileSync(__dirname + '/../package.json', 'utf8'); - var npmPackage = JSON.parse(fileContentNPMPackage); - - expect(ioPackage).to.be.an('object'); - expect(npmPackage).to.be.an('object'); - - expect(ioPackage.common.version, 'ERROR: Version number in io-package.json needs to exist').to.exist; - expect(npmPackage.version, 'ERROR: Version number in package.json needs to exist').to.exist; - - expect(ioPackage.common.version, 'ERROR: Version numbers in package.json and io-package.json needs to match').to.be.equal(npmPackage.version); - - if (!ioPackage.common.news || !ioPackage.common.news[ioPackage.common.version]) { - console.log('WARNING: No news entry for current version exists in io-package.json, no rollback in Admin possible!'); - console.log(); - } - - expect(npmPackage.author, 'ERROR: Author in package.json needs to exist').to.exist; - expect(ioPackage.common.authors, 'ERROR: Authors in io-package.json needs to exist').to.exist; - - if (ioPackage.common.name.indexOf('template') !== 0) { - if (Array.isArray(ioPackage.common.authors)) { - expect(ioPackage.common.authors.length, 'ERROR: Author in io-package.json needs to be set').to.not.be.equal(0); - if (ioPackage.common.authors.length === 1) { - expect(ioPackage.common.authors[0], 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name '); - } - } - else { - expect(ioPackage.common.authors, 'ERROR: Author in io-package.json needs to be a real name').to.not.be.equal('my Name '); - } - } - else { - console.log('WARNING: Testing for set authors field in io-package skipped because template adapter'); - console.log(); - } - expect(fs.existsSync(__dirname + '/../README.md'), 'ERROR: README.md needs to exist! Please create one with description, detail information and changelog. English is mandatory.').to.be.true; - if (!ioPackage.common.titleLang || typeof ioPackage.common.titleLang !== 'object') { - console.log('WARNING: titleLang is not existing in io-package.json. Please add'); - console.log(); - } - if ( - ioPackage.common.title.indexOf('iobroker') !== -1 || - ioPackage.common.title.indexOf('ioBroker') !== -1 || - ioPackage.common.title.indexOf('adapter') !== -1 || - ioPackage.common.title.indexOf('Adapter') !== -1 - ) { - console.log('WARNING: title contains Adapter or ioBroker. It is clear anyway, that it is adapter for ioBroker.'); - console.log(); - } - - if (ioPackage.common.name.indexOf('vis-') !== 0) { - if (!ioPackage.common.materialize || !fs.existsSync(__dirname + '/../admin/index_m.html') || !fs.existsSync(__dirname + '/../gulpfile.js')) { - console.log('WARNING: Admin3 support is missing! Please add it'); - console.log(); - } - if (ioPackage.common.materialize) { - expect(fs.existsSync(__dirname + '/../admin/index_m.html'), 'Admin3 support is enabled in io-package.json, but index_m.html is missing!').to.be.true; - } - } - - var licenseFileExists = fs.existsSync(__dirname + '/../LICENSE'); - var fileContentReadme = fs.readFileSync(__dirname + '/../README.md', 'utf8'); - if (fileContentReadme.indexOf('## Changelog') === -1) { - console.log('Warning: The README.md should have a section ## Changelog'); - console.log(); - } - expect((licenseFileExists || fileContentReadme.indexOf('## License') !== -1), 'A LICENSE must exist as LICENSE file or as part of the README.md').to.be.true; - if (!licenseFileExists) { - console.log('Warning: The License should also exist as LICENSE file'); - console.log(); - } - if (fileContentReadme.indexOf('## License') === -1) { - console.log('Warning: The README.md should also have a section ## License to be shown in Admin3'); - console.log(); - } - done(); - }); -}); diff --git a/widgets/template.html b/widgets/template.html deleted file mode 100644 index ff9e4cf9..00000000 --- a/widgets/template.html +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - - - - diff --git a/widgets/template/css/style.css b/widgets/template/css/style.css deleted file mode 100644 index 6c01b331..00000000 --- a/widgets/template/css/style.css +++ /dev/null @@ -1,3 +0,0 @@ -.template-class { - font-style: italic; -} diff --git a/widgets/template/img/test.png b/widgets/template/img/test.png deleted file mode 100644 index 883c891b..00000000 Binary files a/widgets/template/img/test.png and /dev/null differ diff --git a/widgets/template/js/template.js b/widgets/template/js/template.js deleted file mode 100644 index db1474c5..00000000 --- a/widgets/template/js/template.js +++ /dev/null @@ -1,68 +0,0 @@ -/* - ioBroker.template Widget-Set - - version: "0.5.0" - - Copyright 10.2015-2016 @@Author@@<@@email@@> - -*/ -"use strict"; - -// add translations for edit mode -if (vis.editMode) { - $.extend(true, systemDictionary, { - "myColor": {"en": "myColor", "de": "mainColor", "ru": "Мой цвет"}, - "myColor_tooltip": { - "en": "Description of\x0AmyColor", - "de": "Beschreibung von\x0AmyColor", - "ru": "Описание\x0AmyColor" - }, - "htmlText": {"en": "htmlText", "de": "htmlText", "ru": "htmlText"}, - "group_extraMyset": {"en": "extraMyset", "de": "extraMyset", "ru": "extraMyset"}, - "extraAttr": {"en": "extraAttr", "de": "extraAttr", "ru": "extraAttr"} - }); -} - -// add translations for non-edit mode -$.extend(true, systemDictionary, { - "Instance": {"en": "Instance", "de": "Instanz", "ru": "Инстанция"} -}); - -// this code can be placed directly in template.html -vis.binds.template = { - version: "0.5.0", - showVersion: function () { - if (vis.binds.template.version) { - console.log('Version template: ' + vis.binds.template.version); - vis.binds.template.version = null; - } - }, - createWidget: function (widgetID, view, data, style) { - var $div = $('#' + widgetID); - // if nothing found => wait - if (!$div.length) { - return setTimeout(function () { - vis.binds.template.createWidget(widgetID, view, data, style); - }, 100); - } - - var text = ''; - text += 'OID: ' + data.oid + '
'; - text += 'OID value: ' + vis.states[data.oid + '.val'] + '
'; - text += 'Color: ' + data.myColor + '
'; - text += 'extraAttr: ' + data.extraAttr + '
'; - text += 'Browser instance: ' + vis.instance + '
'; - text += 'htmlText:
'; - - $('#' + widgetID).html(text); - - // subscribe on updates of value - if (data.oid) { - vis.states.bind(data.oid + '.val', function (e, newVal, oldVal) { - $div.find('.template-value').html(newVal); - }); - } - } -}; - -vis.binds.template.showVersion(); diff --git a/www/README.md b/www/README.md deleted file mode 100644 index 3b8083a4..00000000 --- a/www/README.md +++ /dev/null @@ -1,2 +0,0 @@ -if you put files in this directory they will be uploaded to DB on adapter install/upgrade. -they can then be accessed via ioBroker WEB adapter http://<iobrokerIP>:8082/<adapter-name>/... \ No newline at end of file diff --git a/www/index.html b/www/index.html deleted file mode 100644 index 23d1ff7c..00000000 --- a/www/index.html +++ /dev/null @@ -1,4 +0,0 @@ -

template adapter

-

- -

\ No newline at end of file