Woongjae Lee
NHN Dooray - Frontend Team
Release History
===============
v3.2.3-win (2016-03-31)
-------------------
- <strong>Official version for Windows</strong>
- Thank you for your effort to improve ProtoPie for Windows.
- Beta test program is over on March 31, 2017 in KST.
- Please jump in and ride on the official version. ;)
v3.2.3 (2016-03-21)
-------------------
- <strong>Special thanks to Jaret(郑皓), 田中良樹, and Shue(尹舒)</strong> (in alphabetical order)
- Fixed the problem to lose images under a certain procedure
- Improved the stability of the application
- Added ProtoPie improvement program
v3.2.2 (2016-02-28)
-------------------
- (3.2.2) Fixed window control bug
v3.2.1 (2016-02-27)
-------------------
- (3.2.1) Fixed dialog bug
v3.2.0 (2016-02-27)
-------------------
- Replace image layers
- Copy and paste scenes across files
- Open recent files
- Rename Interaction Pieces' names
- Keyboard shortcuts for panning and zooming canvas panel
- Spinner interface to adjust values on the property panel
- Rebuilt Sketch Import feature
- Enhanced Preview's performance and interactions
- Improved usability and fixed minor bugs
v3.1.0 (2016-02-06)
-------------------
- Able to add Video layers and play them
- Able to scale layers by factor
- Able to align and distribute layers on the canvas panel
- Possible to copy and paste images from other graphic tools through clipboard
- Support Slide out transition among scenes
- Changed the short cut key for multi-selection from Command to Shift
- Fixed minor bugs
v3.0.1 (2016-01-17)
-------------------
- Enhanced panning feature on the canvas panel
- Tuned up reorder behaviors of interaction pieces
- Improved alert information for trial period
- Fixed installation problem caused by user locale setting
- Fixed minor bugs and improved performance
v3.0.0 (2016-01-05)
-------------------
- the Official version, v.3.0 Donut
- Offers PREVIEW on the desktop
- Generates intuitive default names for layers
- Improved the discard process while quitting
- Fixed minor bugs and improved the performance
v2.3.1 (2016-12-06)
-------------------
- Resolved the icon related issue
v2.3.0 (2016-12-05)
-------------------
- Conditional interactions by Condition and Range Trigger
- Android USB connection
- Adjustable hit area
- Fling Trigger
- Custom easing options such as Cubic Bezier and Spring
- Multi-selection and editing for layers and interaction pieces
- Floating menu for adding pieces between existing ones
v2.2.1 (2016-11-17)
-------------------
- [Hotfix] Sketch 버전 41 import 호환성 오류 수정
C:\Users\mark\electron-install>npm i electron
`-- electron@1.6.6
+-- electron-download@3.3.0
| +-- debug@2.6.4
| | `-- ms@0.7.3
| +-- fs-extra@0.30.0
| | +-- graceful-fs@4.1.11
| | +-- jsonfile@2.4.0
| | +-- klaw@1.3.1
| | +-- path-is-absolute@1.0.1
| | `-- rimraf@2.6.1
| | `-- glob@7.1.1
| | +-- fs.realpath@1.0.0
| | +-- inflight@1.0.6
| | | `-- wrappy@1.0.2
| | +-- minimatch@3.0.3
| | | `-- brace-expansion@1.1.7
| | | +-- balanced-match@0.4.2
| | | `-- concat-map@0.0.1
| | `-- once@1.4.0
| +-- home-path@1.0.5
| +-- minimist@1.2.0
| +-- nugget@2.0.1
| | +-- pretty-bytes@1.0.4
| | | +-- get-stdin@4.0.1
| | | `-- meow@3.7.0
| | | +-- camelcase-keys@2.1.0
| | | | `-- camelcase@2.1.1
| | | +-- decamelize@1.2.0
| | | +-- loud-rejection@1.6.0
| | | | +-- currently-unhandled@0.4.1
| | | | | `-- array-find-index@1.0.2
| | | | `-- signal-exit@3.0.2
| | | +-- map-obj@1.0.1
| | | +-- normalize-package-data@2.3.8
| | | | +-- hosted-git-info@2.4.2
| | | | +-- is-builtin-module@1.0.0
| | | | | `-- builtin-modules@1.1.1
| | | | `-- validate-npm-package-license@3.0.1
| | | | +-- spdx-correct@1.0.2
| | | | | `-- spdx-license-ids@1.2.2
| | | | `-- spdx-expression-parse@1.0.4
| | | +-- object-assign@4.1.1
| | | +-- read-pkg-up@1.0.1
| | | | +-- find-up@1.1.2
| | | | `-- read-pkg@1.1.0
| | | | +-- load-json-file@1.1.0
| | | | | +-- parse-json@2.2.0
| | | | | | `-- error-ex@1.3.1
| | | | | | `-- is-arrayish@0.2.1
| | | | | +-- pify@2.3.0
| | | | | `-- strip-bom@2.0.0
| | | | | `-- is-utf8@0.2.1
| | | | `-- path-type@1.1.0
| | | +-- redent@1.0.0
| | | | +-- indent-string@2.1.0
| | | | | `-- repeating@2.0.1
| | | | | `-- is-finite@1.0.2
| | | | `-- strip-indent@1.0.1
| | | `-- trim-newlines@1.0.0
| | +-- progress-stream@1.2.0
| | | +-- speedometer@0.1.4
| | | `-- through2@0.2.3
| | | +-- readable-stream@1.1.14
| | | | `-- isarray@0.0.1
| | | `-- xtend@2.1.2
| | | `-- object-keys@0.4.0
| | +-- request@2.81.0
| | | +-- aws-sign2@0.6.0
| | | +-- aws4@1.6.0
| | | +-- caseless@0.12.0
| | | +-- combined-stream@1.0.5
| | | | `-- delayed-stream@1.0.0
| | | +-- extend@3.0.0
| | | +-- forever-agent@0.6.1
| | | +-- form-data@2.1.4
| | | | `-- asynckit@0.4.0
| | | +-- har-validator@4.2.1
| | | | +-- ajv@4.11.7
| | | | | +-- co@4.6.0
| | | | | `-- json-stable-stringify@1.0.1
| | | | | `-- jsonify@0.0.0
| | | | `-- har-schema@1.0.5
| | | +-- hawk@3.1.3
| | | | +-- boom@2.10.1
| | | | +-- cryptiles@2.0.5
| | | | +-- hoek@2.16.3
| | | | `-- sntp@1.0.9
| | | +-- http-signature@1.1.1
| | | | +-- assert-plus@0.2.0
| | | | +-- jsprim@1.4.0
| | | | | +-- assert-plus@1.0.0
| | | | | +-- extsprintf@1.0.2
| | | | | +-- json-schema@0.2.3
| | | | | `-- verror@1.3.6
| | | | `-- sshpk@1.13.0
| | | | +-- asn1@0.2.3
| | | | +-- assert-plus@1.0.0
| | | | +-- bcrypt-pbkdf@1.0.1
| | | | +-- dashdash@1.14.1
| | | | | `-- assert-plus@1.0.0
| | | | +-- ecc-jsbn@0.1.1
| | | | +-- getpass@0.1.7
| | | | | `-- assert-plus@1.0.0
| | | | +-- jodid25519@1.0.2
| | | | +-- jsbn@0.1.1
| | | | `-- tweetnacl@0.14.5
| | | +-- is-typedarray@1.0.0
| | | +-- isstream@0.1.2
| | | +-- json-stringify-safe@5.0.1
| | | +-- mime-types@2.1.15
| | | | `-- mime-db@1.27.0
| | | +-- oauth-sign@0.8.2
| | | +-- performance-now@0.2.0
| | | +-- qs@6.4.0
| | | +-- safe-buffer@5.0.1
| | | +-- stringstream@0.0.5
| | | +-- tough-cookie@2.3.2
| | | | `-- punycode@1.4.1
| | | +-- tunnel-agent@0.6.0
| | | `-- uuid@3.0.1
| | +-- single-line-log@1.1.2
| | | `-- string-width@1.0.2
| | | +-- code-point-at@1.1.0
| | | +-- is-fullwidth-code-point@1.0.0
| | | | `-- number-is-nan@1.0.1
| | | `-- strip-ansi@3.0.1
| | | `-- ansi-regex@2.1.1
| | `-- throttleit@0.0.2
| +-- path-exists@2.1.0
| | `-- pinkie-promise@2.0.1
| | `-- pinkie@2.0.4
| +-- rc@1.2.1
| | +-- deep-extend@0.4.1
| | +-- ini@1.3.4
| | `-- strip-json-comments@2.0.1
| +-- semver@5.3.0
| `-- sumchecker@1.3.1
| `-- es6-promise@4.1.0
`-- extract-zip@1.6.0
+-- concat-stream@1.5.0
| +-- inherits@2.0.3
| +-- readable-stream@2.0.6
| | +-- core-util-is@1.0.2
| | +-- isarray@1.0.0
| | +-- process-nextick-args@1.0.7
| | +-- string_decoder@0.10.31
| | `-- util-deprecate@1.0.2
| `-- typedarray@0.0.6
+-- debug@0.7.4
+-- mkdirp@0.5.0
| `-- minimist@0.0.8
`-- yauzl@2.4.1
`-- fd-slicer@1.0.1
`-- pend@1.2.0
{
"name": "ProtoPie-Authoring",
"productName": "ProtoPie",
"companyName": "Studio XID",
"version": "3.3.0-qa.1",
"author": "Studio XID <eng@protopie.io> (https://protopie.io)",
"description": "Super-Awesome Interaction Prototyping Tool",
"homepage": "https://www.protopie.io/",
"main": "./output/electron/main.js",
"private": true,
"scripts": {
"start": "electron ."
},
"devDependencies": {
"electron": "1.4.15"
}
}
C:\Users\mark\electron-install>type node_modules\electron\path.txt
dist/electron.exe
// macOS
electron/Electron.app/Contents/Resources/app/
├── package.json
├── main.js
└── index.html
// macOS - asar
electron/Electron.app/Contents/Resources/
└── app.asar
// Windows
electron/resources/app
├── package.json
├── main.js
└── index.html
// Windows - asar
electron/resources/
└── app.asar
// 업데이트 서버 주소 설정 및 초기화
autoUpdater.setFeedURL(`http://127.0.0.1:${port}/update/latest`);
// 업데이트 있는지 체크
autoUpdater.checkForUpdates();
// 업데이트 파일이 다운로드 다 되었는지 확인하는 이벤트 바인딩
autoUpdater.on('update-downloaded', async() => {
// 앱 종료 후 업데이트 후 재시작
autoUpdater.quitAndInstall();
});
http://download.myapp.com/update/win32/:version/RELEASES
http://download.myapp.com/update/win64/:version/RELEASES
http://download.myapp.com/update/win32/:version/:channel/RELEASES
http://download.myapp.com/update/win64/:version/:channel/RELEASES
; 프로그램 전체에 대한 설정을 정의한다.
[Setup]
AppId={#AppId}
AppName={#NameLong}
AppVerName={#NameVersion}
AppPublisher=Studio XID, Inc.
AppPublisherURL={#Homepage}
AppSupportURL={#Homepage}docs/
;AppUpdatesURL={#Homepage}
DefaultDirName={pf}\{#DirName}
DefaultGroupName={#NameLong}
AllowNoIcons=yes
OutputDir={#RepoDir}\dist
OutputBaseFilename=ProtoPie-{#Version}-Setup
Compression=lzma
SolidCompression=yes
AppMutex={#AppMutex}
WizardImageFile={#RepoDir}\build\win32\inno_big.bmp
WizardSmallImageFile={#RepoDir}\build\win32\inno_small.bmp
SetupIconFile={#RepoDir}\build\win32\icon_setup.ico
UninstallDisplayIcon={app}\{#ExeBasename}.exe
ChangesEnvironment=true
ChangesAssociations=true
MinVersion=6.1.7600
SourceDir={#SourceDir}
AppVersion={#Version}
VersionInfoVersion={#RawVersion}
ShowLanguageDialog=auto
CloseApplications=force
; PrivilegesRequired=admin
; 프로그램이 사용하는 언어를 정의한다.
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl,{#RepoDir}\build\win32\i18n\messages.en.isl"
Name: "simplifiedChinese"; MessagesFile: "{#RepoDir}\build\win32\i18n\Default.zh-cn.isl,{#RepoDir}\build\win32\i18n\messages.zh-cn.isl"
; 설치시에 제거 할 파일이 있으면 정의한다.
[InstallDelete]
Type: filesandordirs; Name: {app}\resources
; 설치 프로세스를 사용자 측에서 상세하게 설정하는 경우에 각각의 처리(작업)에 대해 정의한다.
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
Name: "associatewithfiles"; Description: "{cm:AssociateWithFiles,{#NameShort}}"; GroupDescription: "{cm:Other}"
Name: "runcode"; Description: "{cm:RunAfter,{#NameShort}}"; GroupDescription: "{cm:Other}"; Check: WizardSilent
...
// make `ProtoPie-${Version}-Setup.exe` file
npm run pack-prod
// make `${Version}.json` file
// upload to S3 - `${Version.json}` file, `ProtoPie-${Version}-Setup.exe` file
npm run deploy
{
"url": "http://release.protopie.io/ProtoPie-3.2.3-mac.zip",
"name": "3.2.3",
"notes": "## 3.2.3\n### 3.2.3\n- <strong>Special thanks to Jaret(郑皓), 田中良樹, and Shue(尹舒)</strong> (in alphabetical order)\n- Fixed the problem to lose images under a certain procedure\n- Improved the stability of the application\n- Added ProtoPie improvement program\nmetadata:{\"osx\":{\"size\":75391013,\"checksum\":\"39432d1cb5b4214515a443d4bec719e9d2b787ab\"}}\n## 3.2.2\n### 3.2.2\n- (3.2.2) Fixed window control bug\n- (3.2.1) Fixed dialog bug\n- Replace image layers\n- Copy and paste scenes across files\n- Open recent files\n- Rename Interaction Pieces' names\n- Keyboard shortcuts for panning and zooming canvas panel\n- Spinner interface to adjust values on the property panel\n- Rebuilt Sketch Import feature\n- Enhanced Preview's performance and interactions\n- Improved usability and fixed minor bugs\nmetadata:{\"osx\":{\"size\":72656810,\"checksum\":\"4c45300147ac566e6cb5975cd7c637da0a3d6fcd\"}}",
"metadata": {
"osx": {
"size": 75391013,
"checksum": "39432d1cb5b4214515a443d4bec719e9d2b787ab"
}
},
"pub_date": "2017-03-21T09:54:30.939Z"
}
{
"version": "3.2.3",
"note": "### 3.2.3\n- <strong>Special thanks to Jaret(郑皓), 田中良樹, and Shue(尹舒)</strong> (in alphabetical order)\n- Fixed the problem to lose images under a certain procedure\n- Improved the stability of the application\n- Added ProtoPie improvement program",
"file": "ProtoPie-3.2.3-mac.zip",
"metadata": {
"osx": {
"size": 75391013,
"checksum": "39432d1cb5b4214515a443d4bec719e9d2b787ab"
}
},
"pub_date": "2017-03-21T09:54:30.939Z",
"state": "enabled"
}
{
"version": "3.2.3",
"note": "### 3.2.3\n- <strong>Official version for Windows</strong>\n- Thank you for your effort to improve ProtoPie for Windows.\n- Beta test program is over on March 31, 2017 in KST.\n- Please jump in and ride on the official version. ;)",
"file": "ProtoPie-3.2.3-Setup.exe",
"metadata": {
"win32": {
"size": 55642520,
"checksum": "5df925f649af2924e48bbd935eb9a3f4807bad65"
}
},
"pub_date": "2017-03-31T05:55:56.133Z",
"state": "enabled"
}
import * as semver from 'semver';
semver.gt(version, '3.3.0');
semver.lte(version, '3.1.0')
// 라우팅 핸들러 설정
router.get('/:platform/:version/', ctrl.index);
// 라우팅 함수
async function index(req, res) {
// 플랫폼과 버전을 받음
const platform: string = req.params.platform;
const version: string = req.params.version;
if (platform !== 'darwin_x64' && platform !== 'win32') {
return res.status(400).end();
}
if (semver.valid(version) === null) {
return res.status(400).end();
}
// 버전 관리자를 통해 S3 로 부터 최신 버전 리스트를 업데이트
const versionManager: IVersionManager = VersionManager.getInstance();
await versionManager.update();
// 최신 버전 리스트에서 요청받은 플랫폼과 버전레 맞춰 response 에 담을 내용을 만들어 냄.
const result = versionManager.getResult(platform, version);
if (result) {
res.json(result);
} else {
res.sendStatus(204);
}
}
export class VersionManager implements IVersionManager {
// 매니저는 단일 객체
public getResult(platfrom: string, version: string) {
const platfromId: string = (platfrom === 'darwin_x64') ? 'darwin' : platfrom;
const versionInPlatform: IVersion[] = this._versionList.filter(v => {
if ((v.getPlatform() === platfromId) && semver.gt(v.getVersion(), version)) {
if (MODE === 'production' || MODE === 'qa') {
return v.getState() === 'enabled';
} else {
return v.getState() !== 'disabled';
}
} else {
return false;
}
});
versionInPlatform.sort((l, r) => semver.gt(l.getVersion(), r.getVersion()) ? -1 : 1);
if (versionInPlatform.length > 0) {
const url = versionInPlatform[0].getFile();
const name = versionInPlatform[0].getVersion();
const notes = this._getNotes(versionInPlatform);
const metadata = versionInPlatform[0].getMetadata();
const pub_date = versionInPlatform[0].getDate();
return {
url,
name,
notes,
metadata,
pub_date
};
} else {
return null;
}
}
public async update(): Promise<void> {
let s3List = null;
try {
s3List = await getS3List();
} catch (e) {
await sendSNS('Autoupdate Server : getS3List 실패', '자동업데이트 서버에서 S3 로 부터 JSON 리스트를 읽어오다가 실패함.');
return;
}
let s3Objects = null;
try {
s3Objects = await getS3Objects(s3List);
} catch (e) {
await sendSNS('Autoupdate Server : getS3Objects 실패', '자동업데이트 서버에서 S3 로 부터 JSON 파일을 읽어오다가 실패함.');
return;
}
this._setVersions(s3List, s3Objects);
}
private _setVersions(s3List: any[], s3Objects: any[]): void {
this._versionList = [];
s3List.forEach((item, index) => {
this._versionList.push(new Version(s3List[index], s3Objects[index]));
});
}
private _getNotes(versionInPlatform): string {
const notes = [];
versionInPlatform.forEach((item, index) => {
if (index < 3) {
notes.push(`## ${item.getVersion()}\n${item.getNote()}\nmetadata:${JSON.stringify(item.getMetadata())}`);
}
});
return notes.join('\n');
}
}
By Woongjae Lee
일렉트론 코리아 4월 밋업 발표