├── script ├── codesign.cmd ├── remove-key ├── make-docs ├── build.cmd ├── add-key.cmd ├── add-key ├── lint ├── build ├── build-darwin ├── utils │ └── child-process-wrapper.js ├── run-ci-specs └── build-windows.ps1 ├── .gitignore ├── .atomrc ├── .env.template ├── docs └── signing.md ├── ci ├── win.yml ├── win-x64.yml └── darwin.yml └── README.md /script/codesign.cmd: -------------------------------------------------------------------------------- 1 | "%SIGNTOOL_PATH%" sign %* 2 | -------------------------------------------------------------------------------- /script/remove-key: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | security delete-keychain $XCODE_KEYCHAIN 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | npm-debug.log 3 | node_modules 4 | dist/ 5 | .env 6 | env.ps1 7 | build/resources/particle-code-signing-cert.p12 8 | atomrc.cmd 9 | -------------------------------------------------------------------------------- /.atomrc: -------------------------------------------------------------------------------- 1 | export ATOM_VERSION=v1.19.1 2 | export ATOM_ELECTRON_VERSION=1.6.9 3 | export ATOM_PUBLISH_REPO=spark/particle-dev-app 4 | export PARTICLE_DEV_VERSION=0.2.2 5 | -------------------------------------------------------------------------------- /script/make-docs: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ROOT=$(cd "$(dirname "$0")"; cd ..; pwd) 3 | echo "Generating documentation..." 4 | find ${ROOT}/lib/ -name '*.coffee' | xargs docco -o ${ROOT}/docs/ 5 | -------------------------------------------------------------------------------- /script/build.cmd: -------------------------------------------------------------------------------- 1 | @type .atomrc | powershell -Command "$input | ForEach-Object { $_ -replace \"export \", \"@SET \" }" > atomrc.cmd 2 | @call .\atomrc.cmd 3 | @IF EXIST "%~dp0\node.exe" ( 4 | "%~dp0\node.exe" "%~dp0\build" %* 5 | ) ELSE ( 6 | node "%~dp0\build" %* 7 | ) 8 | -------------------------------------------------------------------------------- /script/add-key.cmd: -------------------------------------------------------------------------------- 1 | openssl aes-256-cbc -k %ENCRYPTION_SECRET% -md md5 -in %ATOM_WIN_CODE_SIGNING_ENC_CERT_PATH% -out %ATOM_WIN_CODE_SIGNING_CERT_PATH% -a -d 2 | certutil -p %ATOM_WIN_CODE_SIGNING_CERT_PASSWORD% -user -importpfx .\build\resources\particle-code-signing-cert.p12 NoRoot 3 | -------------------------------------------------------------------------------- /script/add-key: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | security create-keychain -p $XCODE_KEYCHAIN_PASSWORD $XCODE_KEYCHAIN 3 | security import ./build/resources/cert.cer -k ~/Library/Keychains/$XCODE_KEYCHAIN -T /usr/bin/codesign 4 | security import ./build/resources/key.p12 -k ~/Library/Keychains/$XCODE_KEYCHAIN -P $KEY_PASSWORD -T /usr/bin/codesign 5 | security list-keychains -d user -s login.keychain $XCODE_KEYCHAIN 6 | -------------------------------------------------------------------------------- /.env.template: -------------------------------------------------------------------------------- 1 | export JANKY_SHA1=`git rev-parse --short HEAD` 2 | export JANKY_BRANCH=stable 3 | export TRAVIS=1 4 | export ATOM_ACCESS_TOKEN= 5 | export XCODE_KEYCHAIN=osx-build.keychain 6 | export XCODE_KEYCHAIN_PASSWORD= 7 | export KEY_PASSWORD= 8 | export BUILD_ATOM_RELEASES_S3_BUCKET=particle-dev-releases 9 | export BUILD_ATOM_RELEASES_S3_KEY= 10 | export BUILD_ATOM_RELEASES_S3_SECRET= 11 | -------------------------------------------------------------------------------- /docs/signing.md: -------------------------------------------------------------------------------- 1 | ## Signing for Windows 2 | 3 | This repo contains `aes-256-cbc` encrypted signing certificate called `particle-code-signing-cert.p12.enc`. To decrypt it you need to know `ENCRYPTION_SECRET`. 4 | 5 | ### Encrypting a new certificate 6 | 7 | As certificate expires after a year it's nessesary to update the encrypted version using: 8 | 9 | `$ openssl aes-256-cbc -k $ENCRYPTION_SECRET -in particle-code-signing-cert.p12 -out particle-code-signing-cert.p12.enc -e -a` 10 | -------------------------------------------------------------------------------- /script/lint: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ROOT=$(cd "$(dirname "$0")"; cd ..; pwd) 3 | echo "Linting code..." 4 | find ${ROOT}/lib/ -name '*.coffee' | xargs coffee-jshint --globals atom,module,require,setTimeout,clearTimeout,setInterval,clearInterval,window,localStorage,__dirname,process 5 | echo "Linting tests..." 6 | find ${ROOT}/spec/ -name '*.coffee' | xargs coffee-jshint --globals atom,module,require,setTimeout,clearTimeout,setInterval,clearInterval,window,localStorage,__dirname,process,describe,it,expect,beforeEach,afterEach,waitsForPromise,waitsFor,runs,spyOn,jasmine 7 | -------------------------------------------------------------------------------- /script/build: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | var cp = require('./utils/child-process-wrapper.js'); 3 | var path = require('path'); 4 | 5 | var binSuffix = (process.platform === 'win32' ? '.cmd' : ''); 6 | 7 | console.log('Building', process.env.JANKY_BRANCH, '@', process.env.JANKY_SHA1); 8 | 9 | process.chdir('build'); 10 | console.log('Bootstrapping build...'); 11 | cp.safeSpawn('npm' + binSuffix, ['install'], function(){ 12 | process.chdir(path.dirname(__dirname)); 13 | var gruntPath = path.join('build', 'node_modules', '.bin', 'grunt') + binSuffix; 14 | var args = ['--gruntfile', path.resolve('build', 'Gruntfile.coffee')]; 15 | args = args.concat(process.argv.slice(2)); 16 | console.log('Building using ' + gruntPath); 17 | cp.safeSpawn(gruntPath, args, process.exit); 18 | }); 19 | -------------------------------------------------------------------------------- /ci/win.yml: -------------------------------------------------------------------------------- 1 | platform: windows 2 | 3 | params: 4 | NODE_ARCH: 32 5 | JANKY_BRANCH: stable 6 | TRAVIS: 1 7 | CI: 1 8 | BUILD_NODE_VERSION: 6.9.4 9 | npm_config_runtime: electron 10 | BUILD_ATOM_RELEASES_S3_BUCKET: particle-dev-releases 11 | IS_RELEASE: ((IS_RELEASE)) 12 | ENCRYPTION_SECRET: ((ENCRYPTION_SECRET)) 13 | ATOM_ACCESS_TOKEN: ((ATOM_ACCESS_TOKEN)) 14 | KEY_PASSWORD: ((ATOM_WIN_CODE_SIGNING_CERT_PASSWORD)) 15 | ATOM_WIN_CODE_SIGNING_CERT_PASSWORD: ((ATOM_WIN_CODE_SIGNING_CERT_PASSWORD)) 16 | BUILD_ATOM_RELEASES_S3_KEY: ((BUILD_ATOM_RELEASES_S3_KEY)) 17 | BUILD_ATOM_RELEASES_S3_SECRET: ((BUILD_ATOM_RELEASES_S3_SECRET)) 18 | 19 | run: 20 | path: powershell.exe 21 | args: ["sources/script/build-windows.ps1"] 22 | 23 | inputs: 24 | - name: sources 25 | 26 | outputs: 27 | - name: artefacts 28 | -------------------------------------------------------------------------------- /ci/win-x64.yml: -------------------------------------------------------------------------------- 1 | platform: windows 2 | 3 | params: 4 | NODE_ARCH: 64 5 | JANKY_BRANCH: stable 6 | TRAVIS: 1 7 | CI: 1 8 | BUILD_NODE_VERSION: 6.9.4 9 | npm_config_runtime: electron 10 | BUILD_ATOM_RELEASES_S3_BUCKET: particle-dev-releases 11 | IS_RELEASE: ((IS_RELEASE)) 12 | ENCRYPTION_SECRET: ((ENCRYPTION_SECRET)) 13 | ATOM_ACCESS_TOKEN: ((ATOM_ACCESS_TOKEN)) 14 | KEY_PASSWORD: ((ATOM_WIN_CODE_SIGNING_CERT_PASSWORD)) 15 | ATOM_WIN_CODE_SIGNING_CERT_PASSWORD: ((ATOM_WIN_CODE_SIGNING_CERT_PASSWORD)) 16 | BUILD_ATOM_RELEASES_S3_KEY: ((BUILD_ATOM_RELEASES_S3_KEY)) 17 | BUILD_ATOM_RELEASES_S3_SECRET: ((BUILD_ATOM_RELEASES_S3_SECRET)) 18 | 19 | run: 20 | path: powershell.exe 21 | args: ["sources/script/build-windows.ps1"] 22 | 23 | inputs: 24 | - name: sources 25 | 26 | outputs: 27 | - name: artefacts 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Particle Dev 2 | 3 | Particle Dev is a professional, open source, hackable IDE, designed for use with the Particle devices. 4 | 5 | ## Installing 6 | 7 | Here you can download latest version of Particle Dev. It will automatically update when a new release is available. 8 | 9 | ### Mac OS X 10 | 11 | Download the latest [Particle Dev release](https://github.com/particle-iot/particle-dev-app/releases/latest). 12 | 13 | ### Windows 14 | 15 | Download the latest [Particle Dev release](https://github.com/particle-iot/particle-dev-app/releases/latest). 16 | 17 | ### Linux 18 | 19 | Install [Atom](https://atom.io/) through your package manager and run `apm install particle-dev-complete` 20 | 21 | ## Using 22 | 23 | See [our documentation](https://docs.particle.io/guide/tools-and-features/dev/) to learn about how to use Particle Dev for software development. 24 | -------------------------------------------------------------------------------- /ci/darwin.yml: -------------------------------------------------------------------------------- 1 | platform: darwin 2 | 3 | params: 4 | JANKY_BRANCH: stable 5 | TRAVIS: 1 6 | CI: 1 7 | HOME: /Users/administrator 8 | XCODE_KEYCHAIN: osx-build.keychain 9 | ATOM_MAC_CODE_SIGNING_KEYCHAIN: osx-build.keychain 10 | NODE_VERSION: 6.9.4 11 | BUILD_NODE_VERSION: 6.9.4 12 | BUILD_ATOM_RELEASES_S3_BUCKET: particle-dev-releases 13 | IS_RELEASE: ((IS_RELEASE)) 14 | PARTICLE_DEV_VERSION: ((PARTICLE_DEV_VERSION)) 15 | ATOM_ACCESS_TOKEN: ((ATOM_ACCESS_TOKEN)) 16 | XCODE_KEYCHAIN_PASSWORD: ((XCODE_KEYCHAIN_PASSWORD)) 17 | KEY_PASSWORD: ((KEY_PASSWORD)) 18 | ATOM_MAC_CODE_SIGNING_KEYCHAIN_PASSWORD: ((XCODE_KEYCHAIN_PASSWORD)) 19 | ATOM_MAC_CODE_SIGNING_CERT_PASSWORD: ((KEY_PASSWORD)) 20 | BUILD_ATOM_RELEASES_S3_KEY: ((BUILD_ATOM_RELEASES_S3_KEY)) 21 | BUILD_ATOM_RELEASES_S3_SECRET: ((BUILD_ATOM_RELEASES_S3_SECRET)) 22 | 23 | run: 24 | path: sources/script/build-darwin 25 | 26 | inputs: 27 | - name: sources 28 | 29 | outputs: 30 | - name: artefacts 31 | -------------------------------------------------------------------------------- /script/build-darwin: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # set -e -x 4 | function realpath { echo $(cd $(dirname $1); pwd)/$(basename $1); } 5 | 6 | BASH_SOURCE_PATH=`dirname $BASH_SOURCE` 7 | SCRIPT_PATH=`realpath $BASH_SOURCE_PATH` 8 | BUILD_PATH=`realpath $SCRIPT_PATH/../build` 9 | RESOURCES_PATH=$BUILD_PATH/resources 10 | 11 | # Cache buster 12 | # rm -rf sources/build/node_modules && rm -rf sources/dist/atom-work-dir/node_modules 13 | 14 | # install 15 | git clone https://github.com/creationix/nvm.git .nvm 16 | source .nvm/nvm.sh 17 | nvm install $BUILD_NODE_VERSION 18 | nvm use --delete-prefix $BUILD_NODE_VERSION 19 | 20 | cd sources 21 | # before_script 22 | export ATOM_MAC_CODE_SIGNING_CERT_PATH="$RESOURCES_PATH/key.p12" 23 | ./script/add-key 24 | export JANKY_SHA1=`git rev-parse --short HEAD` 25 | source .atomrc 26 | 27 | # script 28 | ./script/build 29 | 30 | # after_script 31 | ./script/remove-key 32 | cd .. 33 | 34 | # Move the artefacts 35 | cp -R sources/dist/atom-work-dir/out/ artefacts 36 | -------------------------------------------------------------------------------- /script/utils/child-process-wrapper.js: -------------------------------------------------------------------------------- 1 | var childProcess = require('child_process'); 2 | 3 | // Exit the process if the command failed and only call the callback if the 4 | // command succeed, output of the command would also be piped. 5 | exports.safeExec = function(command, options, callback) { 6 | if (!callback) { 7 | callback = options; 8 | options = {}; 9 | } 10 | if (!options) 11 | options = {}; 12 | 13 | // This needed to be increased for `apm test` runs that generate many failures 14 | // The default is 200KB. 15 | options.maxBuffer = 1024 * 1024; 16 | 17 | var child = childProcess.exec(command, options, function(error, stdout, stderr) { 18 | if (error) 19 | process.exit(error.code || 1); 20 | else 21 | callback(null); 22 | }); 23 | child.stderr.pipe(process.stderr); 24 | if (!options.ignoreStdout) 25 | child.stdout.pipe(process.stdout); 26 | } 27 | 28 | // Same with safeExec but call child_process.spawn instead. 29 | exports.safeSpawn = function(command, args, options, callback) { 30 | if (!callback) { 31 | callback = options; 32 | options = {}; 33 | } 34 | var child = childProcess.spawn(command, args, options); 35 | child.stderr.pipe(process.stderr); 36 | child.stdout.pipe(process.stdout); 37 | child.on('exit', function(code) { 38 | if (code != 0) 39 | process.exit(code); 40 | else 41 | callback(null); 42 | }); 43 | } 44 | -------------------------------------------------------------------------------- /script/run-ci-specs: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # Based on build-package.sh 3 | 4 | source .atomrc 5 | 6 | echo "Downloading Atom ${ATOM_VERSION} release..." 7 | curl -s -L "https://github.com/atom/atom/releases/download/${ATOM_VERSION}/atom-mac.zip" \ 8 | -H 'Accept: application/octet-stream' \ 9 | -o atom.zip 10 | 11 | mkdir atom 12 | unzip -q atom.zip -d atom 13 | export PATH=$PWD/atom/Atom.app/Contents/Resources/app/apm/bin:$PATH 14 | 15 | echo "Using Atom version:" 16 | ATOM_PATH=./atom ./atom/Atom.app/Contents/Resources/app/atom.sh -v 17 | 18 | echo "Downloading package dependencies..." 19 | atom/Atom.app/Contents/Resources/app/apm/node_modules/.bin/apm clean 20 | atom/Atom.app/Contents/Resources/app/apm/node_modules/.bin/apm install 21 | 22 | TEST_PACKAGES="${APM_TEST_PACKAGES:=none}" 23 | 24 | if [ "$TEST_PACKAGES" != "none" ]; then 25 | echo "Installing atom package dependencies..." 26 | for pack in $TEST_PACKAGES ; do 27 | atom/Atom.app/Contents/Resources/app/apm/node_modules/.bin/apm install $pack 28 | done 29 | fi 30 | 31 | if [ -f ./node_modules/.bin/coffeelint ]; then 32 | if [ -d ./lib ]; then 33 | echo "Linting package..." 34 | ./node_modules/.bin/coffeelint lib 35 | rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi 36 | fi 37 | if [ -d ./spec ]; then 38 | echo "Linting package specs..." 39 | ./node_modules/.bin/coffeelint spec 40 | rc=$?; if [[ $rc != 0 ]]; then exit $rc; fi 41 | fi 42 | fi 43 | 44 | echo "Running specs..." 45 | ATOM_PATH=./atom atom/Atom.app/Contents/Resources/app/apm/node_modules/.bin/apm test --path atom/Atom.app/Contents/Resources/app/atom.sh 46 | 47 | exit 48 | -------------------------------------------------------------------------------- /script/build-windows.ps1: -------------------------------------------------------------------------------- 1 | Remove-Item C:\atom-work-dir -recurse 2 | 3 | echo "--> Installing Node.js..." 4 | $env:NVM_HOME = "C:\ProgramData\nvm" 5 | $env:Path += ";$env:NVM_HOME" 6 | #nvm install $env:BUILD_NODE_VERSION 7 | nvm use $env:BUILD_NODE_VERSION $env:NODE_ARCH 8 | $env:Path += ";$env:NVM_HOME\v$env:BUILD_NODE_VERSION" 9 | #npm install -g npm 10 | 11 | echo "--> Adding other dependencies..." 12 | $env:Path += ";C:\Users\Administrator\.windows-build-tools\python27" 13 | choco install patch 14 | $env:Path += ";C:\ProgramData\chocolatey\lib\patch\tools\bin" 15 | choco install git 16 | $env:Path += ";C:\Program Files\Git\bin" 17 | choco install 7zip 18 | $env:Path += ";c:\program files\7-zip" 19 | 20 | cd sources 21 | echo "--> Adding signing key..." 22 | choco install openssl.light 23 | $env:Path += ";c:\Program Files\OpenSSL\bin" 24 | $env:Pwd = (Get-Item -Path ".\" -Verbose).FullName 25 | $env:ATOM_WIN_CODE_SIGNING_CERT_PATH = "$env:Pwd\build\resources\particle-code-signing-cert.p12" 26 | $env:ATOM_WIN_CODE_SIGNING_ENC_CERT_PATH = "$env:Pwd\build\resources\particle-code-signing-cert.p12.enc" 27 | .\script\add-key.cmd 28 | 29 | # Set env 30 | $env:USERPROFILE = "c:\home" 31 | $env:Path += ";C:\Windows\SysWOW64\config\systemprofile\.windows-build-tools\python27\" 32 | $env:Path += ";$env:NVM_HOME\v$env:BUILD_NODE_VERSION\node_modules\.bin" 33 | $env:Path += ";$env:NVM_HOME\v$env:BUILD_NODE_VERSION\node_modules\npm\bin\node-gyp-bin" 34 | $env:Path += ";$env:NVM_HOME\v$env:BUILD_NODE_VERSION\windows-build-tools\node_modules\.bin" 35 | $env:GYP_MSVS_VERSION = "2015" 36 | 37 | echo "--> Starting build..." 38 | .\script\build.cmd 39 | cd .. 40 | 41 | echo "--> Copying artifacts..." 42 | $env:Pwd = (Get-Item -Path ".\" -Verbose).FullName 43 | $sourceDir = "c:\atom-work-dir\out" 44 | $targetDir = "$env:Pwd\artefacts" 45 | Get-ChildItem -Path $sourceDir | Copy-Item -Destination $targetDir -Recurse -Container 46 | --------------------------------------------------------------------------------