@interopio/iocd-cli 0.0.41 → 0.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +795 -782
- package/dist/services/license.service.js +14 -14
- package/dist/services/modifications/modifications.service.js +14 -0
- package/dist/services/modifications/modifications.service.js.map +1 -1
- package/dist/templates/groups/apps/groups/.gitignore.template +23 -23
- package/dist/templates/groups/apps/groups/README.md +15 -15
- package/dist/templates/groups/apps/groups/config/web-group-dev.json +12 -12
- package/dist/templates/groups/apps/groups/index.html +17 -17
- package/dist/templates/groups/apps/groups/iocd.app.json +19 -19
- package/dist/templates/groups/apps/groups/package.json +25 -25
- package/dist/templates/groups/apps/groups/public/manifest.json +24 -24
- package/dist/templates/groups/apps/groups/public/robots.txt +3 -3
- package/dist/templates/groups/apps/groups/src/App.css +38 -38
- package/dist/templates/groups/apps/groups/src/App.tsx +11 -11
- package/dist/templates/groups/apps/groups/src/index.css +13 -13
- package/dist/templates/groups/apps/groups/src/index.tsx +19 -19
- package/dist/templates/groups/apps/groups/vite.config.ts +8 -8
- package/dist/templates/groups/template.json +12 -12
- package/dist/templates/ioconnect-desktop/.github/actions/setup-smctl/action.yml +121 -121
- package/dist/templates/ioconnect-desktop/.github/workflows/build.yml +395 -395
- package/dist/templates/ioconnect-desktop/.gitignore.template +15 -15
- package/dist/templates/ioconnect-desktop/README.md +795 -782
- package/dist/templates/ioconnect-desktop/config/forge.config.js +38 -38
- package/dist/templates/ioconnect-desktop/config/iocd.cli.config.json +16 -16
- package/dist/templates/ioconnect-desktop/config/mac-build/entitlements.mac.plist +44 -44
- package/dist/templates/ioconnect-desktop/config/win-build/template.nuspectemplate +32 -32
- package/dist/templates/ioconnect-desktop/modifications/base/iocd/config/system.json.merge +2 -2
- package/dist/templates/ioconnect-desktop/modifications/base/iocd/config/system.json.merge-autoUpdate +9 -9
- package/dist/templates/ioconnect-desktop/package.json +33 -33
- package/dist/templates/ioconnect-desktop/template.json +6 -6
- package/dist/templates/launchpad/apps/launchpad/.eslintrc.json +3 -3
- package/dist/templates/launchpad/apps/launchpad/.gitignore.template +1 -1
- package/dist/templates/launchpad/apps/launchpad/config/iocd.app.def.dev.json +56 -56
- package/dist/templates/launchpad/apps/launchpad/config/iocd.system.build.json +2 -2
- package/dist/templates/launchpad/apps/launchpad/config/iocd.system.dev.json +2 -2
- package/dist/templates/launchpad/apps/launchpad/index.html +16 -16
- package/dist/templates/launchpad/apps/launchpad/iocd.app.json +27 -27
- package/dist/templates/launchpad/apps/launchpad/package-lock.json +2778 -2778
- package/dist/templates/launchpad/apps/launchpad/package.json +21 -21
- package/dist/templates/launchpad/apps/launchpad/src/app/app.tsx +41 -41
- package/dist/templates/launchpad/apps/launchpad/src/app/constants.ts +27 -27
- package/dist/templates/launchpad/apps/launchpad/src/components/logo.tsx +11 -11
- package/dist/templates/launchpad/apps/launchpad/src/components/main-context-menu.tsx +161 -161
- package/dist/templates/launchpad/apps/launchpad/src/components/notifications-button.tsx +44 -44
- package/dist/templates/launchpad/apps/launchpad/src/main.tsx +6 -6
- package/dist/templates/launchpad/apps/launchpad/src/styles.css +16 -16
- package/dist/templates/launchpad/apps/launchpad/tsconfig.json +10 -10
- package/dist/templates/launchpad/apps/launchpad/vite.config.ts +13 -13
- package/dist/templates/launchpad/template.json +12 -12
- package/dist/templates/splash/apps/splash/assets/styles/style.css +39 -39
- package/dist/templates/splash/apps/splash/iocd.app.json +7 -7
- package/dist/templates/splash/apps/splash/script.js +53 -53
- package/dist/templates/splash/apps/splash/splash.html +25 -25
- package/dist/templates/splash/template.json +12 -12
- package/dist/templates/tests/template.json +8 -8
- package/dist/templates/tests/tests/package-lock.json +7289 -7289
- package/dist/templates/tests/tests/package.json +22 -22
- package/dist/templates/tests/tests/tests/sample.spec.ts +30 -30
- package/dist/templates/tests/tests/tsconfig.json +10 -10
- package/dist/templates/tests/tests/wdio.config.ts +32 -32
- package/dist/templates/workspaces/apps/workspaces/README.md +15 -15
- package/dist/templates/workspaces/apps/workspaces/config/workspaces-dev.json +20 -20
- package/dist/templates/workspaces/apps/workspaces/index.html +17 -17
- package/dist/templates/workspaces/apps/workspaces/iocd.app.json +19 -19
- package/dist/templates/workspaces/apps/workspaces/package.json +29 -29
- package/dist/templates/workspaces/apps/workspaces/public/manifest.json +25 -25
- package/dist/templates/workspaces/apps/workspaces/public/robots.txt +3 -3
- package/dist/templates/workspaces/apps/workspaces/src/App.css +38 -38
- package/dist/templates/workspaces/apps/workspaces/src/App.tsx +102 -102
- package/dist/templates/workspaces/apps/workspaces/src/index.css +3 -3
- package/dist/templates/workspaces/apps/workspaces/src/index.tsx +28 -28
- package/dist/templates/workspaces/apps/workspaces/src/logo.svg +7 -7
- package/dist/templates/workspaces/apps/workspaces/src/reportWebVitals.ts +15 -15
- package/dist/templates/workspaces/apps/workspaces/src/setupTests.ts +5 -5
- package/dist/templates/workspaces/apps/workspaces/vite.config.ts +8 -8
- package/dist/templates/workspaces/template.json +12 -12
- package/package.json +83 -83
- package/scripts/copy-assets.js +19 -19
- package/scripts/delete-dist.js +12 -12
- package/scripts/generate-schema.js +50 -50
- package/scripts/handle-gitignore-templates.js +157 -157
package/README.md
CHANGED
|
@@ -1,782 +1,795 @@
|
|
|
1
|
-
# io.Connect Desktop Seed Project
|
|
2
|
-
|
|
3
|
-
> A seed project for developing and building io.Connect Desktop based products
|
|
4
|
-
|
|
5
|
-
- [io.Connect Desktop Seed Project](#ioconnect-desktop-seed-project)
|
|
6
|
-
- [Overview](#overview)
|
|
7
|
-
- [Quick Start](#quick-start)
|
|
8
|
-
- [Prerequisites](#prerequisites)
|
|
9
|
-
- [Creating Your Project](#creating-your-project)
|
|
10
|
-
- [Installation](#installation)
|
|
11
|
-
- [Running in Development Mode](#running-in-development-mode)
|
|
12
|
-
- [Building for Production](#building-for-production)
|
|
13
|
-
- [Project Structure](#project-structure)
|
|
14
|
-
- [Configuration](#configuration)
|
|
15
|
-
- [Basic Settings](#basic-settings)
|
|
16
|
-
- [License Key](#license-key)
|
|
17
|
-
- [Customization](#customization)
|
|
18
|
-
- [Applying Modifications](#applying-modifications)
|
|
19
|
-
- [Changing io.CD System Config](#changing-iocd-system-config)
|
|
20
|
-
- [Changing the Logo](#changing-the-logo)
|
|
21
|
-
- [Custom Applications](#custom-applications)
|
|
22
|
-
- [Using Template Applications](#using-template-applications)
|
|
23
|
-
- [Creating Custom Applications](#creating-custom-applications)
|
|
24
|
-
- [Managing Applications](#managing-applications)
|
|
25
|
-
- [Development](#development)
|
|
26
|
-
- [Installing or Updating components during development](#installing-or-updating-components-during-development)
|
|
27
|
-
- [Testing](#testing)
|
|
28
|
-
- [Running Tests](#running-tests)
|
|
29
|
-
- [Writing Tests](#writing-tests)
|
|
30
|
-
- [Building for Production](#building-for-production-1)
|
|
31
|
-
- [Build Commands](#build-commands)
|
|
32
|
-
- [Build Output](#build-output)
|
|
33
|
-
|
|
34
|
-
- [
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
- [Option
|
|
38
|
-
|
|
39
|
-
- [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
- [
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
- ✅
|
|
57
|
-
- ✅
|
|
58
|
-
- ✅
|
|
59
|
-
- ✅
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
- **
|
|
70
|
-
- **
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
├──
|
|
115
|
-
│
|
|
116
|
-
|
|
117
|
-
│
|
|
118
|
-
├──
|
|
119
|
-
│
|
|
120
|
-
|
|
121
|
-
│
|
|
122
|
-
├──
|
|
123
|
-
│ └──
|
|
124
|
-
├──
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
"
|
|
142
|
-
"
|
|
143
|
-
"
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
- **
|
|
179
|
-
- **
|
|
180
|
-
|
|
181
|
-
**
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
│
|
|
189
|
-
│
|
|
190
|
-
├──
|
|
191
|
-
│
|
|
192
|
-
|
|
193
|
-
└──
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
**
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
-
|
|
208
|
-
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
- **`.
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
-
|
|
284
|
-
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
- **logo.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
- **
|
|
310
|
-
- **
|
|
311
|
-
- **
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
- `
|
|
331
|
-
- `
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
- **
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
Development
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
Testing
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
**
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
iocd build --
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
* You can change the install GIF by replacing the **install.gif** in assets folder.
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
{
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
"
|
|
546
|
-
"
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
```
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
```
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
```
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
```
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
```
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
}
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
**
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
-
|
|
769
|
-
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
-
|
|
781
|
-
|
|
782
|
-
|
|
1
|
+
# io.Connect Desktop Seed Project
|
|
2
|
+
|
|
3
|
+
> A seed project for developing and building io.Connect Desktop based products
|
|
4
|
+
|
|
5
|
+
- [io.Connect Desktop Seed Project](#ioconnect-desktop-seed-project)
|
|
6
|
+
- [Overview](#overview)
|
|
7
|
+
- [Quick Start](#quick-start)
|
|
8
|
+
- [Prerequisites](#prerequisites)
|
|
9
|
+
- [Creating Your Project](#creating-your-project)
|
|
10
|
+
- [Installation](#installation)
|
|
11
|
+
- [Running in Development Mode](#running-in-development-mode)
|
|
12
|
+
- [Building for Production](#building-for-production)
|
|
13
|
+
- [Project Structure](#project-structure)
|
|
14
|
+
- [Configuration](#configuration)
|
|
15
|
+
- [Basic Settings](#basic-settings)
|
|
16
|
+
- [License Key](#license-key)
|
|
17
|
+
- [Customization](#customization)
|
|
18
|
+
- [Applying Modifications](#applying-modifications)
|
|
19
|
+
- [Changing io.CD System Config](#changing-iocd-system-config)
|
|
20
|
+
- [Changing the Logo](#changing-the-logo)
|
|
21
|
+
- [Custom Applications](#custom-applications)
|
|
22
|
+
- [Using Template Applications](#using-template-applications)
|
|
23
|
+
- [Creating Custom Applications](#creating-custom-applications)
|
|
24
|
+
- [Managing Applications](#managing-applications)
|
|
25
|
+
- [Development](#development)
|
|
26
|
+
- [Installing or Updating components during development](#installing-or-updating-components-during-development)
|
|
27
|
+
- [Testing](#testing)
|
|
28
|
+
- [Running Tests](#running-tests)
|
|
29
|
+
- [Writing Tests](#writing-tests)
|
|
30
|
+
- [Building for Production](#building-for-production-1)
|
|
31
|
+
- [Build Commands](#build-commands)
|
|
32
|
+
- [Build Output](#build-output)
|
|
33
|
+
- [**Windows OS**:](#windows-os)
|
|
34
|
+
- [**macOS**:](#macos)
|
|
35
|
+
- [Code Signing](#code-signing)
|
|
36
|
+
- [Windows Code Signing](#windows-code-signing)
|
|
37
|
+
- [Option 1: PFX Certificate File](#option-1-pfx-certificate-file)
|
|
38
|
+
- [Option 2: Certificate Store (e.g., DigiCert KeyLocker)](#option-2-certificate-store-eg-digicert-keylocker)
|
|
39
|
+
- [Option 3: Custom Script](#option-3-custom-script)
|
|
40
|
+
- [macOS Code Signing](#macos-code-signing)
|
|
41
|
+
- [Code Signing Configuration](#code-signing-configuration)
|
|
42
|
+
- [Notarization Configuration](#notarization-configuration)
|
|
43
|
+
- [CI/CD Integration](#cicd-integration)
|
|
44
|
+
- [Auto-Updates](#auto-updates)
|
|
45
|
+
- [Troubleshooting](#troubleshooting)
|
|
46
|
+
- [Common Issues](#common-issues)
|
|
47
|
+
- [Getting Help](#getting-help)
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Overview
|
|
52
|
+
|
|
53
|
+
This seed project provides everything needed to build, test, and deploy your branded version of io.Connect Desktop distribution. It includes pre-configured components, build scripts, and CI/CD integration examples.
|
|
54
|
+
|
|
55
|
+
**What's Included:**
|
|
56
|
+
- ✅ Licensed io.Connect Desktop components
|
|
57
|
+
- ✅ Build and packaging scripts
|
|
58
|
+
- ✅ Configuration templates
|
|
59
|
+
- ✅ Automated testing framework
|
|
60
|
+
- ✅ CI/CD pipeline examples
|
|
61
|
+
- ✅ Code signing setup guides
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Quick Start
|
|
66
|
+
|
|
67
|
+
### Prerequisites
|
|
68
|
+
|
|
69
|
+
- **Node.js**: v22 or higher
|
|
70
|
+
- **npm**: v9 or higher
|
|
71
|
+
- **Operating System**: Windows 10+ or macOS 11+
|
|
72
|
+
- **License**: This seed project requires a valid io.Connect Desktop license to use the included components. For licensing questions, contact sales@interop.io
|
|
73
|
+
|
|
74
|
+
### Creating Your Project
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npx @interopio/iocd-cli@latest create # Follow prompts to set up your project
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### Installation
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
cd your-project-name
|
|
84
|
+
|
|
85
|
+
# Install dependencies
|
|
86
|
+
npm install
|
|
87
|
+
|
|
88
|
+
# Install components
|
|
89
|
+
npm run setup
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Running in Development Mode
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
# Start io.Connect Desktop in dev mode
|
|
96
|
+
npm run dev
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Building for Production
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Build production installer
|
|
103
|
+
npm run build
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Project Structure
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
.
|
|
112
|
+
├── apps/ # Custom applications (add your own)
|
|
113
|
+
├── components/ # Downloaded io.Connect Desktop components
|
|
114
|
+
│ ├── iocd/ # Main io.Connect Desktop component (required)
|
|
115
|
+
│ └── [other-components]/ # Additional licensed components (devTools, demos, etc.)
|
|
116
|
+
├── config/ # Configuration files
|
|
117
|
+
│ ├── forge.config.js # Electron Forge configuration
|
|
118
|
+
│ ├── iocd.cli.config.json # CLI configuration
|
|
119
|
+
│ └── iocd.license.key # License key file (optional)
|
|
120
|
+
├── modifications/ # Customizations and overrides
|
|
121
|
+
│ ├── base/ # Applied in all modes (dev/build)
|
|
122
|
+
│ ├── dev/ # Applied only in development mode
|
|
123
|
+
│ └── build/ # Applied only during production builds
|
|
124
|
+
├── tests/ # Automated tests
|
|
125
|
+
│ └── basic.test.js # Example Playwright test suite
|
|
126
|
+
├── .github/workflows/ # CI/CD pipeline examples
|
|
127
|
+
├── package.json
|
|
128
|
+
└── README.md
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
## Configuration
|
|
134
|
+
|
|
135
|
+
### Basic Settings
|
|
136
|
+
|
|
137
|
+
Edit `config/iocd.cli.config.json`:
|
|
138
|
+
|
|
139
|
+
```json
|
|
140
|
+
{
|
|
141
|
+
"productName": "Your Product Name",
|
|
142
|
+
"productSlug": "your-product-slug",
|
|
143
|
+
"company": "Your Company",
|
|
144
|
+
"version": "1.0.0",
|
|
145
|
+
"win": {
|
|
146
|
+
"exe": {
|
|
147
|
+
"exeName": "your-product.exe",
|
|
148
|
+
"exeIconPath": "path/to/icon.ico"
|
|
149
|
+
},
|
|
150
|
+
"codeSign": {
|
|
151
|
+
"type": "pfx",
|
|
152
|
+
"pfxPath": "path/to/certificate.pfx"
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
"mac": {
|
|
156
|
+
"appBundleName": "Your Product.app",
|
|
157
|
+
"appBundleId": "com.yourcompany.product"
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### License Key
|
|
163
|
+
|
|
164
|
+
Set your license key using:
|
|
165
|
+
- **Environment variable**: `IOCD_LICENSE_KEY`
|
|
166
|
+
- **Config file**: `config/iocd.license.key`
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Customization
|
|
171
|
+
|
|
172
|
+
### Applying Modifications
|
|
173
|
+
|
|
174
|
+
Modifications are the recommended way to customize io.Connect Desktop components without directly editing component files. They allow you to change configurations, add applications, modify assets, and override default behavior while preserving your changes across component updates.
|
|
175
|
+
|
|
176
|
+
**Key Concepts:**
|
|
177
|
+
|
|
178
|
+
- **Modifications are stored separately** from components in the `modifications/` folder
|
|
179
|
+
- **Changes persist** when components are updated or reinstalled
|
|
180
|
+
- **Mode-specific modifications** allow different behavior in dev vs. build mode
|
|
181
|
+
- **Files are copied or merged** into components when running `iocd dev` or `iocd build`
|
|
182
|
+
|
|
183
|
+
**Directory Structure:**
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
modifications/
|
|
187
|
+
├── base/ # Applied in all modes
|
|
188
|
+
│ └── iocd/
|
|
189
|
+
│ ├── config/
|
|
190
|
+
│ ├── assets/
|
|
191
|
+
│ └── apps/
|
|
192
|
+
├── dev/ # Applied only in dev mode
|
|
193
|
+
│ └── iocd/
|
|
194
|
+
│ └── config/
|
|
195
|
+
└── build/ # Applied only in build mode
|
|
196
|
+
└── iocd/
|
|
197
|
+
└── config/
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
**Processing Order:**
|
|
201
|
+
|
|
202
|
+
1. **Base modifications** (`modifications/base/`) are applied first
|
|
203
|
+
2. **Mode-specific modifications** (`modifications/dev/` or `modifications/build/`) are applied second, overriding base when needed
|
|
204
|
+
|
|
205
|
+
**Common Use Cases:**
|
|
206
|
+
|
|
207
|
+
- Replace logos and icons in `modifications/base/iocd/assets/`
|
|
208
|
+
- Configure system settings in `modifications/base/iocd/config/`
|
|
209
|
+
- Add application definitions in `modifications/base/iocd/apps/`
|
|
210
|
+
- Use different URLs for dev (localhost) vs. build (file://) in mode-specific folders
|
|
211
|
+
|
|
212
|
+
**Special File Types:**
|
|
213
|
+
|
|
214
|
+
- **`.json.merge`** - Deep merges with existing JSON instead of replacing
|
|
215
|
+
- **`.delete`** - Removes the corresponding file
|
|
216
|
+
- **`.replace`** marker - Replaces entire directory (place in directory to replace)
|
|
217
|
+
|
|
218
|
+
### Changing io.CD System Config
|
|
219
|
+
|
|
220
|
+
The io.Connect Desktop system configuration (`system.json`) controls platform-wide settings like auto-updates, logging, and feature flags. To customize these settings, create modification files that merge with the default configuration.
|
|
221
|
+
|
|
222
|
+
**Location:**
|
|
223
|
+
```
|
|
224
|
+
modifications/base/iocd/config/system.json.merge
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Example - Enable Auto-Updates:**
|
|
228
|
+
|
|
229
|
+
```json
|
|
230
|
+
{
|
|
231
|
+
"autoUpdater": {
|
|
232
|
+
"enabled": true,
|
|
233
|
+
"updateSource": {
|
|
234
|
+
"type": "Service",
|
|
235
|
+
"baseUrl": "https://updates.yourcompany.com"
|
|
236
|
+
},
|
|
237
|
+
"interval": 60
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
**Example - Configure Logging:**
|
|
243
|
+
|
|
244
|
+
```json
|
|
245
|
+
{
|
|
246
|
+
"logging": {
|
|
247
|
+
"level": "info",
|
|
248
|
+
"appender": "default"
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
**Mode-Specific Configuration:**
|
|
254
|
+
|
|
255
|
+
Use different settings for dev vs. build mode:
|
|
256
|
+
|
|
257
|
+
**Dev mode** (`modifications/dev/iocd/config/system.json.merge`):
|
|
258
|
+
```json
|
|
259
|
+
{
|
|
260
|
+
"logging": {
|
|
261
|
+
"level": "debug"
|
|
262
|
+
},
|
|
263
|
+
"features": {
|
|
264
|
+
"devTools": true
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
**Build mode** (`modifications/build/iocd/config/system.json.merge`):
|
|
270
|
+
```json
|
|
271
|
+
{
|
|
272
|
+
"logging": {
|
|
273
|
+
"level": "error"
|
|
274
|
+
},
|
|
275
|
+
"features": {
|
|
276
|
+
"telemetry": true
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
**Important Notes:**
|
|
282
|
+
|
|
283
|
+
- Use `.merge` extension to deep merge with existing configuration
|
|
284
|
+
- Without `.merge`, the file completely replaces the original
|
|
285
|
+
- Changes are applied when running `iocd dev` or `iocd build`
|
|
286
|
+
- Environment variables like `${PRODUCT_VERSION}` are automatically expanded
|
|
287
|
+
|
|
288
|
+
### Changing the Logo
|
|
289
|
+
|
|
290
|
+
Replace the default logo files in `modifications/base/iocd/assets/images/`:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
modifications/base/iocd/assets/
|
|
294
|
+
└── images/
|
|
295
|
+
├── logo.ico # Windows executable icon (multiple resolutions)
|
|
296
|
+
├── logo.icns # macOS app bundle icon (multiple resolutions)
|
|
297
|
+
└── logo.png # Application icon (used in UI)
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Requirements:**
|
|
301
|
+
- **logo.ico**: Windows icon file with multiple sizes (16x16, 32x32, 48x48, 256x256)
|
|
302
|
+
- **logo.icns**: macOS icon file with multiple sizes (use Icon Composer or iconutil)
|
|
303
|
+
- **logo.png**: PNG file, recommended size 512x512
|
|
304
|
+
|
|
305
|
+
### Custom Applications
|
|
306
|
+
|
|
307
|
+
io.Connect Desktop includes several built-in applications that you can replace with your own custom versions:
|
|
308
|
+
|
|
309
|
+
- **Workspaces** - Workspace management UI
|
|
310
|
+
- **Groups** - Window grouping UI
|
|
311
|
+
- **Splash Screen** - Application splash screen
|
|
312
|
+
- **Launchpad** - Application launcher
|
|
313
|
+
- **Notifications** - Notification center
|
|
314
|
+
|
|
315
|
+
Applications in the `apps/` folder allow you to customize these built-in apps or add entirely new functionality. This approach keeps your core platform applications in the same repository, eliminating the need to manage them across multiple repositories and simplifying version control, deployment, and coordination.
|
|
316
|
+
|
|
317
|
+
#### Using Template Applications
|
|
318
|
+
|
|
319
|
+
Template applications can be selected during project creation or added later:
|
|
320
|
+
|
|
321
|
+
```bash
|
|
322
|
+
# Add template application
|
|
323
|
+
iocd apps add workspaces
|
|
324
|
+
|
|
325
|
+
# List available templates
|
|
326
|
+
iocd apps list --available
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
**Available templates:**
|
|
330
|
+
- `workspaces` - Workspace management
|
|
331
|
+
- `groups` - Window grouping
|
|
332
|
+
- `splash-screen` - Loading screen
|
|
333
|
+
- `launchpad` - Application launcher
|
|
334
|
+
|
|
335
|
+
Once added, build your implementation on top of the template in the `apps/` folder.
|
|
336
|
+
|
|
337
|
+
#### Creating Custom Applications
|
|
338
|
+
|
|
339
|
+
For custom applications, create a folder in `apps/` with an `iocd.app.json` file:
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
apps/
|
|
343
|
+
└── my-custom-app/
|
|
344
|
+
├── iocd.app.json # Defines modifications and build behavior
|
|
345
|
+
├── package.json
|
|
346
|
+
└── src/
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
**Example `iocd.app.json`:**
|
|
350
|
+
|
|
351
|
+
In this example:
|
|
352
|
+
- **Dev mode** (triggered by `iocd dev` or `npm run dev`): Executes a `start` script (typically starts a dev server with hot-reload) and copies the development app configuration so the app definition points to the dev server
|
|
353
|
+
- **Build mode** (triggered by `iocd build` or `npm run build`): Executes a `build` script (typically builds optimized production assets) and copies the final built assets to the modifications folder
|
|
354
|
+
|
|
355
|
+
```json
|
|
356
|
+
{
|
|
357
|
+
"dev": {
|
|
358
|
+
"script": "start",
|
|
359
|
+
"modifications": [
|
|
360
|
+
{
|
|
361
|
+
"source": "/config/my-app-dev.json",
|
|
362
|
+
"destination": "/modifications/dev/iocd/config/apps/my-app.json"
|
|
363
|
+
}
|
|
364
|
+
]
|
|
365
|
+
},
|
|
366
|
+
"build": {
|
|
367
|
+
"script": "build",
|
|
368
|
+
"modifications": [
|
|
369
|
+
{
|
|
370
|
+
"source": "/dist/",
|
|
371
|
+
"destination": "/modifications/build/iocd/assets/my-app"
|
|
372
|
+
}
|
|
373
|
+
]
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
The `iocd.app.json` file defines:
|
|
379
|
+
- **base**: Array of modifications applied in all modes
|
|
380
|
+
- **dev**: Object with optional `script` (npm script name) and `modifications` array
|
|
381
|
+
- **build**: Object with optional `script` (npm script name) and `modifications` array
|
|
382
|
+
|
|
383
|
+
#### Managing Applications
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
# Install application dependencies
|
|
387
|
+
iocd apps install
|
|
388
|
+
|
|
389
|
+
# Start applications in dev mode
|
|
390
|
+
iocd apps dev
|
|
391
|
+
|
|
392
|
+
# Build applications for production
|
|
393
|
+
iocd apps build
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## Development
|
|
399
|
+
|
|
400
|
+
Development mode allows you to quickly start io.Connect Desktop with all your configured changes and applications, enabling rapid iteration and testing during development.
|
|
401
|
+
|
|
402
|
+
When you run dev mode, the CLI will:
|
|
403
|
+
1. **Apply all relevant modifications** - Base modifications and dev-specific modifications are copied to components
|
|
404
|
+
2. **Start all applications** - Runs the dev script for each app (typically starting dev servers with hot-reload)
|
|
405
|
+
3. **Launch io.Connect Desktop** - Starts the platform with all changes applied
|
|
406
|
+
|
|
407
|
+
```bash
|
|
408
|
+
# Start io.Connect Desktop in dev mode
|
|
409
|
+
iocd dev
|
|
410
|
+
|
|
411
|
+
# Or using npm script
|
|
412
|
+
npm run dev
|
|
413
|
+
```
|
|
414
|
+
|
|
415
|
+
### Installing or Updating components during development
|
|
416
|
+
To install a component or update existing component while in development mode, use the following command:
|
|
417
|
+
|
|
418
|
+
```bash
|
|
419
|
+
# Update components
|
|
420
|
+
iocd components install <component-name>
|
|
421
|
+
|
|
422
|
+
# Or using npm script (note the -- before the component name)
|
|
423
|
+
npm run components-install -- <component-name>
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
This command will download and install the latest version of the specified component.
|
|
427
|
+
|
|
428
|
+
If you want to install a specific version, use:
|
|
429
|
+
|
|
430
|
+
```bash
|
|
431
|
+
iocd components install <component-name>@<version>
|
|
432
|
+
|
|
433
|
+
# Or using npm script (note the -- before the component name)
|
|
434
|
+
npm run components-install -- <component-name>@<version>
|
|
435
|
+
```
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## Testing
|
|
439
|
+
|
|
440
|
+
Testing is based on **WebdriverIO** and depends on the `@interopio/wdio-iocd-service` package, which enables starting and controlling io.Connect Desktop from WebDriver. This allows you to create and run comprehensive end-to-end (E2E) tests for your io.Connect Desktop application.
|
|
441
|
+
|
|
442
|
+
### Running Tests
|
|
443
|
+
|
|
444
|
+
Tests are written in the `tests/` folder and can be executed using:
|
|
445
|
+
|
|
446
|
+
```bash
|
|
447
|
+
# Run all tests
|
|
448
|
+
npm test
|
|
449
|
+
|
|
450
|
+
# Or using the WebdriverIO CLI directly
|
|
451
|
+
npx wdio run ./wdio.config.ts
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
### Writing Tests
|
|
455
|
+
|
|
456
|
+
Tests are written using WebdriverIO syntax with the io.Connect Desktop service handling application lifecycle. Example test structure:
|
|
457
|
+
|
|
458
|
+
```javascript
|
|
459
|
+
describe('io.Connect Desktop Application', () => {
|
|
460
|
+
it('should launch successfully', async () => {
|
|
461
|
+
// Your test logic here
|
|
462
|
+
// The @interopio/wdio-iocd-service handles starting/stopping io.Connect Desktop
|
|
463
|
+
});
|
|
464
|
+
});
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
Add your test files to the `tests/` directory. They'll run automatically in CI/CD pipelines.
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
471
|
+
## Building for Production
|
|
472
|
+
|
|
473
|
+
The build process creates production-ready installers for distribution. It orchestrates multiple steps to produce signed, optimized packages ready for deployment.
|
|
474
|
+
|
|
475
|
+
**What happens during build:**
|
|
476
|
+
|
|
477
|
+
1. **Build all applications** - Executes build scripts for each app in production mode
|
|
478
|
+
2. **Reinstall components** - Downloads and installs fresh component versions
|
|
479
|
+
3. **Apply all modifications** - Copies base and build-specific modifications to components
|
|
480
|
+
4. **Code sign binaries** - Signs executables and libraries (if configured)
|
|
481
|
+
5. **Create build artifacts** - Generates installers (`.exe` setup on Windows, `.dmg` on macOS, `.zip` archives)
|
|
482
|
+
6. **Publish to release server** - Uploads artifacts for auto-updates (if configured)
|
|
483
|
+
|
|
484
|
+
**Build System:**
|
|
485
|
+
|
|
486
|
+
The build process is based on [Electron Forge](https://www.electronforge.io/), a complete toolchain for building and packaging Electron applications. The main configuration is located in `config/forge.config.js`, where you can customize makers, publishers, and build behavior.
|
|
487
|
+
|
|
488
|
+
### Build Commands
|
|
489
|
+
|
|
490
|
+
```bash
|
|
491
|
+
# Build installer
|
|
492
|
+
iocd build
|
|
493
|
+
|
|
494
|
+
# Or using npm script
|
|
495
|
+
npm run build
|
|
496
|
+
|
|
497
|
+
# Build options
|
|
498
|
+
iocd build --output custom/path # Custom output directory
|
|
499
|
+
iocd build --publish-only # Skip build, only publish
|
|
500
|
+
iocd build --skip-install # Skip component installation
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
### Build Output
|
|
504
|
+
|
|
505
|
+
Depending on OS you can configure Electron Forge makers to produce different types of artifacts. We have tested the following configurations:
|
|
506
|
+
|
|
507
|
+
#### **Windows OS**:
|
|
508
|
+
1. Squirrel.Windows installer (`.exe` setup)
|
|
509
|
+
* You can change the install GIF by replacing the **install.gif** in assets folder.
|
|
510
|
+
* The app will be installed into **%LocalAppData%\YourAppName**. Squirrel is opinionated and does not allow changing this path.
|
|
511
|
+
* By default the UserData folder generated by the platform will stay in **%LocalAppData%\interop.io\io.Connect Desktop** folder. You can change this by add the following system.json.merge-win32 file in modifications/base/iocd/config/system.json.merge-win32 (the file has win32 suffix which indicates it is only applied on Windows OS). Do not forget to replace `YourAppName` with the actual name of your application (it must be the same as productSlug in iocd.cli.config.json):
|
|
512
|
+
|
|
513
|
+
```json
|
|
514
|
+
{
|
|
515
|
+
"paths": {
|
|
516
|
+
"userData": "%LocalAppData%/YourAppName/UserData/%IO_CD_ENV%-%IO_CD_REGION%",
|
|
517
|
+
"cache": {
|
|
518
|
+
"location": "%LocalAppData%/YourAppName/Cache/%IO_CD_ENV%-%IO_CD_REGION%",
|
|
519
|
+
"copy": true
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
```
|
|
524
|
+
1. Portable ZIP archive
|
|
525
|
+
|
|
526
|
+
#### **macOS**:
|
|
527
|
+
1. DMG disk image
|
|
528
|
+
2. ZIP archive
|
|
529
|
+
|
|
530
|
+
The full list of makers is available in the [Electron Forge documentation](https://www.electronforge.io/config/makers).
|
|
531
|
+
|
|
532
|
+
### Code Signing
|
|
533
|
+
|
|
534
|
+
Code signing ensures that your application is trusted by operating systems and users can verify it hasn't been tampered with. Both Windows and macOS require code signing for distribution.
|
|
535
|
+
|
|
536
|
+
#### Windows Code Signing
|
|
537
|
+
|
|
538
|
+
##### Option 1: PFX Certificate File
|
|
539
|
+
|
|
540
|
+
```json
|
|
541
|
+
{
|
|
542
|
+
"win": {
|
|
543
|
+
"codeSign": {
|
|
544
|
+
"type": "signtool",
|
|
545
|
+
"pfxPath": "path/to/certificate.pfx",
|
|
546
|
+
"pfxPassword": "${WIN_PFX_PASS}"
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
##### Option 2: Certificate Store (e.g., DigiCert KeyLocker)
|
|
553
|
+
|
|
554
|
+
```json
|
|
555
|
+
{
|
|
556
|
+
"win": {
|
|
557
|
+
"codeSign": {
|
|
558
|
+
"type": "signtool",
|
|
559
|
+
"certificateSha1": "${WIN_CERT_SHA1}"
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
```
|
|
564
|
+
|
|
565
|
+
**Important**:
|
|
566
|
+
- If using DigiCert KeyLocker, run `smctl windows certsync` before building to sync certificates to Windows store
|
|
567
|
+
- Either `pfxPath` or `certificateSha1` must be provided (not both)
|
|
568
|
+
- Set type to `"off"` to disable code signing
|
|
569
|
+
|
|
570
|
+
##### Option 3: Custom Script
|
|
571
|
+
|
|
572
|
+
For advanced signing scenarios, you can provide a custom signing script:
|
|
573
|
+
|
|
574
|
+
```json
|
|
575
|
+
{
|
|
576
|
+
"win": {
|
|
577
|
+
"codeSign": {
|
|
578
|
+
"type": "custom",
|
|
579
|
+
"customCodeSignScriptPath": "path/to/custom-sign.js"
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
}
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
Your custom script should export a function that receives the binary path and config:
|
|
586
|
+
|
|
587
|
+
```javascript
|
|
588
|
+
// custom-sign.js
|
|
589
|
+
module.exports = async function(binaryPath, config) {
|
|
590
|
+
// Your custom signing logic here
|
|
591
|
+
console.log(`Signing ${binaryPath}`);
|
|
592
|
+
// Use any signing tool or API you need
|
|
593
|
+
};
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
#### macOS Code Signing
|
|
597
|
+
|
|
598
|
+
##### Code Signing Configuration
|
|
599
|
+
|
|
600
|
+
```json
|
|
601
|
+
{
|
|
602
|
+
"mac": {
|
|
603
|
+
"codeSign": {
|
|
604
|
+
"type": "keychain",
|
|
605
|
+
"identity": "Developer ID Application: Your Company (TEAM_ID)"
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
}
|
|
609
|
+
```
|
|
610
|
+
|
|
611
|
+
**Options**:
|
|
612
|
+
- `type`: `"keychain"` (use keychain certificate), `"certificate"` (use .p12 file), `"custom"` (custom script), or `"off"` (no signing)
|
|
613
|
+
- `identity`: Developer ID Application identity or SHA-1 hash (optional - auto-selected if not specified)
|
|
614
|
+
- `keychain`: Keychain name or path (optional - uses default keychain if not specified)
|
|
615
|
+
|
|
616
|
+
**Custom Script Option:**
|
|
617
|
+
|
|
618
|
+
For advanced signing scenarios, you can provide a custom signing script:
|
|
619
|
+
|
|
620
|
+
```json
|
|
621
|
+
{
|
|
622
|
+
"mac": {
|
|
623
|
+
"codeSign": {
|
|
624
|
+
"type": "custom",
|
|
625
|
+
"customCodeSignScriptPath": "path/to/custom-sign.js"
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
Your custom script should export a function that receives the app bundle path and config:
|
|
632
|
+
|
|
633
|
+
```javascript
|
|
634
|
+
// custom-sign.js
|
|
635
|
+
module.exports = async function(appBundlePath, config) {
|
|
636
|
+
// Your custom signing logic here
|
|
637
|
+
console.log(`Signing ${appBundlePath}`);
|
|
638
|
+
// Use any signing tool or API you need
|
|
639
|
+
};
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
##### Notarization Configuration
|
|
643
|
+
|
|
644
|
+
```json
|
|
645
|
+
{
|
|
646
|
+
"mac": {
|
|
647
|
+
"notarization": {
|
|
648
|
+
"type": "notarytool",
|
|
649
|
+
"appleId": "${MAC_NOTARIZATION_APPLE_ID}",
|
|
650
|
+
"appleIdPassword": "${MAC_NOTARIZATION_APPLE_ID_PASSWORD}",
|
|
651
|
+
"appleTeamId": "${MAC_NOTARIZATION_APPLE_TEAM_ID}"
|
|
652
|
+
}
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
```
|
|
656
|
+
|
|
657
|
+
**Important**:
|
|
658
|
+
- Notarization is required for distribution outside Mac App Store
|
|
659
|
+
- Use app-specific password (not your regular Apple ID password)
|
|
660
|
+
- Generate app-specific password at appleid.apple.com
|
|
661
|
+
- Set type to `"off"` to skip notarization (for development builds)
|
|
662
|
+
|
|
663
|
+
**Custom Script Option:**
|
|
664
|
+
|
|
665
|
+
For advanced notarization scenarios, you can provide a custom notarization script:
|
|
666
|
+
|
|
667
|
+
```json
|
|
668
|
+
{
|
|
669
|
+
"mac": {
|
|
670
|
+
"notarization": {
|
|
671
|
+
"type": "custom",
|
|
672
|
+
"customNotarizationScriptPath": "path/to/custom-notarize.js"
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
```
|
|
677
|
+
|
|
678
|
+
Your custom script should export a function that receives the app bundle path and config:
|
|
679
|
+
|
|
680
|
+
```javascript
|
|
681
|
+
// custom-notarize.js
|
|
682
|
+
module.exports = async function(appBundlePath, config) {
|
|
683
|
+
// Your custom notarization logic here
|
|
684
|
+
console.log(`Notarizing ${appBundlePath}`);
|
|
685
|
+
// Use any notarization tool or API you need
|
|
686
|
+
};
|
|
687
|
+
```
|
|
688
|
+
|
|
689
|
+
### CI/CD Integration
|
|
690
|
+
|
|
691
|
+
Continuous Integration and Continuous Deployment (CI/CD) automates building, testing, and publishing your io.Connect Desktop application. The seed project includes an GitHub Actions workflow located in `.github/workflows/build.yml`. It produces signed installers and can publish them to a release server.
|
|
692
|
+
|
|
693
|
+
### Auto-Updates
|
|
694
|
+
|
|
695
|
+
Setting up auto-updates allows your users to automatically receive new versions of your application.
|
|
696
|
+
|
|
697
|
+
**Requirements:**
|
|
698
|
+
|
|
699
|
+
Auto-updates are supported for specific build artifact types:
|
|
700
|
+
- **Windows**: Squirrel.Windows installers (`.exe` setup files)
|
|
701
|
+
- **macOS**: ZIP archives
|
|
702
|
+
|
|
703
|
+
Other build outputs (portable ZIP on Windows, DMG on macOS) do not support automatic updates.
|
|
704
|
+
|
|
705
|
+
**Setup Steps:**
|
|
706
|
+
|
|
707
|
+
**1. Set up a release server**
|
|
708
|
+
|
|
709
|
+
You can use existing solutions or build your own:
|
|
710
|
+
- **Existing services**: Nucleus, Hazel, or other update servers (see [Electron update services](https://www.electronjs.org/docs/latest/tutorial/updates#using-other-update-services))
|
|
711
|
+
- **Custom solution**: Build your own update server following Squirrel protocols
|
|
712
|
+
|
|
713
|
+
**2. Configure io.Connect Desktop to check the update server**
|
|
714
|
+
|
|
715
|
+
Create or modify `modifications/base/iocd/config/system.json.merge`:
|
|
716
|
+
|
|
717
|
+
```json
|
|
718
|
+
{
|
|
719
|
+
"autoUpdater": {
|
|
720
|
+
"enabled": true,
|
|
721
|
+
"updateSource": {
|
|
722
|
+
"type": "Service",
|
|
723
|
+
"baseUrl": "https://updates.yourcompany.com"
|
|
724
|
+
},
|
|
725
|
+
"interval": 60
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
```
|
|
729
|
+
|
|
730
|
+
**3. Publish updates**
|
|
731
|
+
|
|
732
|
+
Choose one of the following approaches:
|
|
733
|
+
|
|
734
|
+
**Option A: Automatic publishing during build** - Configure publishers in `config/forge.config.js`:
|
|
735
|
+
|
|
736
|
+
```javascript
|
|
737
|
+
publishers: [
|
|
738
|
+
{
|
|
739
|
+
name: '@electron-forge/publisher-electron-release-server',
|
|
740
|
+
config: {
|
|
741
|
+
baseUrl: 'https://updates.yourcompany.com',
|
|
742
|
+
username: process.env.RELEASE_SERVER_USERNAME,
|
|
743
|
+
password: process.env.RELEASE_SERVER_PASSWORD
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
]
|
|
747
|
+
```
|
|
748
|
+
|
|
749
|
+
**Option B: Manual upload** - After building, manually upload the installer artifacts to your release server.
|
|
750
|
+
|
|
751
|
+
**4. Test auto-updates**
|
|
752
|
+
|
|
753
|
+
- Install your application using the signed installer
|
|
754
|
+
- Publish a new version to your update server
|
|
755
|
+
- Launch the application and verify it detects and installs the update
|
|
756
|
+
|
|
757
|
+
---
|
|
758
|
+
|
|
759
|
+
## Troubleshooting
|
|
760
|
+
|
|
761
|
+
### Common Issues
|
|
762
|
+
|
|
763
|
+
**Build fails with "License not found"**
|
|
764
|
+
- Ensure `IOCD_LICENSE_KEY` environment variable is set
|
|
765
|
+
- Or create `config/iocd.license.key` file with your license key
|
|
766
|
+
|
|
767
|
+
**Code signing fails on Windows**
|
|
768
|
+
- Verify certificate is valid and not expired
|
|
769
|
+
- Check that `pfxPassword` is correct
|
|
770
|
+
- For certificate store signing: Ensure `smctl windows certsync` was run first
|
|
771
|
+
- Verify exactly one of `pfxPath` or `certificateSha1` is configured (not both)
|
|
772
|
+
|
|
773
|
+
**macOS notarization fails**
|
|
774
|
+
- Use app-specific password, not regular Apple ID password
|
|
775
|
+
- Generate app-specific password at appleid.apple.com
|
|
776
|
+
- Verify Apple Developer Program membership is active
|
|
777
|
+
- Check that `appleTeamId` matches your Developer Team ID
|
|
778
|
+
|
|
779
|
+
**Application won't start in dev mode**
|
|
780
|
+
- Run `iocd setup` to verify component installation
|
|
781
|
+
- Check that `components/iocd` directory exists
|
|
782
|
+
- Review logs in system temp directory
|
|
783
|
+
|
|
784
|
+
**Components not downloading**
|
|
785
|
+
- Verify network connectivity
|
|
786
|
+
- Check component store configuration in `config/iocd.cli.config.json`
|
|
787
|
+
- For GitHub store: Ensure repository access and credentials are correct
|
|
788
|
+
|
|
789
|
+
### Getting Help
|
|
790
|
+
|
|
791
|
+
- 📚 [Documentation](https://docs.interop.io/desktop)
|
|
792
|
+
- 💬 [Community Forum](https://community.interop.io)
|
|
793
|
+
- 📧 [Support Portal](https://support.interop.io)
|
|
794
|
+
|
|
795
|
+
---
|