Compare commits

...

2693 commits

Author SHA1 Message Date
coderaiser
7f28803a82 chore: cloudcmd: actions: lint ☘️ 2026-07-16 15:31:22 +00:00
coderaiser
943bdecd3e test: coverage 2026-07-16 15:29:08 +00:00
coderaiser
e4ff4a78cc chore: cloudcmd: actions: lint ☘️ 2026-07-16 12:27:35 +00:00
coderaiser
fec5538f01 test: common: util: coverage 2026-07-16 12:26:33 +00:00
coderaiser
b7bb363aa8 test: cloudfunc: coverage 2026-07-16 12:23:46 +00:00
coderaiser
cd4a2cec76 chore: cloudcmd: actions: lint ☘️ 2026-07-16 09:28:42 +00:00
coderaiser
0638ca32cb feature: migrate from webpack to rspack 2026-07-16 12:27:20 +03:00
coderaiser
fe185cc93e chore: cloudcmd: actions: lint ☘️ 2026-07-15 20:27:25 +00:00
coderiaser
7edea50296 chore: lint 2026-07-15 23:26:28 +03:00
coderaiser
8258cdb651
chore: rm rulesdir 2026-07-15 21:18:06 +02:00
coderaiser
a9e29eee85 test: cloudcmd: coverage 2026-07-15 10:31:07 +00:00
coderaiser
a52a6aae62 test: coverage 2026-07-15 09:36:03 +00:00
coderaiser
92c79830f5 chore: madrun: test: rm test-e2e 2026-07-15 08:21:03 +00:00
coderiaser
8629f67972 feature: cloudcmd: docker: io: arm 2026-06-29 18:19:08 +03:00
coderiaser
c04d363c46 test: e2e: spawn 2026-06-29 18:16:34 +03:00
coderiaser
046a4ef22e chore: lint 2026-06-29 17:54:20 +03:00
coderiaser
579c9e41d7 feature: cloudcmd: serve-once v4.0.1 2026-06-29 17:48:06 +03:00
coderiaser
6014898610 feature: cloudcmd: @babel/preset-env v8.0.2 2026-06-29 17:48:06 +03:00
coderiaser
ad3bf95e5f feature: cloudcmd: @babel/plugin-transform-optional-chaining v8.0.1 2026-06-29 17:48:05 +03:00
coderiaser
4e22a4edde feature: cloudcmd: @babel/core v8.0.1 2026-06-29 17:48:04 +03:00
coderiaser
9c50fe53e7 feature: cloudcmd: @babel/code-frame v8.0.0 2026-06-29 17:48:04 +03:00
coderiaser
a2a2d51ec1 chore: cloudcmd: v19.19.1 2026-06-15 14:50:37 +03:00
coderiaser
c36c32cb08 chore: lint 2026-06-15 14:49:57 +03:00
coderiaser
78b206e06b feature: client: key: Ctrl + L -> Ctrl + Shift + L: Log out (#466) 2026-06-15 14:49:47 +03:00
coderiaser
ef83a61a0c chore: actions: typos 2026-06-04 17:55:58 +03:00
coderaiser
f5c0aa5c4c Update nodejs.yml 2026-06-04 17:55:44 +03:00
coderaiser
e59167b1fa chore: actions: permissions 2026-06-04 16:05:15 +03:00
coderiaser
ea584aceea chore: actions: typos.ai 2026-06-04 15:42:02 +03:00
coderiaser
4d7116b467 chore: docker: io: git 2026-06-03 23:47:50 +03:00
coderiaser
b149288545 feature: docker: io: NPM_CONFIG_PACKAGE_LOCK=false 2026-06-03 23:40:16 +03:00
coderiaser
9d06279ba8 featur: docker: io: add gh 2026-06-03 23:39:27 +03:00
coderiaser
21e1dcf0e5 chore: actions: typos 2026-06-03 18:46:19 +03:00
coderaiser
b3b0c1d159 chore: package: rm unused optimize-css-assets-webpack-plugin 2026-06-03 13:02:04 +00:00
coderaiser
76d7bf4d73
feature: docker: typos, shellcheck: add 2026-06-02 10:03:23 +02:00
coderaiser
f1d80282eb chore: cloudcmd: actions: lint ☘️ 2026-06-01 20:39:12 +00:00
coderiaser
220cc5557b chore: actions: API_KEY 2026-06-01 23:32:27 +03:00
coderiaser
d2176c93fb chore: actions: typo 2026-06-01 22:56:08 +03:00
coderaiser
c558e44a1c
docs: readme: InstaPods 2026-06-01 13:29:58 +03:00
coderaiser
45ec062bce
docs: readme: deploy on InstaPods 2026-06-01 13:24:07 +03:00
coderaiser
f8edddd442
chore: .nvmrc 2026-05-30 13:12:09 +02:00
coderiaser
fc3d5ac700 chore: cloudcmd: v19.19.0 2026-05-26 23:17:05 +03:00
coderaiser
4ee38db68c feature: client: view: flac: add support 2026-05-26 23:16:40 +03:00
coderiaser
1dfa7ca355 chore: cloudcmd: v19.18.1 2026-05-26 22:09:29 +03:00
coderiaser
40ecef5ec4 feature: cloudcmd: ratelimit: X-Forwarded-For (#437) 2026-05-26 22:08:16 +03:00
coderiaser
cad5e0f44e chore: lint 2026-05-26 21:45:25 +03:00
coderiaser
d139011cc3 chore: cloudcmd: v19.18.0 2026-05-26 00:21:45 +03:00
coderiaser
5d9628ce70 feature: cloudcmd: rate limit: add support (#437) 2026-05-26 00:21:24 +03:00
coderiaser
161bede8db fix: client: menu: @putout/bundle@5.5. 2026-05-24 22:24:54 +03:00
coderiaser
2be395e640 feature: cloudcmd: get rid of manifest: 401 basic auth 2026-05-24 21:40:26 +03:00
coderiaser
447d990f43 fix: cloudcmd: server: rest: sendError 2026-05-21 00:05:43 +03:00
coderaiser
4f4725ac3c chore: cloudcmd: actions: lint ☘️ 2026-05-17 11:25:50 +00:00
coderiaser
eff03299b6 chore: cloudcmd: v19.17.0 2026-05-17 14:24:10 +03:00
coderiaser
a6adf39db2 chore: lint 2026-05-17 14:24:10 +03:00
coderiaser
70ff6fb29f feature: cloudcmd: cssnano-preset-default v8.0.1 2026-05-17 14:24:10 +03:00
coderiaser
eb32fff688 feature: style: owner, mode: improve 2026-05-17 14:24:10 +03:00
coderiaser
6071b66118 fix: css: query: hide time on mobile 2026-05-17 14:24:10 +03:00
coderiaser
83c0b8d3f1 feature: cloudcmd: superc8 v12.6.0 2026-05-17 14:24:10 +03:00
coderiaser
79da2319f8 feature: docker: io: cline: add 2026-05-17 14:24:10 +03:00
coderiaser
68eacb916a feature: qword: add 2026-05-13 00:22:57 +03:00
coderiaser
ccf608a52e chore: lint 2026-05-10 22:51:18 +03:00
coderiaser
4acd294bf6 feature: docker: io: tmux 2026-05-10 22:44:33 +03:00
coderiaser
05c800431d feature: cloudcmd: @supertape/loader-css v1.0.0 2026-05-06 22:21:16 +03:00
coderiaser
6ff1db2710 chore: lint 2026-05-05 23:51:29 +03:00
coderiaser
800a6545a1 feature: cloudcmd: eslint-plugin-n v18.0.1 2026-05-05 23:51:23 +03:00
coderiaser
a985bb36ca feature: cloudcmd: supertape v13.0.0 2026-05-05 23:50:02 +03:00
coderiaser
e7c55e05b8 fix: docker: io: XDG_CONFIG_HOME 2026-05-03 23:57:16 +03:00
coderiaser
4315ec6179 feature: docker: io XDG_CONFIG_HOME: /etc -> /usr/local/etc 2026-05-03 16:08:15 +03:00
coderiaser
628d12fa2f chore: cloudcmd: v19.16.0 2026-05-03 16:02:16 +03:00
coderiaser
d82d0335b2 feature: client: vim: rr for rename file 2026-05-03 16:01:46 +03:00
coderiaser
acfa27cf74 feature: docker: io: nvchad: add 2026-05-03 00:42:54 +03:00
coderiaser
14f009f832 feature: docker: io: bash-completion: add 2026-05-03 00:16:16 +03:00
coderiaser
d1f6476604 chore: docker: io: no git 2026-05-01 21:01:24 +03:00
coderiaser
c6c6014691 feature: docker: io: f4 2026-05-01 20:21:49 +03:00
coderiaser
9a6b89356e feature: docker: io: GOPATH 2026-05-01 19:05:41 +03:00
coderiaser
882fe83623 chore: cloudcmd: v19.15.0 2026-04-29 12:36:10 +03:00
coderiaser
a9bc22ce29 feature: cloudcmd: operation: rm useless checks 2026-04-29 12:36:10 +03:00
coderiaser
36bacfe915 feature: cloudcmd: client: key: vim: cc, mm 2026-04-29 12:36:10 +03:00
coderiaser
bcbef1a3b0 chore: cloudcmd: v19.14.0 2026-04-29 12:36:10 +03:00
coderiaser
591da25cfe feature: cloudcmd: ponse v8.0.0 2026-04-29 12:36:10 +03:00
coderiaser
1e1b073c8c feature: docker: io: /usr/src/cloudcmd -> /usr/local/share/cloudcmd 2026-04-29 12:35:51 +03:00
coderiaser
ea7b828cbb feature: docker: io: ubuntu: resolute 2026-04-26 18:38:39 +03:00
coderiaser
cd6c11ace2 feature: docker: io: far2l 2026-04-26 18:29:45 +03:00
coderiaser
c4beeec63b feature: docker: io: gdu: add 2026-04-26 12:06:57 +03:00
coderiaser
87c13e7cce chore: cloudcmd: v19.13.1 2026-04-21 23:31:22 +03:00
coderiaser
d5cd11e812 feature: cloudcmd: montag v2.0.1 2026-04-21 23:30:41 +03:00
coderiaser
dc94d2db7a feature: docker: io: add latest git version 2026-04-21 22:47:17 +03:00
coderiaser
1637beee78 feature: docker: io: /usr/local/src -> /usr/local/share 2026-04-20 23:46:29 +03:00
coderaiser
0541b7e351 chore: cloudcmd: actions: lint ☘️ 2026-04-19 16:35:25 +00:00
coderiaser
b1bc4e731f feature: Docker: io: pv 2026-04-19 19:34:22 +03:00
coderiaser
7c0dca6038 feature: docker: io: git: master 2026-04-15 16:22:31 +03:00
coderiaser
24fd0a8aa7 chore: cloudcmd: v19.13.0 2026-04-15 02:39:12 +03:00
coderiaser
2b3dc1573d feature: cloudcmd: Ctrl + L: logout 2026-04-15 02:39:12 +03:00
coderiaser
48693d9e24 fix: docker: io: XDG_CACHE_HOME 2026-04-14 00:09:31 +03:00
coderiaser
977a8aaaf4 feature: docker: io: strace: add 2026-04-13 22:40:14 +03:00
coderiaser
15537ec518 chore: docker: io: remove haskell
This reverts commit b0687b54c7.
2026-04-13 22:36:54 +03:00
coderiaser
7d0098fd5c feature: docker: io: XDG_CACHE_HOME=/tmp/cache 2026-04-13 22:36:43 +03:00
coderiaser
da0c4c4704 chore: actions: docker: io: rm cache 2026-04-13 22:36:43 +03:00
coderiaser
b0687b54c7 chore: docker: io: get back haskell 2026-04-13 22:36:43 +03:00
coderiaser
a89e901b2b feature: actions: docker: io: add 2026-04-12 19:00:58 +03:00
coderiaser
ef06a0c310 chore: cloudcmd: v19.12.5 2026-04-12 18:37:50 +03:00
coderiaser
e7242900a4 chore: docker: io: get rid of haskell 2026-04-12 18:37:50 +03:00
coderiaser
a6b01dce49 chore: actions: cache 2026-04-12 18:31:55 +03:00
coderiaser
1cfc1a6f5d feature: docker: io: only amd64 2026-04-12 18:03:46 +03:00
coderiaser
9915757dce chore: cloudcmd: v19.12.4 2026-04-12 14:13:49 +03:00
coderiaser
673fba2e21 feature: docker: io: haskell 2026-04-12 14:13:49 +03:00
coderiaser
d37f8cd36e feature: docker: io: palabra: node 2026-04-12 13:56:16 +03:00
coderiaser
5e509a4d7b chore: cloudcmd: v19.12.3 2026-04-12 13:04:53 +03:00
coderiaser
cb6cabd4c9 feature: docker: io: PALABRA_DIR 2026-04-12 12:54:58 +03:00
coderiaser
f61cc46f41 chore: cloudcmd: v19.12.2 2026-04-11 22:29:12 +03:00
coderiaser
32a8f169d4 feature: docker: io: get rid of haskell: to slow install 2026-04-11 22:29:12 +03:00
coderiaser
aa74123228 feature: docker: io: rizin, yara 2026-04-11 16:47:53 +03:00
coderiaser
27f20d6af8 chore: cloudcmd: v19.12.1 2026-04-11 15:54:19 +03:00
coderiaser
4695480ead feature: docker: io: add PREFIX 2026-04-11 15:54:19 +03:00
coderiaser
bec3f5a799 chore: cloudcmd: v19.12.0 2026-04-09 19:14:43 +03:00
coderiaser
13b15b7bea feature: docker: io: palabra 2026-04-09 19:13:55 +03:00
coderiaser
969bc770e3 chore: cloudcmd: v19.11.14 2026-04-07 20:55:31 +03:00
coderiaser
5ecc48e348 feature: docker: io: rustup env 2026-04-07 20:55:31 +03:00
coderiaser
9efefc23e0 chore: cloudcmd: v19.11.13 2026-04-07 12:34:02 +03:00
coderiaser
6a08479a1b feature: docker: io: BUN_INSTALL 2026-04-07 12:33:26 +03:00
coderiaser
c2563ed6b3 chore: cloudcmd: v19.11.12 2026-04-06 21:22:52 +03:00
coderiaser
46c655546e feature: docker: io: npm_config_cache 2026-04-06 21:22:23 +03:00
coderiaser
4fa0786a39 chore: cloudcmd: v19.11.11 2026-04-06 20:59:36 +03:00
coderiaser
ae2ce3882c feature: docker: io: $DENO_DIR 2026-04-06 20:58:51 +03:00
coderiaser
3c9389c4f0 chore: cloudcmd: v19.11.10 2026-04-06 19:56:41 +03:00
coderiaser
bb6be7abbb feature: docker: io: nvm: node 2026-04-06 19:56:41 +03:00
coderiaser
3aac4e68b4 chore: cloudcmd: v19.11.9 2026-04-06 13:24:03 +03:00
coderiaser
ea96d13fab feature: docker: io: net-tools 2026-04-06 13:23:34 +03:00
coderiaser
f9c5804fb8 chore: cloudcmd: v19.11.8 2026-04-06 12:56:31 +03:00
coderiaser
84f96fa185 feature: docker: io: debian -> ubuntu 2026-04-06 12:56:31 +03:00
coderiaser
8238bd4011 chore: cloudcmd: v19.11.7 2026-04-05 21:38:55 +03:00
coderiaser
36cdef3717 feature: docker: io: bookworm 2026-04-05 21:38:26 +03:00
coderiaser
f8035d6c49 chore: cloudcmd: v19.11.6 2026-04-05 20:53:01 +03:00
coderiaser
845f9bd127 feature: cloudcmd: gritty v10.2.0 2026-04-05 20:52:26 +03:00
coderiaser
b5ec9ce210 chore: cloudcmd: v19.11.5 2026-04-05 00:33:37 +03:00
coderiaser
71a1d78c39 feature: docker: io: hexyl: add 2026-04-05 00:33:37 +03:00
coderiaser
6bbfeb9024 chore: cloudcmd: v19.11.4 2026-04-05 00:33:37 +03:00
coderiaser
a038470816 feature: docker: io: neovim: apt -> github 2026-04-05 00:33:37 +03:00
coderiaser
45e0ff41f4 chore: cloudcmd: v19.11.3 2026-04-04 18:39:59 +03:00
coderiaser
9970ff7629 feature: docker: io: btop 2026-04-04 18:34:13 +03:00
coderiaser
4395a47178 feature: docker: io: $PATH: add $HOME/.local/bin 2026-04-04 18:30:01 +03:00
coderiaser
77daf5028e chore: cloudcmd: v19.11.2 2026-04-04 18:23:34 +03:00
coderiaser
c40ae8e405 feature: docker: io: htop 2026-04-04 18:23:04 +03:00
coderiaser
f463c5c5a7 feature: docker: io: aptitude: add 2026-04-04 17:20:05 +03:00
coderiaser
d1032f09ab feature: docker: io: remove unused 2026-04-04 17:19:09 +03:00
coderiaser
b3e682c0a5 chore: cloudcmd: v19.11.1 2026-04-04 17:11:39 +03:00
coderiaser
ffabdc5276 feature: docker: io: ncdu 2026-04-04 17:11:39 +03:00
coderiaser
7787bfc22e feature: cloudcmd: user-menu: runFromCDN 2026-04-04 17:04:55 +03:00
coderiaser
406429aec8 chore: cloudcmd: v19.11.0 2026-04-04 02:05:28 +03:00
coderiaser
32f89d3874 feature: cloudcmd: user-menu: root 2026-04-04 02:04:40 +03:00
coderiaser
1c0021dbb6 chore: cloudcmd: v19.10.2 2026-04-04 00:06:30 +03:00
coderiaser
df4fb51716 feature: cloudcmd: aleman v2.0.1 2026-04-04 00:05:55 +03:00
coderiaser
314cceb462 chore: cloudcmd: v19.10.1 2026-04-03 23:12:27 +03:00
coderiaser
ceb7ef4ff7 feature: docker: io: keep /var/lib/apt/lists 2026-04-03 23:12:00 +03:00
coderiaser
34fad6ea73 chore: cloudcmd: v19.10.0 2026-04-02 18:19:15 +03:00
chaoliang yan
d12e7bd0c5 fix: distribute: fix event listener leak on socket disconnect (#462) 2026-04-02 18:18:47 +03:00
coderiaser
b8a621ca1b chore: cloudcmd: v19.9.24 2026-04-02 18:13:16 +03:00
coderiaser
1fc1e3734c feature: docker: io: apt-get upgrade 2026-04-02 18:13:16 +03:00
coderiaser
582b7423dc chore: cloudcmd: v19.9.23 2026-04-01 23:25:43 +03:00
coderiaser
e4d7d441fc feature: docker: io: nix 2026-04-01 23:25:43 +03:00
coderiaser
e53aa06cdb chore: cloudcmd: v19.9.22 2026-03-31 00:59:44 +03:00
coderiaser
b4345ed40d feature: docker: io: DENO_DIR 2026-03-31 00:59:02 +03:00
coderiaser
ddbf4d69a4 chore: cloudcmd: v19.9.21 2026-03-31 00:55:49 +03:00
coderiaser
e2855641ca feature: docker: io: rustup 2026-03-31 00:55:49 +03:00
coderiaser
5c6a9a958e fix: css: columns: name: 40% -> 35% 2026-03-31 00:50:35 +03:00
coderiaser
d2a7f6343a chore: cloudcmd: v19.9.20 2026-03-31 00:28:13 +03:00
coderiaser
2b29448062 feature: iocmd: io: nvm 2026-03-31 00:28:13 +03:00
coderiaser
09a8b2bd1c chore: cloudcmd: v19.9.19 2026-03-30 20:54:27 +03:00
coderiaser
6a52b11e46 feature: docker: io: go, rust 2026-03-30 20:53:59 +03:00
coderiaser
9a053ec374 chore: cloudcmd: v19.9.18 2026-03-30 20:36:44 +03:00
coderaiser
6aa496c995 chore: cloudcmd: actions: lint ☘️ 2026-03-30 20:36:43 +03:00
coderiaser
738059f27f feature: docker: io: fzf 2026-03-30 19:19:04 +03:00
coderiaser
3fc8932f4c feature: docker: io: less, el_GR 2026-03-30 19:10:51 +03:00
coderiaser
2db458bc7b chore: cloudcmd: v19.9.17 2026-03-30 00:11:13 +03:00
coderiaser
cf424d6c05 feature: docker: io: command-not-found update 2026-03-30 00:10:48 +03:00
coderiaser
8b9004b4dd chore: cloudcmd: v19.9.16 2026-03-29 23:22:14 +03:00
coderiaser
efb24e229f feature: docker: io: get back debian 2026-03-29 23:22:14 +03:00
coderiaser
19347a2b4c feature: docker: io: add command-not-found 2026-03-29 23:14:51 +03:00
coderiaser
a80f109d19 chore: cloudcmd: v19.9.15 2026-03-29 22:42:08 +03:00
coderiaser
74e008198f feature: docker: io: BUN_INSTALL_CACHE_DIR 2026-03-29 22:42:08 +03:00
coderiaser
d25a08d2bd feature: docker: io: ubuntu 2026-03-29 22:42:08 +03:00
coderiaser
e04c459489 feature: docker: io: net-tools: add 2026-03-29 20:12:12 +03:00
coderiaser
3d2944bd13 chore: cloudcmd: v19.9.14 2026-03-29 19:58:06 +03:00
coderaiser
52a9076f14 chore: cloudcmd: actions: lint ☘️ 2026-03-29 14:01:56 +00:00
coderiaser
7e2d2ede98 test: bin: coverage 2026-03-29 17:00:48 +03:00
coderiaser
6c7709be9c fix: docker: io: PS1 2026-03-29 17:00:48 +03:00
coderiaser
340a639f1b test: bin: cloudcmd: -h 2026-03-29 13:44:18 +03:00
coderiaser
aa5a772f00 chore: cloudcmd: v19.9.13 2026-03-29 13:41:12 +03:00
coderiaser
439b3710cc fix: bin: currify 2026-03-29 13:40:39 +03:00
coderiaser
e41828410c fix: docker: io: xterm-256color 2026-03-29 13:39:54 +03:00
coderiaser
799d86bda4 chore: cloudcmd: v19.9.12 2026-03-29 12:58:45 +03:00
coderiaser
a423739cb8 feature: cloudcmd: bin: get rid of require 2026-03-29 12:58:45 +03:00
coderiaser
47acb8fdf7 chore: cloudcmd: v19.9.11 2026-03-29 12:30:45 +03:00
coderiaser
1f95f18898 feature: cloudcmd: get rid of simport 2026-03-29 12:29:39 +03:00
coderiaser
2aaf0a5385 chore: cloudcmd: v19.9.10 2026-03-29 12:21:37 +03:00
coderiaser
1a44ab0eac fix: docker: io: use node
This reverts commit cc7f9dc75b.
2026-03-29 12:21:37 +03:00
coderiaser
fe3e201143 docs: help: readme from cloudcmd.io 2026-03-29 12:21:37 +03:00
coderiaser
f0deb32362 feature: docker: io: add ja_JP.UTF-8 2026-03-29 00:59:53 +02:00
coderiaser
ba6f66e73e chore: cloudcmd: v19.9.9 2026-03-29 00:56:35 +02:00
coderiaser
cc7f9dc75b feature: docker: io: use ubuntu 2026-03-29 00:55:53 +02:00
coderaiser
f671f79814
fix: docker: io: PS1 environment variable in Dockerfile 2026-03-28 23:42:07 +01:00
coderaiser
fa8875d53c chore: cloudcmd: actions: lint ☘️ 2026-03-28 20:44:34 +00:00
coderiaser
2dd62241f7 chore: cloudcmd: v19.9.8 2026-03-28 22:43:32 +02:00
coderiaser
4d1cd8cdc6 feature: docker: io: ffmpeg 2026-03-28 22:42:38 +02:00
coderiaser
54b56fdc38 feature: cloudcmd: vim: ESC: use only to enable, do not use to disable 2026-03-28 22:40:46 +02:00
coderiaser
785c32e2e3 chore: docker: io: echo 2026-03-27 19:50:01 +02:00
coderiaser
c3f2b7c32f chore: cloudcmd: v19.9.7 2026-03-27 19:46:11 +02:00
coderiaser
110908e221 feature: docker: io: apt-get 2026-03-27 19:45:32 +02:00
coderiaser
8be917da4a chore: cloudcmd: v19.9.6 2026-03-27 18:31:34 +02:00
coderiaser
8db81f30dc feature: docker: io: add UTF-8 2026-03-27 18:31:34 +02:00
coderiaser
56439d5ec2 chore: cloudcmd: v19.9.5 2026-03-26 13:17:11 +02:00
coderiaser
e761cacbd0 fix: columns: name-size-date-time: 20% -> 19% 2026-03-26 13:16:40 +02:00
coderiaser
0bb706995a chore: cloudcmd: v19.9.4 2026-03-26 13:15:02 +02:00
coderiaser
69498ed6ab feature: docker: io: pull.rebase by default 2026-03-26 13:13:44 +02:00
coderiaser
82f8d846a9 chore: docker: get rid of healcheck 2026-03-24 16:41:10 +02:00
coderiaser
1ea4aa67ca chore: cloudcmd: v19.9.3 2026-03-24 16:33:55 +02:00
coderiaser
8763788bad feature: docker: io: healthcheck 2026-03-24 16:33:31 +02:00
coderiaser
c1c67c18af chore: cloudcmd: v19.9.2 2026-03-23 23:55:21 +02:00
coderiaser
09a02074e1 feature: docker: io: git config: add 2026-03-23 23:54:48 +02:00
coderiaser
c448eaa48b feature: docker: io: buni 2026-03-23 23:54:48 +02:00
coderaiser
05ad2fd635 chore: cloudcmd: actions: lint ☘️ 2026-03-23 21:50:02 +00:00
coderiaser
b949a149ec chore: cloudcmd: v19.9.1 2026-03-23 23:49:01 +02:00
coderiaser
6e5318faa7 fix: client: modules: config: input: quote 2026-03-23 23:48:34 +02:00
coderiaser
ec66ba78a7 chore: cloudcmd: v19.9.0 2026-03-23 23:04:38 +02:00
coderiaser
a1216cddeb feature: cloudcmd: add ability to hide port configuration 2026-03-23 23:03:47 +02:00
coderiaser
2f0affd3a3 chore: cloudcmd: v19.8.15 2026-03-23 22:51:10 +02:00
coderiaser
68b2aa780b feature: docker: io: cloudcmd_vim 2026-03-23 22:50:34 +02:00
coderiaser
56e21b4011 chore: cloudcmd: v19.8.14 2026-03-23 22:12:37 +02:00
coderiaser
665ed9c2e9 fix: docker: io: get back port 2026-03-23 22:12:03 +02:00
coderiaser
a44a28f496 chore: cloudcmd: v19.8.13 2026-03-23 19:42:52 +02:00
coderaiser
f51229fc6f feature: docker: io: port 2026-03-23 17:42:02 +00:00
coderiaser
0c9f3922f8 chore: actions: lint 2026-03-23 19:19:04 +02:00
coderiaser
4410cd2665 chore: cloudcmd: v19.8.12 2026-03-23 17:07:19 +00:00
coderiaser
618a561514 feature: docker: io: PS1 2026-03-23 17:07:19 +00:00
coderiaser
682729ac3e chore: cloudcmd: v19.8.11 2026-03-23 18:53:19 +02:00
coderiaser
67f27d8425 feature: docker: io: bun, deno 2026-03-23 18:52:54 +02:00
coderiaser
97672ef5d5 fix: docker: io: apt-get install -> apt-get 2026-03-23 18:41:51 +02:00
coderiaser
e6684df59e chore: cloudcmd: v19.8.10 2026-03-23 18:32:52 +02:00
coderiaser
9493e4de7e featur: docker: io: ls --color 2026-03-23 18:18:10 +02:00
coderiaser
025b005e12 feature: docker: io: add PS1 2026-03-23 18:16:38 +02:00
coderiaser
2d524a4974 chore: cloudcmd: v19.8.9 2026-03-23 15:46:53 +02:00
coderiaser
5e0b681d8b chore: docker: lint 2026-03-23 15:46:11 +02:00
coderiaser
b052cf220d fix: cloudcmd: no time available: --.--.---- -> --:--:-- (#461) 2026-03-23 15:46:00 +02:00
coderiaser
4fa92f9394 chore: cloudcmd: v19.8.8 2026-03-23 12:23:24 +02:00
coderiaser
02dbe56d79 feature: server: user-menu: when error send it 2026-03-23 12:20:31 +02:00
coderiaser
e616cc0bc9 chore: cloudcmd: v19.8.7 2026-03-23 12:13:18 +02:00
coderiaser
ecc76e8b1e feature: docker: io: renamify-cli, runny, redfork 2026-03-23 12:12:28 +02:00
coderiaser
0fbfa0f0cf chore: cloudcmd: v19.8.6 2026-03-23 01:49:08 +02:00
coderiaser
53c072abe4 fix: @putout/plugin-cloudcmd: devDependencies -> dependnecies 2026-03-23 01:48:46 +02:00
coderiaser
4b9922bf92 feature: docker: /usr/src: app -> cloudcmd 2026-03-23 01:43:05 +02:00
coderiaser
1bb77992b0 chore: cloudcmd: v19.8.5 2026-03-23 01:39:37 +02:00
coderiaser
bec991d941 chore: lint 2026-03-23 01:39:15 +02:00
coderiaser
56fc8b838a fix: docker: gritty 2026-03-23 01:31:58 +02:00
coderiaser
df21e81d5a chore: docker: lint 2026-03-23 00:52:54 +02:00
coderiaser
8b83277ec0 chore: cloudcmd: v19.8.4 2026-03-23 00:30:04 +02:00
coderiaser
660f57e914 chore: actions: docker: set-output -> GITHUB_OUTPUT (https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/) 2026-03-23 00:30:02 +02:00
coderiaser
151c56f9a3 feature: Dockerfile: simplify 2026-03-23 00:19:55 +02:00
coderiaser
9e529605e1 feature: docker: vim nvim 2026-03-22 23:22:01 +02:00
coderiaser
ca97c21e9c chore: cloudcmd: v19.8.3 2026-03-22 22:25:32 +02:00
coderiaser
01677e6a09 fix: docker: io: slim -> io 2026-03-22 22:24:44 +02:00
coderiaser
7e35c60677 feature: docker: io: curl wget 2026-03-22 22:19:21 +02:00
coderiaser
a20640ed75 chore: cloudcmd: v19.8.2 2026-03-22 16:02:19 +02:00
coderaiser
e5b221f7ac feature: docker: io: add 2026-03-22 13:59:47 +00:00
coderiaser
2396000a6a chore: cloudcmd: v19.8.1 2026-03-22 02:04:27 +02:00
coderiaser
7661f69f1a test: cloudcmd: coverage 2026-03-22 02:04:27 +02:00
coderaiser
708a4c6b99 feature: docker: slim: add 2026-03-21 23:38:56 +00:00
coderaiser
84f3a3dc79 chore: cloudcmd: actions: lint ☘️ 2026-03-21 22:16:01 +00:00
coderaiser
80613f46fa feature: docker: slim: add 2026-03-21 22:14:53 +00:00
coderaiser
e9a8910c9c chore: cloudcmd: actions: lint ☘️ 2026-03-20 15:56:30 +00:00
coderiaser
e78f5d943f chore: cloudcmd: v19.8.0 2026-03-20 17:55:27 +02:00
coderiaser
10934b3ad9 feature: cloudcmd: add ability to show modification time (#230) 2026-03-20 17:54:58 +02:00
coderaiser
ddf5a59f70 chore: cloudcmd: actions: lint ☘️ 2026-03-20 14:55:06 +00:00
coderiaser
59037f2c18 fix: cloudcmd: bin: --show-config 2026-03-20 16:53:57 +02:00
coderiaser
1444550865 chore: cloudcmd: v19.7.1 2026-03-18 12:46:21 +02:00
coderiaser
b0c1d36c81 feature: cloudcmd: @cloudcmd/fileop v9.0.7 (#460) 2026-03-18 12:45:30 +02:00
coderaiser
10b225a337 chore: cloudcmd: actions: lint ☘️ 2026-03-17 19:12:28 +00:00
coderiaser
289f67e0d3 chore: cloudcmd: v19.7.0 2026-03-17 21:11:22 +02:00
coderiaser
daf8387516 feature: cloudfunc: override date format (#459) 2026-03-17 21:10:56 +02:00
coderaiser
170b4da211 chore: cloudcmd: actions: lint ☘️ 2026-03-17 18:45:13 +00:00
coderiaser
c9b27bb514 chore: cloudcmd: v19.6.9 2026-03-17 20:44:05 +02:00
coderiaser
5c19ddba61 chore: lint 2026-03-17 20:43:43 +02:00
coderiaser
b28a070a28 feature: cloudcmd: redzip v4.6.1 2026-03-17 20:41:28 +02:00
coderiaser
43c5a01102 feature: cloudcmd: css-minimizer-webpack-plugin v8.0.0 2026-03-17 20:41:21 +02:00
coderiaser
15dcae5c5e feature: cloudcmd: webpack-cli v7.0.2 2026-03-17 20:41:15 +02:00
coderiaser
5976da81df feature: cloudcmd: @cloudcmd/fileop v9.0.5 2026-02-28 15:50:32 +02:00
coderiaser
37cb83f2cf feature: cloudcmd: redzip v4.6.0 2026-02-28 15:50:27 +02:00
coderiaser
dd5f392293 chore: cloudcmd: v19.6.8 2026-02-27 01:14:17 +02:00
coderiaser
15fab5142f feature: cloudcmd: copymitter v10.3.0 (#458) 2026-02-27 01:13:19 +02:00
coderiaser
d2801ca896 chore: cloudcmd: v19.6.7 2026-02-26 20:18:27 +02:00
coderiaser
68c7d0be3b feature: cloudcmd: onezip v7.0.0 2026-02-26 20:17:28 +02:00
coderiaser
bfbaae9ec0 chore: cloudcmd: v19.6.6 2026-02-26 19:24:05 +02:00
coderiaser
3987cc82c1 feature: cloudcmd: redzip v4.5.1 (#457) 2026-02-26 19:23:14 +02:00
coderiaser
559b7424b6 chore: cloudcmd: v19.6.5 2026-02-26 16:06:55 +02:00
coderiaser
964ae989f2 feature: cloudcmd: redzip v4.5.0 (#457) 2026-02-26 16:06:21 +02:00
coderaiser
ff4e02c210 chore: cloudcmd: actions: lint ☘️ 2026-02-25 15:04:30 +00:00
coderiaser
9ead35242a chore: lint: scan -> fix 2026-02-25 17:03:22 +02:00
coderiaser
061ab38b24 chore: madrun: simplify 2026-02-25 17:02:22 +02:00
coderiaser
07bc9e2782 chore: cloudcmd: v19.6.4 2026-02-25 17:00:54 +02:00
coderiaser
a66eeda37e feature: cloudcmd: copymitter v10.2.0 (coderaiser/cloudcmd#457) 2026-02-25 16:59:19 +02:00
coderiaser
4340533acf feature: cloudcmd: c8 v11.0.0 2026-02-25 16:59:12 +02:00
coderiaser
394939e0d5 chore: cloudcmd: v19.6.3 2026-02-24 23:21:34 +02:00
coderiaser
0857711f61 feature: cloudcmd: redzip v4.2.0 (#457) 2026-02-24 23:21:27 +02:00
coderiaser
5aba36cca0 chore: cloudcmd: v19.6.2 2026-02-24 21:26:52 +02:00
coderiaser
3d2e5feda2 chore: lint 2026-02-24 21:24:15 +02:00
coderiaser
321a54dd59 feature: cloudcmd: @cloudcmd/fileop v9.0.2 (#457) 2026-02-24 21:23:33 +02:00
coderiaser
feb6eb2468 chore: cloudcmd: v19.6.1 2026-02-24 15:12:26 +02:00
coderiaser
7c5ac408e5 feature: cloudcmd: @cloudcmd/fileop v9.0.1 (#457) 2026-02-24 15:11:44 +02:00
coderiaser
37ecb3d7ac docs: readme: import: default -> named 2026-02-21 17:36:59 +02:00
coderiaser
52023c82cb chore: cloudcmd: v19.6.0 2026-02-21 17:34:43 +02:00
coderiaser
6d19bf2e14 feature: common: object.omit -> omit 2026-02-21 17:33:20 +02:00
coderiaser
d7214aba70 chore: cloudcmd: v19.5.1 2026-02-18 19:57:27 +02:00
coderiaser
6e1cf4ef52 feature: cloudcmd: supermenu v5.0.0 2026-02-18 19:56:56 +02:00
coderiaser
3aed798ff1 chore: cloudcmd: v19.5.0 2026-02-18 19:46:35 +02:00
coderaiser
957fbc6533 chore: cloudcmd: actions: lint ☘️ 2026-02-18 17:41:57 +00:00
coderiaser
b20539ef2b feature: common: entity: encode {,} 2026-02-18 19:40:55 +02:00
coderiaser
7ef134f46f feature: cloudcmd: rendy v5.0.0 2026-02-18 19:21:47 +02:00
coderiaser
cdeb40d191 chore: cloudcmd: v19.4.1 2026-02-18 14:55:46 +02:00
coderiaser
1e18d51342 feature: cloudcmd: @cloudcmd/fileop v9.0.0 2026-02-18 14:54:54 +02:00
coderiaser
8836d816d5 chore: cloudcmd: v19.4.0 2026-02-18 14:16:01 +02:00
coderiaser
ff9fcb1189 chore: lint 2026-02-18 14:15:22 +02:00
coderiaser
45cf9bafcd fix: menu: prefix (#456) 2026-02-18 14:09:30 +02:00
coderiaser
3e647290fd feature: cloudcmd: redlint v6.0.0 2026-02-18 14:04:19 +02:00
coderiaser
800ed012ba feature: cloudcmd: putout v42.0.5 2026-02-18 14:04:18 +02:00
coderiaser
525c17d4bd feature: cloudcmd: madrun v13.0.0 2026-02-18 14:04:17 +02:00
coderiaser
4424749978 feature: cloudcmd: eslint-plugin-putout v31.0.0 2026-02-18 14:04:17 +02:00
coderiaser
9fc3c389bf chore: cloudcmd: v19.3.9 2026-02-15 23:46:59 +02:00
coderiaser
9ffe3ef137 feature: cloudcmd: copymitter v10.0.0 (#457) 2026-02-15 23:44:18 +02:00
coderiaser
a9105e6797 chore: cloudcmd: v19.3.8 2026-02-15 22:35:16 +02:00
coderiaser
3438a0c6a1 chore: webpack: add css minification 2026-02-15 22:34:39 +02:00
coderaiser
e969b3c2b3 chore: cloudcmd: actions: lint ☘️ 2026-02-15 20:25:32 +00:00
coderiaser
d274a2b3db fix: spinner (#456) 2026-02-15 22:24:34 +02:00
coderiaser
5c9ae0a0de chore: cloudcmd: v19.3.7 2026-02-13 16:25:48 +02:00
coderiaser
8fd79a2792 feature: cloudcmd: win32 v8.0.0 2026-02-13 16:24:43 +02:00
coderiaser
9267f7a28d chore: cloudcmd: v19.3.6 2026-02-12 14:07:31 +02:00
coderiaser
3479c3b3f2 test: server: route: console-io -> gritty 2026-02-12 14:06:46 +02:00
coderiaser
ac94eccd90 feature: cloudcmd: konsole: named 2026-02-12 14:00:34 +02:00
coderiaser
144e4a3468 feature: cloudcmd: gritty v10.0.0 2026-02-12 14:00:34 +02:00
coderiaser
938f9e7674 feature: cloudcmd: console-io v15.0.1 2026-02-10 20:01:56 +02:00
coderiaser
c229160605 chore: cloudcmd: v19.3.5 2026-02-08 20:41:09 +02:00
coderiaser
fb40bd9cec feature: rm cssnano: has no sense for spinner, option disabled by default (https://svgo.dev/docs/plugins/convertPathData/) 2026-02-08 20:39:03 +02:00
coderiaser
76125be9f5 feature: cloudcmd: eslint v10.0.0 2026-02-07 16:51:36 +02:00
coderiaser
d0730e12d9 chore: cloudcmd: v19.3.4 2026-02-06 22:00:21 +02:00
coderiaser
66a08c7f71 feature: cloudcmd: deepword v11.0.0 2026-02-06 21:59:42 +02:00
coderiaser
f3a0d3a3fe chore: cloudcmd: v19.3.3 2026-02-05 14:22:52 +02:00
coderiaser
4a5a56f403 feature: cloudcmd: dword v16.0.0 2026-02-05 14:22:09 +02:00
coderiaser
846dd1bf22 chore: cloudcmd: v19.3.2 2026-02-04 20:52:09 +02:00
coderiaser
99d8435e9d fix: cloudcmd: exports 2026-02-04 20:51:08 +02:00
coderiaser
30f42e9495 feature: cloudcmd: restafary v13.0.1 2026-02-04 20:50:00 +02:00
coderiaser
f84ce8534e feature: cloudcmd: edward v16.0.0 2026-02-03 21:31:42 +02:00
coderiaser
a266c1452c fix: cloudcmd: default -> named 2026-02-03 20:08:58 +02:00
coderaiser
b61818fe62 chore: cloudcmd: actions: lint ☘️ 2026-02-03 14:27:37 +00:00
coderiaser
dad4cd1f57 chore: cloudcmd: v19.3.1 2026-02-03 16:23:35 +02:00
coderiaser
f5cabc7696 test: static: user-menu: compare directories 2026-02-03 16:23:21 +02:00
coderiaser
6e3ba27131 fix: Closing X in editor disappeared (#455) 2026-02-03 16:23:13 +02:00
coderaiser
e68338a17b chore: cloudcmd: actions: lint ☘️ 2026-02-03 14:16:16 +00:00
coderiaser
c7095e2570 chore: cloudcmd: v19.3.0 2026-02-03 16:11:23 +02:00
coderiaser
31570e4fae chore: current-file: typo 2026-02-03 16:11:23 +02:00
coderiaser
307583e374 chore: lint 2026-02-03 15:53:21 +02:00
coderiaser
09601047e5 chore: cssnano: back to cjs 2026-02-03 15:50:38 +02:00
coderiaser
3d19f4727a test: user-menu: coverage 2026-02-03 15:45:45 +02:00
coderiaser
4533a25c6f feature: cloudcmd: migrate to ESM 2026-02-03 15:03:49 +02:00
coderiaser
e8a81c49ea feature: client: dom: events: migrate to ESM 2026-02-03 14:19:16 +02:00
coderiaser
071141bc5a feature: client: terminal-run: migrate to ESM 2026-02-03 14:11:52 +02:00
coderiaser
1db64d7324 chore: cloudcmd: v19.2.0 2026-02-03 14:06:43 +02:00
coderiaser
bb32f7c448 feature: client: dom: migrate to ESM 2026-02-03 14:06:12 +02:00
coderiaser
457c83dba9 feature: client: migrate to ESM 2026-02-03 13:35:24 +02:00
coderiaser
f8a941bdd9 feature: client: modules: markdown: migrate to ESM 2026-02-03 13:29:12 +02:00
coderiaser
9d6cffafdc feature: client: polifyll: migrate to ESM 2026-02-03 13:27:16 +02:00
coderiaser
5b704d0684 feature: client: edit-names: migrate to ESM 2026-02-03 12:23:26 +02:00
coderiaser
2c2ca8eb39 feature: client: edit-file: migrate to ESM 2026-02-03 12:20:47 +02:00
coderiaser
c9f57c5f20 feature: client: modules: edit-file-vim: migrate to ESM 2026-02-03 01:07:24 +02:00
coderiaser
327ac9dee6 feature: client: modules: help: migrate to ESM 2026-02-03 00:58:16 +02:00
coderiaser
dc34ee8714 feature: cloudcmd: @putout/plugin-cloudcmd v5.0.0 2026-02-03 00:56:39 +02:00
coderiaser
3cd3695be6 feature: client: modules: edit-names-vim: migrate to ESM 2026-02-03 00:56:05 +02:00
coderiaser
dfcbfd632e feature: client: modules: terminal: migrate to ESM 2026-02-03 00:36:40 +02:00
coderiaser
bf50550911 chore: cloudcmd: v19.1.21 2026-02-02 22:39:21 +02:00
coderiaser
e3ad330ebc feature: client: konsole: migrate to ESM 2026-02-02 22:38:53 +02:00
coderiaser
983fd9af3d feature: client: edit: migrate to ESM 2026-02-02 22:37:02 +02:00
coderiaser
ebabad948f feature: common: entity: migrate to ESM 2026-02-02 22:23:33 +02:00
coderiaser
c3b71653bb feature: client: dom: images -> #images 2026-02-02 19:18:08 +02:00
coderiaser
8cad7514e7 feature: common: cloudfunc -> #common/cloudfunc 2026-02-02 19:16:21 +02:00
coderiaser
1f174870ab feature: client: view: migrate to ESM 2026-02-02 19:10:56 +02:00
coderiaser
7173f6cb18 feature: cloudcmd: smalltalk v5.0.0 2026-02-02 19:05:52 +02:00
coderiaser
0d7b037ac2 client: modules: command-line: migrate to ESM 2026-02-01 23:31:20 +02:00
coderiaser
dae57c3d20 chore: cloudcmd: v19.1.20 2026-01-31 22:48:38 +02:00
coderiaser
c1014c9cc0 feature: client: dom: operations: rename-current: migrate to ESM 2026-01-31 22:47:52 +02:00
coderiaser
2e486f8bed feature: cloudcmd: restafary v13.0.0 2026-01-31 22:45:48 +02:00
coderiaser
6addb29f7f feature: cloudcmd: redzip v4.0.0 2026-01-31 22:28:28 +02:00
coderiaser
c0988590a7 chore: lint 2026-01-30 21:43:39 +02:00
coderiaser
5e742c5b82 chore: cloudcmd: v19.1.19 2026-01-30 21:04:48 +02:00
coderiaser
2a0feac7e0 feature: cloudcmd: @cloudcmd/modal v4.0.0 2026-01-30 21:03:43 +02:00
coderiaser
603e232ca2 chore: cloudcmd: v19.1.18 2026-01-30 00:56:11 +02:00
coderiaser
73fa4961c0 feature: client: modules: user-menu: migrate to ESM 2026-01-30 00:55:32 +02:00
coderiaser
ebfdf8c087 feature: client: modules: operation: migrate to ESM 2026-01-29 18:52:38 +02:00
coderiaser
ad6831712b feature: client: modules: menu: migrate to ESM 2026-01-29 18:49:38 +02:00
coderiaser
9e65c52ff1 test: client: dom: index: migrate to ESM 2026-01-29 18:47:30 +02:00
coderiaser
0054cfa363 feature: client: dom: load-remote: migrate to ESM 2026-01-29 18:46:43 +02:00
coderiaser
145bc48722 chore: cloudcmd: types 2026-01-29 18:33:05 +02:00
coderiaser
e4d0ece093 feature: client: dom: rest: migrate to ESM 2026-01-29 18:31:10 +02:00
coderiaser
c704ffe47a feature: client: dom: storage: migrate to ESM 2026-01-29 18:22:12 +02:00
coderiaser
5182cb8107 feature: client: modules: upload: migrate to ESM 2026-01-29 18:18:39 +02:00
coderiaser
9543f1adb0 feature: client: dom: upload-files: migrate to ESM 2026-01-29 18:17:24 +02:00
coderiaser
21d765fb9f chore: cloudcmd: v19.1.17 2026-01-29 16:14:04 +02:00
coderiaser
f9c2831939 feature: client: dom: migrate to ESM 2026-01-29 16:13:41 +02:00
coderiaser
9d2c4e4a0d feature: client: dom: cmd: move out 2026-01-29 14:51:15 +02:00
coderiaser
5a2aa70f90 feature: client: dom: simplify require 2026-01-29 14:45:02 +02:00
coderiaser
dee50a8548 feature: client: dom: files: migrate to ESM 2026-01-29 14:27:19 +02:00
coderiaser
23c0d77042 feature: client: dom: dom-tree: migrate to ESM 2026-01-29 14:25:56 +02:00
coderiaser
cf2c641564 feature: client: directory: migrate to ESM 2026-01-29 14:25:56 +02:00
coderiaser
0eb802e7bd feature: client: dom: dialog: migrate to ESM 2026-01-29 14:18:34 +02:00
coderiaser
8223800ac6 chore: madrun: wisdom: CI 2026-01-28 23:07:39 +02:00
coderiaser
041d889970 chore: cloudcmd: v19.1.16 2026-01-28 23:05:36 +02:00
coderiaser
4c242631fa fix: css: spinner: do not minify svg 2026-01-28 23:05:08 +02:00
coderiaser
75938809ea chore: cloudcmd: v19.1.15 2026-01-28 23:01:32 +02:00
coderiaser
265c0b491a feature: client: key: vim: migrate to ESM 2026-01-28 23:00:50 +02:00
coderiaser
9ab2cec877 chore: lint 2026-01-28 22:54:29 +02:00
coderiaser
82bb338c1f test: client: key: migrate to ESM 2026-01-28 22:53:36 +02:00
coderiaser
3bc49f02f8 feature: client: set-current-by-char: migrate to ESM 2026-01-28 22:52:32 +02:00
coderiaser
4f1a797cd7 chore: cloudcmd: v19.1.14 2026-01-28 21:04:24 +02:00
coderiaser
f8a63b5a13 feature: client: key: binder: migrate to ESM 2026-01-28 21:03:53 +02:00
coderiaser
d250bf0223 test: client: get rid of mock-require 2026-01-28 20:59:38 +02:00
coderiaser
e1d2f01f57 test: client: vim: get rid of mock-require 2026-01-28 20:58:46 +02:00
coderiaser
2cc97f33f1 feature: client: cloud: migrate to ESM 2026-01-28 20:57:26 +02:00
coderiaser
b5acbafab9 chore: lint 2026-01-28 16:17:52 +02:00
coderiaser
bf1ffd0751 chore: cloudcmd: v19.1.13 2026-01-27 21:18:53 +02:00
coderiaser
41b5a96fa6 feature: client: load: migrate to ESM 2026-01-27 21:18:16 +02:00
coderiaser
116430e542 chore: cloudcmd: v19.1.12 2026-01-27 20:37:28 +02:00
coderiaser
27a52d33d0 feature: client: sw: migrate to ESM 2026-01-27 20:35:38 +02:00
coderiaser
54c89e52f8 client: config: migrate to ESM 2026-01-27 20:20:38 +02:00
coderiaser
6b049d954b feature: client: sw: register: migrate to ESM 2026-01-27 13:41:21 +02:00
coderiaser
5a16b018c5 chore: cloudcmd: v19.1.11 2026-01-25 22:54:09 +02:00
coderiaser
f849b8423d feature: client: listeners: migrate to ESM 2026-01-25 22:53:32 +02:00
coderiaser
091f901789 feature: client: listeners: simplify 2026-01-25 22:44:42 +02:00
coderiaser
3c0c7c3044 client: key: migrate to ESM 2026-01-25 22:42:57 +02:00
coderiaser
3c1a82e702 feature: client: key: view: get rid of mock-require 2026-01-25 22:41:02 +02:00
coderiaser
6fe61b775b chore: cloudcmd: v19.1.10 2026-01-25 21:43:26 +02:00
coderiaser
dc5867b006 feature: client: key: vim: get rid of mock-require 2026-01-25 21:42:57 +02:00
coderiaser
77b70b2142 feature: cloudcmd: aleman v2.0.0 2026-01-25 21:36:47 +02:00
coderiaser
78e87796df chore: cloudcmd: v19.1.9 2026-01-21 20:08:24 +02:00
coderiaser
75ad4415c4 feature: cloudcmd: @putout/eslint-flat v4.0.0 2026-01-21 20:06:53 +02:00
coderiaser
c5d9bd7c1f feature: client: key: vim: get rid of mock-require 2026-01-21 20:06:35 +02:00
coderiaser
f437a52ff0 feature: client: images: migrate to EMS 2026-01-21 19:59:27 +02:00
coderiaser
7192a56e94 feature: client: dom: current-file: migrate to ESM 2026-01-21 19:50:30 +02:00
coderiaser
b9dd4f2676 chore: cloudcmd: v19.1.8 2026-01-20 23:43:51 +02:00
coderiaser
e8cf3c92f9 chore: lint 2026-01-20 23:43:06 +02:00
coderiaser
d574a93d6d feature: client: key: migrate to ESM 2026-01-20 23:41:26 +02:00
coderiaser
8a769fd512 fix: client: modules: operation: no update after copy 2026-01-20 23:41:26 +02:00
coderiaser
3b409074c1 feature: client: modules: operation: migrate to ESM 2026-01-20 23:41:26 +02:00
coderiaser
3b6b0b5a5b feature: client: buffer: migrate to ESM 2026-01-20 23:41:26 +02:00
coderiaser
8876f050e0 feature: cloudcmd: eslint-plugin-putout v30.0.0 2026-01-20 23:41:26 +02:00
coderiaser
8507282d55 test: cloudcmd: client: key: rm skip 2026-01-20 23:41:26 +02:00
coderaiser
f61b21eecc chore: cloudcmd: actions: lint ☘️ 2026-01-17 12:36:49 +00:00
coderiaser
242820b7cf chore: cloudcmd: v19.1.7 2026-01-17 14:36:00 +02:00
coderiaser
dd240ba9b2 test: client: key: vim: rm skip 2026-01-17 14:36:00 +02:00
coderaiser
4b945c0047 chore: cloudcmd: actions: lint ☘️ 2026-01-17 12:23:41 +00:00
coderiaser
23a6a6981a feature: client: dom/events -> #dom/events 2026-01-17 14:22:49 +02:00
coderiaser
9cebb2416f feature: client: dom: events: migrate to ESM 2026-01-17 14:22:49 +02:00
coderiaser
a94fa0d465 feature: client: cloudcmd: migrate to ESM 2026-01-17 14:22:49 +02:00
coderiaser
3bdf47a5bb feature: client: migrate to ESM 2026-01-17 14:22:49 +02:00
coderaiser
0ccd109a50 chore: cloudcmd: actions: lint ☘️ 2026-01-16 22:25:24 +00:00
coderaiser
6b0bd2e1de
refactor: client: move out inner functions 2026-01-16 23:24:31 +01:00
coderiaser
c23a6a12c8 chore: cloudcmd: v19.1.6 2026-01-16 23:56:12 +02:00
coderiaser
a523ef65f5 fix: tests 2026-01-16 23:55:32 +02:00
coderaiser
0971ac4e94 chore: cloudcmd: actions: lint ☘️ 2026-01-16 21:49:12 +00:00
coderiaser
64654e8d5c feature: common: cloudfunc: migrate to ESM 2026-01-16 23:48:19 +02:00
coderaiser
a063353a27 chore: cloudcmd: actions: lint ☘️ 2026-01-16 21:21:49 +00:00
coderiaser
add31607f9 feature: common: cloudfunc: get rid of bas64 2026-01-16 23:20:54 +02:00
coderiaser
e36de00ce8 feature: modulas: migrate to ESM 2026-01-16 23:20:54 +02:00
coderaiser
2c1210bbb1 chore: cloudcmd: actions: lint ☘️ 2026-01-16 17:14:25 +00:00
coderiaser
85ebf21122 chore: cloudcmd: v19.1.5 2026-01-16 19:13:27 +02:00
coderiaser
450f14614d feature: client: improve testability 2026-01-16 19:12:44 +02:00
coderaiser
f75bf4a401 chore: cloudcmd: actions: lint ☘️ 2026-01-16 16:28:05 +00:00
coderiaser
d979e94927 feature: server: env: migrate to ESM 2026-01-16 18:27:01 +02:00
coderiaser
8de9bd0847 chore: webpack: migrate to ESM 2026-01-16 14:19:35 +02:00
coderiaser
e178321be9 chore: cloudcmd: v19.1.4 2026-01-15 22:14:35 +02:00
coderiaser
4b84d20bb0 chore: cloudcmd 2026-01-15 22:14:01 +02:00
coderiaser
6e778a35ba feature: client: sort: migrate to ESM 2026-01-15 18:03:09 +02:00
coderiaser
e27ef51d43 feature: client: sort: migrate to ESM 2026-01-15 18:02:54 +02:00
coderiaser
917f585137 feature: client: load-module: migrate to ESM 2026-01-15 17:55:17 +02:00
coderiaser
9950cacad9 feature: client: get-json-from-file-table: migrate to ESM 2026-01-15 17:53:45 +02:00
coderiaser
457e23f31d chore: cloudcmd: v19.1.3 2026-01-15 16:33:27 +02:00
coderiaser
cfa0b5e382 test: cloudcmd: client: key 2026-01-15 16:32:28 +02:00
coderiaser
f903c5c9c5 feature: cloudcmd: multi-rename v3.0.0 2026-01-15 16:22:47 +02:00
coderiaser
08dd5ac183 chore: cloudcmd: v19.1.2 2026-01-14 14:38:46 +02:00
coderiaser
9e2c5ac635 fix: client: edit-names: group rename not renaming (#453) 2026-01-14 14:37:29 +02:00
coderiaser
6856207d0d feature: server: env -> env.parse 2026-01-14 13:20:37 +02:00
coderiaser
f0dcbe946f fix: client: key: config 2026-01-14 13:18:53 +02:00
coderiaser
008279df57 chore: rm eslintrc 2026-01-13 16:03:49 +02:00
coderiaser
dc99417c27 feature: client: key: get rid of mock-require 2026-01-13 15:19:32 +02:00
coderiaser
12751646fe test: ployfill: get rid of mock-require 2026-01-13 13:47:14 +02:00
coderaiser
8234201a39 chore: cloudcmd: actions: lint ☘️ 2026-01-13 11:37:25 +00:00
coderiaser
4bb7d704b4 feature: client: modules: view: get rid of mock-require 2026-01-13 13:36:35 +02:00
coderiaser
feb5aad36b test: client: sw: register: get rid of mock-require 2026-01-13 13:28:31 +02:00
coderiaser
c231fca334 test: client: dom: operations: rename-current: get rid of mock-require 2026-01-12 21:48:18 +02:00
coderiaser
14452d05b6 test: client: dom: io: get rid of mock-require 2026-01-12 21:40:54 +02:00
coderiaser
5c1ad5f8ff chore: cloudcmd: v19.1.1 2026-01-12 13:33:21 +02:00
coderiaser
5b4bb90d61 test: client: dom: goTiDirectory: get rid of mock-require 2026-01-12 13:32:48 +02:00
coderiaser
5cc6f79d6a feature: cloudcmd: @cloudcmd/stub v5.0.0 2026-01-12 13:15:36 +02:00
coderiaser
024bc41345 feature: cloudcmd: fullstore v4.0.0 2026-01-12 13:15:36 +02:00
coderiaser
fb115c675e test: common: util: get rid of mock-require 2026-01-12 13:10:05 +02:00
coderiaser
53f6f9e76f feature: cloudcmd: globals v17.0.0 2026-01-04 22:43:24 +02:00
coderiaser
6d21c539d4 feature: cloudcmd: madrun v12.1.0 2026-01-04 22:43:21 +02:00
coderiaser
253389ea7b feature: cloudcmd: supertape v12.0.0 2026-01-04 22:43:17 +02:00
coderiaser
cdf11f7483 chore: cloudcmd: v19.1.0 2025-12-31 14:14:29 +02:00
coderiaser
0ff16314d7 feature: cloudcmd: redlint v5.0.0 2025-12-31 14:13:33 +02:00
coderiaser
cc889bda4f chore: lint 2025-12-31 14:13:10 +02:00
coderiaser
43edba8cb8 feature: cloudcmd: try-to-catch v4.0.0 2025-12-31 13:44:04 +02:00
coderiaser
06f3b78256 feature: cloudcmd: try-catch v4.0.4 2025-12-31 13:44:00 +02:00
coderiaser
dfcd655780 feature: deno config: add 2025-12-24 16:47:48 +02:00
coderiaser
ab20a462db feature: server: bun support (oven-sh/bun#25674) 2025-12-24 15:53:38 +02:00
coderiaser
2ec57132ed chore: cloudcmd: v19.0.17 2025-12-24 14:42:43 +02:00
coderiaser
0222d177fc feature: cloudcmd: gritty v9.0.0 2025-12-24 14:25:32 +02:00
coderiaser
db0e0aef73 chore: cloudcmd: v19.0.16 2025-12-05 19:32:16 +02:00
coderiaser
14ec19e80a feature: cloudcmd: find-up v8.0.0 2025-12-05 19:30:34 +02:00
coderiaser
e6a00979ff feature: cloudcmd: eslint-plugin-putout v29.0.2 2025-12-05 19:29:52 +02:00
coderiaser
5b5352c7d9 feature: cloudcmd: putout v41.0.0 2025-12-05 19:29:47 +02:00
coderiaser
78ddbd8a39 chore: cloudcmd: v19.0.15 2025-11-28 13:07:28 +02:00
coderiaser
0067653109 feature: cloudcmd: aleman v1.16.5 2025-11-28 13:06:31 +02:00
coderiaser
5a2ac765d4 chore: cloudcmd: v19.0.14 2025-11-27 20:17:40 +02:00
coderiaser
3ceb9a8c59 feature: cloudcmd: open v11.0.0 2025-11-27 20:16:41 +02:00
coderiaser
2a525e9bbb fix: aleman: copy paste in text editor (#449) 2025-11-27 20:16:05 +02:00
coderaiser
a49e963dc9 chore: lint 2025-10-26 15:17:50 +02:00
coderiaser
1037a1a264 chore: cloudcmd: v19.0.13 2025-09-26 13:21:16 +03:00
coderiaser
8477f3e466 feature: cloudcmd: aleman v1.16.3 (#446) 2025-09-26 13:20:41 +03:00
coderiaser
e5d004c0af chore: cloudcmd: v19.0.12 2025-09-25 20:26:41 +03:00
coderiaser
836e908e11 feature: cloudcmd: aleman v1.16.2 2025-09-25 20:25:54 +03:00
coderiaser
9fd4a451ab chore: cloudcmd: v19.0.11 2025-09-24 18:08:25 +03:00
coderiaser
f4386a6f0f feature: cloudcmd: aleman v1.16.1 2025-09-24 18:07:18 +03:00
coderaiser
91f9c0a1aa
chore: putout: client: disable nodejs 2025-09-24 08:13:59 +02:00
coderiaser
babeb9fb85 chore: cloudcmd: v19.0.10 2025-09-23 21:16:46 +03:00
coderiaser
2e667ba693 feature: cloudcmd: aleman v1.15.0 2025-09-23 21:16:21 +03:00
coderiaser
07d18cfe96 chore: cloudcmd: v19.0.9 2025-09-22 17:58:22 +03:00
coderiaser
60c56164b0 feature: cloudcmd: aleman v1.14.4 2025-09-22 17:57:42 +03:00
coderiaser
d8453236c2 chore: cloudcmd: v19.0.8 2025-09-20 13:14:00 +03:00
coderiaser
efe81320e1 feature: cloudcmd: aleman v1.14.3 2025-09-20 13:13:42 +03:00
coderaiser
14e6754be3 chore: cloudcmd: actions: lint ☘️ 2025-09-18 16:56:23 +00:00
coderiaser
3033aed2e3 chore: cloudcmd: v19.0.7 2025-09-18 19:55:21 +03:00
coderiaser
5b972e2e4a feature: cloudcmd: aleman v1.14.0 2025-09-18 19:54:51 +03:00
coderaiser
543e08a837 chore: cloudcmd: actions: lint ☘️ 2025-09-17 20:17:02 +00:00
coderiaser
2a8109f090 chore: cloudcmd: v19.0.6 2025-09-17 23:16:00 +03:00
coderiaser
39a24028ac feature: cloudcmd: aleman v1.13.0 2025-09-17 23:15:17 +03:00
coderiaser
3f3c644500 chore: cloudcmd: v19.0.5 2025-09-16 17:13:04 +03:00
coderiaser
38dd510158 feature: cloudcmd: aleman v1.12.4 2025-09-16 17:12:17 +03:00
coderiaser
64df81bc45 fix: cloudcmd: client: listeners: f9: stopPropagation 2025-09-16 17:11:32 +03:00
coderiaser
8366b3bbe2 chore: cloudcmd: v19.0.4 2025-09-15 22:11:21 +03:00
coderiaser
66db798c35 feature: cloudcmd: aleman v1.12.3 2025-09-15 22:10:56 +03:00
coderiaser
56ed1cd535 chore: cloudcmd: v19.0.3 2025-09-15 17:49:10 +03:00
coderiaser
c5aed16f63 feature: cloudcmd: aleman v1.12.2 2025-09-15 17:48:40 +03:00
coderiaser
1537fa73fc chore: cloudcmd: v19.0.2 2025-09-14 22:22:41 +03:00
coderiaser
511347d3ef feature: cloudcmd: aleman v1.11.0 2025-09-14 22:22:04 +03:00
coderiaser
c963ffefee chore: cloudcmd: v19.0.1 2025-09-14 22:10:54 +03:00
coderiaser
fc6304a1c6 fix: tmpl: config: aleman, supermenu 2025-09-14 22:10:30 +03:00
coderiaser
a05ecdb406 feature: cloudcmd: aleman v1.10.0 2025-09-14 22:07:48 +03:00
coderiaser
9e4d66df4d docs: help: menu: typos 2025-09-14 19:46:31 +03:00
coderiaser
3f7e17721e chore: cloudcmd: v19.0.0 2025-09-14 19:40:40 +03:00
coderiaser
50b19dcc44 feature: cloudcmd: menu: default: supermenu -> aleman 2025-09-14 19:38:46 +03:00
coderiaser
7fb130cdbd chore: actions: v24 2025-09-14 19:38:18 +03:00
coderiaser
5970f10a84 feature: cloudcmd: drop support of node < 22 2025-09-14 19:37:41 +03:00
coderiaser
84a51a932c chore: cloudcmd: v18.8.11 2025-09-14 19:12:26 +03:00
coderiaser
b0360d8ef4 feature: cloudcmd: aleman v1.9.1 2025-09-14 19:11:45 +03:00
coderiaser
00a20129de feature: cloudcmd: html: importsmap: add 2025-09-14 19:11:04 +03:00
coderiaser
5e657e9bd1 chore: cloudcmd: v18.8.10 2025-09-14 18:20:57 +03:00
coderiaser
2559343eef docs: help: menu: hot keys 2025-09-14 18:09:41 +03:00
coderiaser
ddf9e45567 feature: cloudcmd: aleman v1.9.0 2025-09-14 18:09:15 +03:00
coderiaser
84bfef562d chore: cloudcmd: v18.8.9 2025-09-14 12:13:49 +03:00
coderiaser
2e7bdb8aa0 feature: cloudcmd: aleman v1.8.0 2025-09-14 12:13:00 +03:00
coderiaser
a2f66951a8 chore: cloudcmd: v18.8.8 2025-09-13 16:56:52 +03:00
coderiaser
03631d95f7 feature: cloudcmd: aleman v1.7.0 2025-09-13 16:55:59 +03:00
coderiaser
1fc57fdb91 chore: cloudcmd: v18.8.7 2025-09-12 16:43:18 +03:00
coderiaser
09408af5dd feature: cloudcmd: aleman v1.6.1 2025-09-12 16:42:35 +03:00
coderiaser
4eb47f9d42 chore: cloudcmd: v18.8.6 2025-09-12 16:15:36 +03:00
coderiaser
4fcaf2885d feature: cloudcmd: aleman v1.6.0 2025-09-12 16:14:20 +03:00
coderiaser
eaea183536 chore: cloudcmd: v18.8.5 2025-09-10 19:56:40 +03:00
coderiaser
c69ec16ef0 feature: cloudcmd: aleman v1.5.0 2025-09-10 19:56:04 +03:00
coderiaser
3cf13a92c0 chore: cloudcmd: v18.8.4 2025-09-09 18:53:23 +03:00
coderiaser
08d13c6d6b feature: cloudcmd: aleman v1.4.9 2025-09-09 18:52:27 +03:00
coderiaser
df79dda4d0 chore: cloudcmd: v18.8.3 2025-09-04 23:40:33 +03:00
coderiaser
b4792fc3f2 feature: cloudcmd: aleman v1.4.0 2025-09-04 23:40:07 +03:00
coderiaser
c164766895 chore: cloudcmd: v18.8.2 2025-09-04 20:21:08 +03:00
coderiaser
0584f4f431 feature: cloudcmd: aleman v1.3.0 2025-09-04 20:21:08 +03:00
coderaiser
67e4b8f0e4 chore: cloudcmd: actions: lint ☘️ 2025-09-03 22:33:25 +00:00
coderiaser
876bbfded5 chore: cloudcmd: v18.8.1 2025-09-04 01:32:26 +03:00
coderiaser
15b71c1485 feature: cloudcmd: aleman v1.2.5 2025-09-04 01:31:41 +03:00
coderiaser
d252fe5fcb feature: robots.txt: add 2025-09-03 11:55:13 +03:00
coderaiser
25119ac6ea chore: cloudcmd: actions: lint ☘️ 2025-09-01 21:45:36 +00:00
coderiaser
fc20b9a4e1 chore: cloudcmd: v18.8.0 2025-09-02 00:44:38 +03:00
coderaiser
faa2f9c765 chore: cloudcmd: actions: lint ☘️ 2025-09-01 21:44:29 +00:00
coderiaser
08b5c6b2b5 feature: client: menu: aleman: add 2025-09-02 00:33:25 +03:00
coderiaser
83a1e527e5 chore: cloudcmd: v18.7.4 2025-08-30 15:10:44 +03:00
coderiaser
a6d18ddb88 fix: select file: name -> line 2025-08-30 15:09:23 +03:00
coderiaser
7db31363ff refactor: clients: dom: events: simplify 2025-08-17 15:13:51 +03:00
coderiaser
2077468a85 fix: client: listeners: click: avoid select on conext menu 2025-08-17 15:13:24 +03:00
coderaiser
e3fcb7f24e
chore: client: view: rm comment 2025-08-13 21:23:53 +02:00
coderiaser
64e4aba414 fix: client: menu: before show: unsetBind 2025-08-10 23:50:05 +03:00
coderaiser
899266a62a
docs: HELP: demo 2025-08-01 17:45:23 +03:00
coderiaser
d568a4d896 chore: cloudcmd: v18.7.3 2025-07-26 22:53:15 +03:00
coderiaser
884c83eb60 fix: client: polyfill (#442) 2025-07-26 22:52:50 +03:00
coderaiser
b34ee44bb1
docs: bug_report: update 2025-07-26 14:12:44 +03:00
coderaiser
c3251bf5e1
docs: README: demo 2025-07-26 14:03:54 +03:00
coderiaser
54bbd4e34d chore: cloudcmd: v18.7.2 2025-07-24 19:17:31 +03:00
coderiaser
3d13b9c5f8 feature: docker: npm -> bun 2025-07-24 19:17:31 +03:00
coderiaser
61107329fc feature: cloudcmd: html-looks-like: remove 2025-07-24 16:50:42 +03:00
coderiaser
f0bc286aea chore: cloudcmd: v18.7.1 2025-07-06 20:25:56 +03:00
coderiaser
8eb724b58c fix: docker: install: -f 2025-07-06 20:25:56 +03:00
coderiaser
784bb2ebdd fix: build: sw 2025-07-06 20:19:40 +03:00
coderiaser
8f52376d3f feature: cloudcmd: revert: optimize-css-assets-webpack-plugin -> css-minimizer-webpack-plugin: broken spinner
This reverts commit 8200874912.
2025-07-06 20:02:22 +03:00
coderiaser
ed31dd2409 chore: devDependencies: serviceworker-webpack-plugin 2025-07-06 20:02:08 +03:00
coderiaser
8200874912 feature: cloudcmd: optimize-css-assets-webpack-plugin -> css-minimizer-webpack-plugin 2025-07-06 15:11:18 +03:00
coderiaser
4b8568b264 chore: cloudcmd: v18.7.0 2025-07-05 20:43:51 +03:00
coderiaser
de41aec77d test: server 2025-07-05 20:42:36 +03:00
coderaiser
74f5eb0cae chore: cloudcmd: actions: lint ☘️ 2025-07-05 17:40:30 +00:00
coderiaser
1d983e9950 test: cloudcmd: server 2025-07-05 20:39:25 +03:00
coderiaser
f9b3844153 chore: lint 2025-07-05 20:35:16 +03:00
coderiaser
546d061068 feature: cloudcmd: process v0.11.10 2025-07-05 20:34:57 +03:00
coderiaser
b1e231a5bb fix: client: menu: close: ESC 2025-07-05 20:32:21 +03:00
coderiaser
121b114e89 feature: cloudcmd: path-browserify v1.0.1 2025-07-05 20:29:57 +03:00
coderiaser
8592cedce0 feature: cloudcmd: mini-css-extract-plugin v2.9.2 2025-07-05 20:27:55 +03:00
coderiaser
a53ab67b7d feature: cloudcmd: webpack-cli v6.0.1 2025-07-05 20:26:27 +03:00
coderiaser
de2cedd99d feature: cloudcmd: webpack v5.99.9 2025-07-05 20:26:27 +03:00
coderiaser
da545ea418 feature: cloudcmd: style-loader v4.0.0 2025-07-05 20:26:26 +03:00
coderiaser
db6e8334b8 feature: cloudcmd: optimize-css-assets-webpack-plugin v6.0.1 2025-07-05 20:26:26 +03:00
coderiaser
2f0c1a616c feature: cloudcmd: html-webpack-plugin v5.6.3 2025-07-05 20:26:25 +03:00
coderiaser
e100dcf627 feature: cloudcmd: extract-text-webpack-plugin v3.0.2 2025-07-05 20:26:25 +03:00
coderiaser
76c4000890 feature: cloudcmd: css-loader v7.1.2 2025-07-05 20:26:24 +03:00
coderiaser
fb5e5a320f feature: cloudcmd: clean-css-loader v4.2.1 2025-07-05 20:26:24 +03:00
coderiaser
8551cd54a6 feature: cloudcmd: babel-loader v10.0.0 2025-07-05 20:26:23 +03:00
coderiaser
c93803190b feature: webpack 5 2025-07-05 20:25:41 +03:00
coderiaser
ddc94adbf1 feature: cloudcmd: eslint-plugin-putout v28.0.0 2025-07-04 14:23:05 +03:00
coderiaser
ef42330848 chore: cloudcmd: v18.6.1 2025-07-04 13:41:56 +03:00
coderiaser
a54caa1d7c chore: lint 2025-07-04 13:41:22 +03:00
coderiaser
9eafa189a8 feature: cloudcmd: http-auth v4.2.1 2025-07-04 13:41:22 +03:00
coderaiser
baaf47e62f chore: cloudcmd: actions: lint ☘️ 2025-07-04 10:34:29 +00:00
coderiaser
0d61a972fb chore: lint 2025-07-04 13:32:47 +03:00
coderiaser
af77eeed8d chore: lint 2025-07-04 12:54:30 +03:00
coderiaser
e99d084728 feature: cloudcmd: montag v1.2.1 2025-07-03 23:21:44 +03:00
coderiaser
b77e9c91d4 feature: cloudcmd: pipe-io v4.0.1 2025-07-03 23:21:05 +03:00
coderiaser
4b476a6dff feature: cloudcmd: globals v16.3.0 2025-07-03 23:20:57 +03:00
coderiaser
2057065dbf feature: cloudcmd: @putout/eslint-flat v3.0.1 2025-07-03 23:20:53 +03:00
coderiaser
a87e5ceaf6 chore: cloudcmd: v18.6.0 2025-07-02 21:18:44 +03:00
coderiaser
2eb3dc6692 feature: cloudcmd: @iocmd/wait v2.1.0 2025-07-02 21:17:48 +03:00
coderiaser
5f0391fc44 chore: lint 2025-07-02 21:15:33 +03:00
coderiaser
1679b788c2 feature: cloudcmd: webpackbar v7.0.0 2025-07-02 19:57:34 +03:00
coderiaser
9a4cf388d3 feature: cloudcmd: eslint-plugin-putout v27.2.1 2025-07-02 18:42:15 +03:00
coderiaser
f4b0f92f05 feature: cloudcmd: express v5.1.0 2025-07-02 18:40:04 +03:00
coderiaser
4ab4be124b feature: thread-it: get rid (#438) 2025-07-02 18:34:59 +03:00
coderiaser
99ad0c217d feature: cloudcmd: rm @putout/babel 2025-07-02 17:17:12 +03:00
coderiaser
8ccec23d6c feature: cloudcmd: help: require -> import 2025-07-02 17:16:39 +03:00
coderiaser
2a97ac66fb feature: cloudcmd: yargs-parser v22.0.0 2025-07-02 17:14:47 +03:00
coderiaser
b26c8bba37 feature: cloudcmd: thread-it v3.0.0 2025-04-24 17:19:31 +03:00
coderiaser
4b78d70b5c chore: cloudcmd: v18.5.2 2025-04-10 17:24:15 +03:00
coderiaser
8450bfa611 feature: cloudcmd: putout v40.0.3 2025-04-10 17:23:39 +03:00
coderaiser
84c6935ae4 chore: cloudcmd: actions: lint ☘️ 2025-03-29 17:32:46 +00:00
coderiaser
9f52ed795d chore: package: postcss 2025-03-29 19:30:48 +02:00
coderiaser
f7379c0562 chore: lint 2025-03-29 19:30:48 +02:00
coderiaser
51f51b54de feature: cloudcmd: @putout/plugin-cloudcmd v4.0.0 2025-03-29 19:30:48 +02:00
coderiaser
e87418adde chore: lint 2025-03-29 19:30:48 +02:00
coderiaser
08ab63d704 feature: cloudcmd: supertape v11.0.4 2025-03-29 19:30:48 +02:00
coderiaser
e7cc9b92ae feature: cloudcmd: redlint v4.1.1 2025-03-29 19:30:48 +02:00
coderiaser
368c9bb814 feature: cloudcmd: eslint v9.23.0 2025-03-29 19:30:48 +02:00
coderiaser
43fd5ed660 feature: cloudcmd: madrun v11.0.0 2025-03-29 19:30:48 +02:00
coderiaser
f774d5b290 feature: cloudcmd: eslint-plugin-putout v26.1.0 2025-03-29 19:30:48 +02:00
coderiaser
b0a7fc1648 feature: cloudcmd: putout v39.3.0 2025-03-29 19:30:48 +02:00
coderaiser
f1193955fb chore: cloudcmd: actions: lint ☘️ 2025-02-04 17:04:57 +00:00
coderaiser
2d21001e55
Update config.yml 2025-02-04 19:03:58 +02:00
coderiaser
99118e65a6 chore: lint 2025-02-04 19:02:58 +02:00
coderaiser
8ff0ee6a1a
Update issue_template.md 2025-02-04 18:14:03 +02:00
coderaiser
ac9a27b333 chore: cloudcmd: actions: lint ☘️ 2025-02-04 16:13:38 +00:00
coderaiser
84719365b1
Update issue templates 2025-02-04 18:12:28 +02:00
coderaiser
34fb175d63 chore: cloudcmd: actions: lint ☘️ 2025-02-04 15:45:56 +00:00
coderaiser
dbd8c6ab7c
Update issue_template.md 2025-02-04 17:45:01 +02:00
coderaiser
716765104c
Update config.yml 2025-02-04 17:44:25 +02:00
coderaiser
51a4cee688
Update issue_template.md 2025-02-04 17:43:54 +02:00
coderaiser
b2f113bf0a
Update issue_template.md 2025-02-04 17:43:12 +02:00
coderaiser
2e02ba46e8 chore: cloudcmd: actions: lint ☘️ 2025-02-04 15:41:51 +00:00
coderaiser
38666cbb8b
Update issue_template.md 2025-02-04 17:40:55 +02:00
coderaiser
53acae1a63 chore: cloudcmd: actions: lint ☘️ 2025-02-04 15:39:36 +00:00
coderaiser
e2591061af
chore: issue_template: updated 2025-02-04 17:38:33 +02:00
coderaiser
3d52ce80f2
Update FUNDING.yml 2025-02-04 16:06:08 +02:00
coderaiser
a598ef3ed0 chore: cloudcmd: actions: lint ☘️ 2025-02-04 14:05:53 +00:00
coderaiser
e71550d557
chrome: issue_template: improve 2025-02-04 16:04:53 +02:00
coderaiser
56d621b1ff chore: cloudcmd: actions: lint ☘️ 2025-02-04 13:59:35 +00:00
coderaiser
a38b3a79ce
chrome: issue_template.md 2025-02-04 15:58:38 +02:00
coderaiser
7ae60605bb chore: cloudcmd: actions: lint ☘️ 2025-02-04 13:57:41 +00:00
coderaiser
7492b4bfc7
chore: issue_template: configure 2025-02-04 15:56:47 +02:00
coderaiser
3adfec81c2
chore: github: config: forbid blank issues 2025-02-04 15:54:49 +02:00
coderaiser
c68a3a7f07
chore: github: issue_template.md 2025-02-04 15:54:10 +02:00
coderaiser
4eaeccba1c
chore: github: issue template 2025-02-04 15:53:17 +02:00
coderiaser
2dea0a3b2d chore: cloudcmd: v18.5.1 2025-02-03 14:51:27 +02:00
coderiaser
467f0a79c3 feature: cloudcmd: webpack-merge v6.0.1 2025-02-03 14:50:27 +02:00
coderiaser
353a1fb6c1 feature: cloudcmd: putout v38.0.5 2025-02-03 14:49:47 +02:00
coderiaser
8e98b778bd feature: cloudcmd: eslint-plugin-putout v24.0.0 2025-02-03 14:49:43 +02:00
coderiaser
3ad6720f5f chore: lint 2025-01-24 00:48:44 +02:00
coderiaser
b0be119474 chore: actions: yarn -> bun 2025-01-21 00:52:48 +02:00
coderiaser
161d4f952b chore: lint 2025-01-21 00:45:53 +02:00
coderiaser
301252906f chore: cloudcmd: v18.5.0 2025-01-20 18:48:58 +02:00
coderiaser
ddd1722f39 chore: lint 2025-01-20 18:48:26 +02:00
coderiaser
907afc6e4a chore: test: lint 2025-01-20 18:19:13 +02:00
coderiaser
d8da7922d9 chore: client: lint 2025-01-20 18:18:52 +02:00
coderiaser
2fc503f71f feature: cloudcmd: @putout/babel v3.0.0 2025-01-20 18:05:22 +02:00
coderiaser
ad8e55d824 fix: client: themes -> columns (#434) 2025-01-20 18:04:29 +02:00
coderiaser
5d22722010 chore: lint 2025-01-03 13:44:00 +02:00
coderaiser
13cb970a55
docs: license: 2025 2025-01-01 10:03:15 +01:00
coderiaser
94ebbf84cb chore: cloudcmd: v18.4.1 2024-12-13 14:51:41 +02:00
coderiaser
100e940e4b feature: cloudcmd: putout v37.0.1 2024-12-13 14:51:21 +02:00
coderiaser
a6ce6d3953 chore: cloudcmd: v18.4.0 2024-11-22 12:19:36 +02:00
coderiaser
da0e99ad8c refactor: server: auth: destructure 2024-11-22 12:19:14 +02:00
Hagay Goshen
dff0267239
fix: cloudcmd: make manifest.json accessible when authentication is enabled (#428)
* Make manifest.json accessable when authentication is enabled

* add test for manifest.json availability when authentication is enabled
2024-11-22 11:14:34 +01:00
coderiaser
03e3ba6ad8 chore: cloudcmd: v18.3.0 2024-11-14 12:26:52 +02:00
coderaiser
4c73315b5c chore: cloudcmd: actions: lint ☘️ 2024-11-13 21:13:27 +00:00
Hagay Goshen
71dc8dd6be
feature: cloudcmd: Add support for Progressive Web App (#426)
* Add support for Progressive Web App

* Add resized favicon 256x256
2024-11-13 22:11:13 +01:00
coderaiser
f2ef160ca8 chore: cloudcmd: actions: lint ☘️ 2024-11-06 15:01:08 +00:00
coderiaser
be4f6271f4 chore: cloudcmd: v18.2.1 2024-11-06 16:59:23 +02:00
coderiaser
a733d81441 feature: css: --is-mobile: add 2024-11-06 16:59:03 +02:00
coderaiser
06cf0eebce chore: cloudcmd: actions: lint ☘️ 2024-11-01 19:00:41 +00:00
Hagay Goshen
59024eea98
refactor: css: query: move width consts to css variables (#424)
* Move const panel width from code to css variables

* Update css/query.css

* Update css/query.css

---------

Co-authored-by: coderaiser <mnemonic.enemy@gmail.com>
2024-11-01 19:58:39 +01:00
coderaiser
62af673117 chore: cloudcmd: actions: lint ☘️ 2024-10-30 20:36:45 +00:00
Hagay Goshen
f22120dc38
feature: cloudcmd: prevent unselect being fired on panel click when in mobile view (#422)
* Prevent unselect being fired on panel click when in mobile view

* Prevent unselect being fired on panel click when in mobile view after review

---------

Co-authored-by: hagaygo <hagay@WORKROOM>
2024-10-30 21:34:39 +01:00
Marc
1a0af863a2
feature: docker: add image source label to dockerfiles (#421)
see #419
2024-10-28 09:56:38 +01:00
Marc
0446a74d28
feature: docker: add image source label to dockerfiles (#419)
To get changelogs shown with Renovate a docker container has to add the source label described in the OCI Image Format Specification.

For reference: https://github.com/renovatebot/renovate/blob/main/lib/modules/datasource/docker/readme.md
2024-10-27 12:09:02 +02:00
coderiaser
5562b47d84 chore: cloudcmd: v18.2.0 2024-10-27 12:06:21 +02:00
coderiaser
7309ceff37 chore: lint 2024-10-27 12:05:51 +02:00
coderiaser
ac9abbd385 feature: cloudcmd: eslint-plugin-putout v23.1.0 2024-10-27 12:05:51 +02:00
Hagay Goshen
4bc5a7834e feature: cloudcmd: add context menu option to toggle file selection (#420) 2024-10-27 12:05:42 +02:00
coderaiser
0f5fe2d4fe chore: cloudcmd: actions: lint ☘️ 2024-08-17 10:19:32 +00:00
coderiaser
f5015e75e8 chore: cloudcmd: v18.1.0 2024-08-17 13:17:49 +03:00
coderiaser
ddf4542b75 feature: cloudcmd: add ability to hide dot files (#307) 2024-08-17 13:17:01 +03:00
coderiaser
9dbd812b3d chore: cloudcmd: v18.0.2 2024-08-16 17:18:24 +03:00
coderiaser
3d03efbe63 feature: css: show links in one small screens 2024-08-16 17:17:44 +03:00
coderiaser
a522c49c1f chore: cloudcmd: v18.0.1 2024-08-16 14:54:54 +03:00
coderiaser
9ec94dee15 feature: cloudcmd: chalk v5.3.0 2024-08-16 14:54:05 +03:00
coderiaser
62ed8411ae fix: bin: validateArgs is not a function (#147) 2024-08-16 14:53:14 +03:00
coderaiser
75a75365cf chore: cloudcmd: actions: lint ☘️ 2024-08-16 09:17:21 +00:00
coderiaser
ac3f20c5d1 chore: cloudcmd: v18.0.0 2024-08-16 12:15:44 +03:00
coderiaser
9109511e95 chore: lint 2024-08-16 12:15:19 +03:00
coderiaser
b63d6fccde chore: lint 2024-08-16 12:13:29 +03:00
coderiaser
88df2f0518 chore: actions: node v22 2024-08-16 12:08:02 +03:00
coderiaser
5e93bcca1e feature: cloudcmd: rimraf v6.0.1 2024-08-16 12:06:47 +03:00
coderiaser
74d1eb7e28 feature: drop support of node < 20 2024-08-16 12:05:52 +03:00
coderiaser
544e30dbf8 chore: cloudcmd: v17.4.4 2024-08-16 11:48:11 +03:00
coderiaser
282b3d5cca feature: cloudcmd: @putout/cli-validate-args v2.0.0 2024-08-16 11:47:20 +03:00
coderiaser
a6aa9bbc44 fix: revert rimraf v6.0.1
This reverts commit 6e8348b843.
2024-08-16 11:46:51 +03:00
coderiaser
3140b7f998 chore: cloudcmd: v17.4.3 2024-07-27 15:54:10 +03:00
coderiaser
d70362fbf1 chore: npmvrc: add 2024-07-19 18:15:40 +03:00
coderiaser
6e8348b843 feature: cloudcmd: rimraf v6.0.1 2024-07-19 17:34:34 +03:00
coderiaser
61ca7f36a4 feature: cloudcmd: putout v36.0.2 2024-07-19 17:34:06 +03:00
coderiaser
b5e9ae5ad9 chore: cloudcmd: v17.4.2 2024-07-03 16:09:41 +03:00
coderiaser
ba2d0b36af feature: cloudcmd: just-snake-case v3.2.0 2024-07-03 15:36:21 +03:00
coderiaser
4cc47e30de feature: cloudcmd: just-capitalize v3.2.0 2024-07-03 15:36:21 +03:00
coderiaser
d8451e56aa feature: cloudcmd: just-pascal-case v3.2.0 2024-07-03 15:36:21 +03:00
coderiaser
6abf327d0d feature: cloudcmd: package-json v10.0.0 2024-07-03 15:36:21 +03:00
coderaiser
79fb49479e chore: cloudcmd: actions: lint ☘️ 2024-07-03 12:01:49 +00:00
zilion2000
2ae6ad34fc feature: docker: Dockerimage update Debian12 (#414) 2024-07-03 14:58:40 +03:00
coderiaser
14d9618a64 chore: lint 2024-06-14 22:33:14 +03:00
coderiaser
05ef0ae452 feature: cloudcmd: c8 v10.1.2 2024-06-14 22:32:50 +03:00
coderiaser
883eee96a2 chore: lint 2024-06-14 22:26:27 +03:00
coderaiser
9c8c0533a4
Update CONTRIBUTING.md 2024-06-13 09:11:36 +03:00
coderaiser
14d46c007b chore: cloudcmd: actions: lint ☘️ 2024-05-06 11:52:34 +00:00
coderaiser
25872c3b11 chore: cloudcmd: v17.4.1 2024-05-06 14:49:44 +03:00
coderaiser
610ba8827f chore: lint 2024-05-06 14:48:47 +03:00
coderaiser
154b4bd627 feature: cloudcmd: @cloudcmd/move-files v8.0.0 2024-05-06 12:21:01 +03:00
coderaiser
c409a2db82 feature: cloudcmd: copymitter v9.0.0 2024-05-06 12:20:55 +03:00
coderaiser
52df5bfcf4 chore: cloudcmd: v17.4.0 2024-04-17 00:05:05 +03:00
coderaiser
2428853613 chore: lint 2024-04-17 00:04:12 +03:00
coderaiser
6fb2102099 fix: server: route: path traversal 2024-04-17 00:04:12 +03:00
Devin Buhl
37ab7068d9
feature: publish container image to GHCR (#409)
* feat: publish container image to GHCR

Fixes: #408

* add permissions to workflow
2024-04-16 07:47:40 +03:00
coderaiser
d061aa82ea chore: cloudcmd: v17.3.3 2024-04-03 09:37:44 +03:00
coderaiser
b088b84eb1 feature: cloudcmd: deepword v10.0.0 2024-04-03 09:36:32 +03:00
coderaiser
fceddc20f8 chore: cloudcmd: v17.3.2 2024-03-29 16:01:48 +02:00
coderaiser
f7a6a36696 fix: typo: Wraped -> Wrapped 2024-03-29 16:01:13 +02:00
coderaiser
91de9b3d27 chore: cloudcmd: v17.3.1 2024-03-29 15:03:21 +02:00
coderaiser
2d37f6c6e9 docs: env: theme 2024-03-29 15:01:55 +02:00
coderaiser
d75818297b feature: distribute: convert to ESM 2024-03-29 15:01:55 +02:00
coderaiser
faa2cb3f90 docs: help 2024-03-29 14:28:55 +02:00
coderaiser
29914c09f1 docs: Special Thanks: link 2024-03-29 13:30:50 +02:00
coderaiser
7f5e5c6825 chore: cloudcmd: v17.3.0 2024-03-29 13:28:57 +02:00
coderaiser
6bc4f3ec26 feature: dark theme: add (#332) 2024-03-29 13:27:38 +02:00
coderaiser
35622082a9 feature: route: convert to ESM 2024-03-29 11:24:25 +02:00
coderaiser
65cf97a7be chore: cloudcmd: v17.2.1 2024-03-29 10:33:09 +02:00
coderaiser
cf9ed97c3e chore: lint 2024-03-29 10:32:22 +02:00
coderaiser
cc134464a4 fix: client: vim: space 2024-03-29 10:32:22 +02:00
coderaiser
e3f89e8845 feature: dark mode: add 2024-03-29 10:32:22 +02:00
coderaiser
c45b23fe55 feature: css: vars: add 2024-03-29 10:32:22 +02:00
coderaiser
b1f74c0057 feature: css: add vars 2024-03-29 10:32:22 +02:00
coderaiser
bf2e8f9a7d chore: cloudcmd: actions: lint ☘️ 2024-03-22 21:03:18 +00:00
coderaiser
f5f34a85ea chore: server: cloudcmd: sort imports 2024-03-22 23:01:42 +02:00
coderaiser
04e5d5b7e0 chore: cloudcmd: v17.2.0 2024-03-22 23:00:58 +02:00
coderaiser
3e565109b3 feature: convert to ESM 2024-03-22 23:00:24 +02:00
coderaiser
770a0812aa feature: pack: get rid of mock-require 2024-03-22 22:56:05 +02:00
coderaiser
25d8faea63 feature: rest: get rid of mock-require 2024-03-22 22:56:05 +02:00
coderaiser
98e0011e8e chore: cloudcmd: actions: lint ☘️ 2024-03-22 14:59:40 +00:00
coderaiser
401a669aca feature: user-menu: get rid of mock-require 2024-03-22 16:57:38 +02:00
coderaiser
4e32241d83 feature: terminal: get rid of mock-require 2024-03-22 10:52:25 +02:00
coderaiser
cfa3d69538 chore: cloudcmd: v17.1.6 2024-03-21 09:58:31 +02:00
coderaiser
e01ee4575b feature: server: route: get rid of mock-require 2024-03-21 09:57:49 +02:00
coderaiser
a03185e14e chore: cloudcmd: actions: lint ☘️ 2024-03-21 07:02:53 +00:00
coderaiser
564de89333 chore: server: cloudcmd: lint 2024-03-21 09:00:56 +02:00
coderaiser
0655988ed7 chore: lint 2024-03-21 08:50:25 +02:00
coderaiser
c7f9090126 feature: root: get rid of mock-require 2024-03-21 08:49:14 +02:00
coderaiser
1bef0d4381 chore: lint 2024-03-21 08:46:31 +02:00
coderaiser
fcce26d4e1 feature: cloudfunc: get rid of mock-require 2024-03-21 08:46:31 +02:00
coderaiser
6e99c7e3c5 chore: cloudcmd: actions: lint ☘️ 2024-03-20 11:28:14 +00:00
coderaiser
3f83f6f09a chore: cloudcmd: v17.1.5 2024-03-20 13:26:21 +02:00
coderaiser
bf90bf2295 feature: server: validate: get rid of mock-require 2024-03-20 13:25:44 +02:00
coderaiser
043ba29b32 chore: cloudcmd: v17.1.4 2024-03-20 13:13:28 +02:00
coderaiser
95c36b0a37 chore: lint 2024-03-20 13:12:45 +02:00
coderaiser
98d3a4cc56 feature: server: columns: get rid of mock-require 2024-03-20 12:37:27 +02:00
coderaiser
46c8accd84 chore: cloudcmd: actions: lint ☘️ 2024-03-18 16:32:23 +00:00
coderaiser
57d2f8e93d chore: cloudcmd: v17.1.3 2024-03-18 18:30:17 +02:00
coderaiser
e080a54022 feature: server: cloudcmd: get rid of mock-require 2024-03-18 18:29:13 +02:00
coderaiser
eff34215ee chore: lint 2024-03-18 16:46:11 +02:00
coderaiser
4503237ac4 chore: cloudcmd: v17.1.2 2024-03-18 15:04:56 +02:00
coderaiser
bf614e1dc9 feature: cloudcmd: redlint v3.13.1 2024-03-18 15:04:24 +02:00
coderaiser
857c97006d fix: docker: alpine 2024-03-18 15:04:24 +02:00
coderaiser
b2478a8145
docs: README: rm arm v7 2024-03-18 07:51:49 +02:00
coderaiser
3c5ca3dca4 chore: cloudcmd: v17.1.1 2024-03-16 18:45:42 +02:00
coderaiser
a92a5a0d34 feature: cloudcmd: restbox v4.0.0 2024-03-16 17:58:18 +02:00
coderaiser
c51ba1d8f6 feature: docker: drop arm v7 2024-03-16 17:22:05 +02:00
coderaiser
a57833aaf8 chore: cloudcmd: v17.1.0 2024-03-16 15:27:16 +02:00
coderaiser
0bcff30faa chore: lint 2024-03-16 15:26:23 +02:00
coderaiser
10d6d2e247 feature: cloudcmd: @types/node-fetch v2.6.11 2024-03-16 15:26:23 +02:00
coderaiser
2047cb7ad8 feature: cloudcmd: @cloudcmd/dropbox v5.0.1 2024-03-16 15:26:23 +02:00
coderaiser
6b793cca04 feature: cloudcmd: docker: alpine 2024-03-16 15:26:23 +02:00
coderaiser
5fa9fcc57c feature: cloudcmd: pullout v5.0.0 2024-03-16 15:26:23 +02:00
coderaiser
bc617c17ef feature: cloudcmd: serve-once v3.0.1 2024-03-16 15:26:23 +02:00
coderaiser
0ecd1853d0
Update ISSUE_TEMPLATE.md 2024-03-16 11:58:19 +02:00
coderaiser
dc2d3146a1
Update ISSUE_TEMPLATE.md 2024-03-15 12:29:43 +02:00
coderaiser
266aff4ffb chore: cloudcmd: v17.0.7 2024-03-12 17:40:33 +02:00
coderaiser
a407e0c3fa chore: lint 2024-03-12 17:39:58 +02:00
coderaiser
97627dc2ff feature: cloudcmd: auto-globals v4.0.0 2024-03-12 17:24:51 +02:00
coderaiser
683c865eda feature: cloudcmd: gritty v8.0.0 2024-03-12 17:08:35 +02:00
coderaiser
b795a1f5dd chore: cloudcmd: v17.0.6 2024-03-11 22:32:40 +02:00
coderaiser
d928c0b83d fix: cloudcmd: ocker: revert alpine (#406)
This reverts commit 33201dade2.
2024-03-11 22:31:13 +02:00
coderaiser
1d3567f3a3 chore: cloudcmd: v17.0.5 2024-03-11 16:07:05 +02:00
coderaiser
33201dade2 fix: cloudcmd: docker: alpine (#406) 2024-03-11 16:02:35 +02:00
coderaiser
5ced36b0d6 chore: cloudcmd: v17.0.4 2024-02-02 18:22:45 +02:00
coderaiser
7ce954503c feature: cloudcmd: deepword v9.0.0 2024-02-02 18:20:57 +02:00
coderaiser
1c73e525ff feature: cloudcmd: edward v15.0.0 2024-02-02 12:13:32 +02:00
coderaiser
da967f080c feature: cloudcmd: dword v15.0.0 2024-02-02 12:09:28 +02:00
coderaiser
f0a6109a7d feature: cloudcmd: restafary v12.0.0 2024-02-02 11:53:14 +02:00
coderaiser
e84c7dcbab chore: cloudcmd: v17.0.3 2024-02-01 14:43:33 +02:00
coderaiser
796ee627e7 chore: lint 2024-02-01 14:23:33 +02:00
coderaiser
aca4119fb1 feature: cloudcmd: inly v5.0.0 2024-02-01 14:14:37 +02:00
coderaiser
ed95dec964 chore: cloudcmd: v17.0.2 2024-02-01 12:44:28 +02:00
coderaiser
5324a41abd feature: cloudcmd: supertape v10.0.0 2024-02-01 12:43:49 +02:00
coderaiser
d453a1b291 feature: cloudcmd: onezip v6.0.1 2024-02-01 12:43:49 +02:00
coderaiser
71b915bed3 feature: cloudcmd: @cloudcmd/fileop v8.0.0 2024-02-01 12:43:49 +02:00
coderaiser
1ac4191c66
docs: LICENSE: 2024 2024-01-30 09:31:19 +02:00
coderaiser
4f25500351 chore: cloudcmd: actions: lint ☘️ 2024-01-25 10:02:20 +00:00
coderaiser
a0c398264c chore: cloudcmd: v17.0.1 2024-01-25 12:00:28 +02:00
coderaiser
d79a577611 feature: cloudcmd: putout v35.0.0 2024-01-25 11:56:36 +02:00
coderaiser
8d92aa91e9 feature: cloudcmd: package-json v9.0.0 2024-01-25 11:54:47 +02:00
coderaiser
5ab5576e68 feature: cloudcmd: open v10.0.3 2024-01-25 11:54:30 +02:00
coderaiser
c5cfe68c8a feature: cloudcmd: c8 v9.1.0 2024-01-25 11:54:06 +02:00
coderaiser
2fc241a9fa chore: lint 2023-12-12 23:12:50 +02:00
coderaiser
81a6b18165 chore: cloudcmd: actions: lint ☘️ 2023-12-12 18:00:45 +00:00
coderaiser
084c84a277 chore: lint 2023-12-12 19:58:39 +02:00
coderaiser
ba9915a1df chore: lint 2023-12-12 19:57:07 +02:00
coderaiser
60b682b62a
chore: query: lint 2023-12-12 19:09:02 +02:00
coderaiser
a3d310a3e4 chore: cloudcmd: v17.0.0 2023-12-12 16:11:42 +02:00
coderaiser
bbaad041be chore: lint (stylelint/stylelint#7401) 2023-12-12 16:09:30 +02:00
coderaiser
b22ad537e2 chore: proposal -> transform 2023-12-12 16:09:30 +02:00
coderaiser
154e3b078e feature: cloudcmd: find-up v7.0.0 2023-12-12 16:09:30 +02:00
coderaiser
a02d288df9 feature: cloudcmd: @putout/babel v2.0.0 2023-12-12 16:09:30 +02:00
coderaiser
3314f9b94f feature: drop support of node < 18 2023-12-12 16:09:30 +02:00
coderaiser
a6afa205a9 feature: cloudcmd: supertape v9.0.0 2023-12-12 16:05:18 +02:00
coderaiser
e600c05d18 feature: cloudcmd: eslint-plugin-putout v22.0.0 2023-12-12 16:05:18 +02:00
coderaiser
99c009542a feature: cloudcmd: madrun v10.0.0 2023-12-12 16:05:18 +02:00
coderaiser
afdf74342a feature: cloudcmd: putout v34.0.7 2023-12-12 16:05:18 +02:00
coderaiser
552d95013b
chore: server: route: newlines 2023-12-08 15:43:04 +02:00
coderaiser
eb606bb608 chore: cloudcmd: v16.18.0 2023-12-08 13:20:42 +02:00
coderaiser
f4a3add818 test: coverage 2023-12-08 13:19:24 +02:00
coderaiser
4462f26925 feature: cloudcmd: markdown-it v14.0.0 2023-12-08 13:19:24 +02:00
coderaiser
0cc76bd4f7 feature: cloudcmd: philip v3.0.0: decrease bundle size 2023-12-08 13:19:24 +02:00
coderaiser
949a09340f chore: cloudcmd: actions: lint ☘️ 2023-12-06 19:36:45 +00:00
coderaiser
5d6bed3d66 chore: lint 2023-12-06 21:33:38 +02:00
coderaiser
656ebd87e0 feature: client: move out set-current 2023-12-04 23:08:33 +02:00
coderaiser
72df4288ef chore: webpack: apply webpack5 externals 2023-12-04 20:46:37 +02:00
coderaiser
48dba5fa7e chore: cloudcmd: actions: lint ☘️ 2023-12-04 18:43:50 +00:00
coderaiser
8a85f99eb2 chore: cloudcmd: v16.17.9 2023-12-04 20:40:53 +02:00
coderaiser
2c7782c06a chore: putout: use npm instead of bun 2023-12-04 20:40:04 +02:00
coderaiser
fb2d081402 fix: github actions 2023-12-04 20:35:49 +02:00
coderaiser
f8f6377551 chore: cloudcmd: v16.17.8 2023-12-04 20:18:39 +02:00
coderaiser
b04cbcd8c5 chore: lint 2023-12-04 20:13:53 +02:00
coderaiser
094df666f4 test: cloudcmd: update 2023-12-04 20:04:39 +02:00
coderaiser
75bf8a1275 chore: lint 2023-12-03 23:07:50 +02:00
coderaiser
93aa7278b7 feature: yaspeller: rm 2023-12-03 20:23:20 +02:00
coderaiser
af9c916e08 feature: cloudcmd: eslint-plugin-putout v21.0.2 2023-12-03 20:21:52 +02:00
coderaiser
01dccbfd07 feature: cloudcmd: putout v33.13.3 2023-12-03 20:21:49 +02:00
coderaiser
ea86bd6a2f chore: cloudcmd: v16.17.7 2023-10-12 11:00:00 +03:00
coderaiser
7857fb720d feature: package: rendy v4.1.3 2023-10-12 10:37:10 +03:00
coderaiser
900d4307bb chore: cloudcmd: v16.17.6 2023-09-22 11:12:29 +03:00
coderaiser
570cb8c094 feature: package: nodemon v3.0.1 2023-09-22 11:10:11 +03:00
coderaiser
828d10a8ee feature: package: rimraf v5.0.1 2023-09-22 11:02:16 +03:00
coderaiser
88908b3528 feature: package: eslint-plugin-putout v20.0.0 2023-09-22 11:02:01 +03:00
coderaiser
93f4a07ec6 feature: package: putout v32.0.6 2023-09-22 11:01:50 +03:00
coderaiser
a5f93523c1 feature: github actions: use bun 2023-09-12 11:30:09 +03:00
coderaiser
99980c7f1d chore: cloudcmd: v16.17.5 2023-09-06 14:17:51 +03:00
coderaiser
3b0941bc87 feature: actions: docker/login-action@v2 (#396) 2023-09-06 14:17:00 +03:00
coderaiser
0dca7b6419 chore: cloudcmd: v16.17.4 2023-09-05 23:38:51 +03:00
coderaiser
35dedfdf95 feature: github: update docker actions (#396) 2023-09-05 23:37:40 +03:00
coderaiser
c37979801a chore: cloudcmd: v16.17.3 2023-09-05 12:42:26 +03:00
coderaiser
3c93b29b86 feature: github: docker/build-push-action v4 (#396) 2023-09-05 12:41:33 +03:00
coderaiser
7e2587459f chore: cloudcmd: v16.17.2 2023-09-04 17:19:08 +03:00
coderaiser
621f52da2f fix: docker 2023-09-04 17:18:19 +03:00
coderaiser
8ab7e468a8 chore: cloudcmd: v16.17.1 2023-09-04 16:12:18 +03:00
coderaiser
eb3f037a02 fix: docker: bun -> node 2023-09-04 16:11:00 +03:00
coderaiser
55032ebd7d chore: cloudcmd: actions: lint ☘️ 2023-09-04 13:04:01 +00:00
coderaiser
ee5a0fb4b2 fix: disable bun for CI 2023-09-04 16:01:26 +03:00
coderaiser
34258c6f27 chore: cloudcmd: actions: lint ☘️ 2023-09-04 12:59:45 +00:00
coderaiser
47893e3b83 chore: cloudcmd: v16.17.0 2023-09-04 15:56:39 +03:00
coderaiser
4c7dd74abd chore: test: add timeout 2023-09-04 15:55:41 +03:00
coderaiser
224e539708 feature: docker: use bun instead of node 2023-09-04 15:52:23 +03:00
coderaiser
ea929465a8 chore: lint 2023-09-04 15:43:38 +03:00
coderaiser
4b9267f375 feature: package: edward v14.2.0 2023-09-04 15:38:32 +03:00
coderaiser
809ef1cf60 chore: package: v16.16.3 2023-08-10 13:32:55 +03:00
coderaiser
354c137de6 feature: package: console-io v14.0.0 2023-08-10 13:31:41 +03:00
coderaiser
574b425c02 chore: package: v16.16.2 2023-08-09 19:04:52 +03:00
coderaiser
e353fff711 feature: package: redzip v3.0.0 2023-08-09 17:50:41 +03:00
coderaiser
4b74b8f286
Update README.md 2023-08-09 10:04:09 +03:00
coderaiser
339560fab2 chore: cloudcmd: actions: lint ☘️ 2023-08-07 15:09:19 +00:00
coderaiser
ba7133f2e6
Update README.md 2023-08-07 18:06:56 +03:00
coderaiser
e8ca8cedc5
Update README.md 2023-08-07 18:04:42 +03:00
coderaiser
f9aa9911d5 chore: package: v16.16.1 2023-08-07 17:56:00 +03:00
coderaiser
fcd06769b2 chore: lint 2023-08-07 17:54:48 +03:00
coderaiser
24dcf78be8 chore: lint 2023-08-07 17:40:25 +03:00
coderaiser
13279299c4 chore: lint 2023-08-07 17:38:39 +03:00
coderaiser
20a00481d6 chore: server: lint 2023-08-07 17:36:06 +03:00
coderaiser
d55b6fb393 chore: lint 2023-08-07 17:35:20 +03:00
coderaiser
d63169ccc0 feature: package: @putout/babel v1.0.5 2023-08-07 15:10:16 +03:00
coderaiser
bb9276bec5 feature: package: eslint-plugin-putout v19.0.3 2023-08-07 15:08:07 +03:00
coderaiser
9aed5f751e feature: package: putout v31.0.3 2023-08-07 15:08:00 +03:00
coderaiser
10f564a315 chore: package: v16.16.0 2023-07-09 12:53:33 +03:00
coderaiser
c4f56c59d0 feature: package: memfs v4.2.0 2023-07-09 12:51:58 +03:00
coderaiser
6b9d43e9ab chore: cloudcmd: actions: lint ☘️ 2023-07-09 09:51:29 +00:00
coderaiser
7aacf203a0 chore: madrun: node v20 2023-07-09 12:46:56 +03:00
coderaiser
4717e035ee chore: lint 2023-07-09 12:43:24 +03:00
coderaiser
f1279666b5 test: update fixtures 2023-07-08 20:40:12 +03:00
coderaiser
0e663e1dc5 feature: package: @putout/plugin-cloudcmd v3.1.1 2023-07-08 13:56:07 +03:00
coderaiser
ff9265b78b feature: package: c8 v8.0.0 2023-07-08 13:56:00 +03:00
coderaiser
22aa337ac0 feature: package: eslint-plugin-n v16.0.1 2023-07-08 13:55:56 +03:00
coderaiser
13350b5517 feature: package: eslint-plugin-putout v18.0.0 2023-07-08 13:55:33 +03:00
coderaiser
ce196abf1e feature: package: putout v30.1.1 2023-07-08 13:55:28 +03:00
coderaiser
3e18f6be28
Update CONTRIBUTING.md 2023-05-17 12:00:04 +03:00
coderaiser
deedca28a9 chore: package: v16.15.0 2023-05-17 11:52:51 +03:00
coderaiser
a1bf40bd83 feature: package: open v9.1.0 2023-05-17 11:50:19 +03:00
coderaiser
d011b13d30 chore: cloudcmd: actions: lint ☘️ 2023-05-17 11:50:19 +03:00
cintolas
ef6088531a feature: client: self signed certs on Chrome (#393) 2023-05-17 11:50:11 +03:00
coderaiser
895d19a153
Update PULL_REQUEST_TEMPLATE.md 2023-05-15 11:47:03 +03:00
coderaiser
67c0b81067
Update PULL_REQUEST_TEMPLATE.md 2023-05-15 11:46:49 +03:00
coderaiser
235dc1b8db test: server: coverage 2023-05-12 17:34:22 +03:00
coderaiser
d0e5fc0cbd chore: lint 2023-05-12 17:32:57 +03:00
coderaiser
bd7dfd0c28 chore: package: v16.14.1 2023-03-21 21:11:27 +02:00
coderaiser
a6c400ae1c chore: lint 2023-03-21 21:10:17 +02:00
coderaiser
b336a4726a feature: package: eslint-plugin-putout v17.1.0 2023-03-21 21:04:20 +02:00
coderaiser
019e15b8bd feature: package: @cloudcmd/fileop v7.0.0 2023-03-21 21:00:23 +02:00
coderaiser
643543002e feature: package: copymitter v8.0.1 2023-03-21 20:48:15 +02:00
coderaiser
2743788002 feature: package: @cloudcmd/move-files v7.0.0 2023-03-21 20:48:07 +02:00
coderaiser
49280722d1 chore: package: v16.14.0 2023-03-08 12:43:34 +02:00
coderaiser
6b22b2412b feature: package: putout v29.0.3 2023-03-08 12:39:50 +02:00
coderaiser
14b05d1b14 chore: package: v16.13.1 2023-01-30 20:34:27 +02:00
coderaiser
88da092fdb chore: lint 2023-01-30 20:33:36 +02:00
coderaiser
8e25a02568 chore: cloudcmd: lint 2023-01-30 16:06:32 +02:00
coderaiser
bdddc5752d feature: client: add DIR_DIST 2023-01-30 13:20:05 +02:00
coderaiser
d7e43d8a18 refactor: client: DIR_CLIENT_MODULES -> DIR_MODULES 2023-01-30 13:20:05 +02:00
coderaiser
656000e7e0 feature: client: DIRCLIENT -> DIR_CLIENT 2023-01-30 13:20:05 +02:00
coderaiser
ce49d9d6ad chore: cloudcmd: actions: lint ☘️ 2023-01-29 19:54:38 +00:00
coderaiser
ed9af6d7a6 chore: package: v16.13.0 2023-01-29 18:05:00 +02:00
coderaiser
fd1eb1dc27 feature: client: key: vim: open editor with 'e' 2023-01-29 18:03:58 +02:00
coderaiser
a27e4ecf61 feature: client: vim: add ability to show terminal with 'tt' 2023-01-29 17:57:15 +02:00
coderaiser
203117d2b9 chore: package: v16.12.0 2023-01-29 13:49:43 +02:00
coderaiser
4a38c64cd6 feature: client: vim: add ability to create directory with 'md', and create file with 'mf' 2023-01-29 13:48:15 +02:00
coderaiser
31e1eeea50 chore: package: v16.11.0 2023-01-22 20:29:52 +02:00
coderaiser
cf41d7d1dd feature: user-menu: add support of mov 2023-01-22 20:29:11 +02:00
coderaiser
2bfd32a1bd chore: package: v16.10.0 2023-01-19 22:50:12 +02:00
coderaiser
5b5889dcf7 feature: client: user-menu: navigate: add support of \D + [JK] to speed up vim navigation 2023-01-19 22:50:04 +02:00
coderaiser
40f17bb670 chore: madrun: envelop 2023-01-19 22:50:04 +02:00
coderaiser
871b05d4d5 fix: lint: eslint-plugin-node -> eslint-plugin-n 2023-01-19 22:50:04 +02:00
coderaiser
2f6b07c469 chore: package: v16.9.1 2023-01-18 11:11:59 +02:00
coderaiser
fecfa9fa58 fix: static: user-menu: convert flac to mp3 2023-01-18 11:11:28 +02:00
coderaiser
09de19b46e test: static: user-menu: coverage 2023-01-17 21:53:47 +02:00
coderaiser
924f8696d0 chore: css: rm quotes 2023-01-17 21:53:13 +02:00
coderaiser
3135314686 chore: package: v16.9.0 2023-01-17 18:19:52 +02:00
coderaiser
c83a5222ad chore: rm unused eslint-plugin-node 2023-01-17 18:16:20 +02:00
coderaiser
7fe5a998c4 feature: package: scroll-into-view-if-needed v3.0.4 2023-01-17 18:12:39 +02:00
coderaiser
519aec8afe feature: package: tar-stream v3.0.0 2023-01-17 18:11:26 +02:00
coderaiser
8126b51831 feature: static: user-menu: add recipes from Cookbook 2023-01-17 18:10:09 +02:00
coderaiser
1309d825e4 chore: package: v16.8.0 2023-01-16 16:55:05 +02:00
coderaiser
e28215ddf3 feature: package: @putout/plugin-cloudcmd v2.0.0: CloudCmd.loadDir() -> CloudCmd.changeDir()' 2023-01-16 16:52:37 +02:00
coderaiser
026c292bae chore: package: v16.7.0 2023-01-15 19:21:59 +02:00
coderaiser
c2c7c74ae8 chore: lint 2023-01-15 19:17:41 +02:00
coderaiser
52f47a2434 chore: madrun: test: rm --check-duplicates 2023-01-15 19:06:44 +02:00
coderaiser
f5df731491 feature: package: @cloudcmd/modal v3.0.0: add ability to not set cursor when close the modal 2023-01-15 19:06:15 +02:00
coderaiser
d7ab5b912d feature: package: auto-globals v3.0.0 2023-01-15 18:37:05 +02:00
coderaiser
6f737e83da feature: package: rimraf v4.0.5 2023-01-15 18:36:52 +02:00
coderaiser
18f0f55a64 feature: user-menu: rm border 2023-01-15 13:53:39 +02:00
coderaiser
4e52bb1371 chore: package: v16.6.1 2022-10-20 19:53:32 +03:00
coderaiser
e9ab141e30 chore: rm useless coveralls 2022-10-20 19:51:01 +03:00
coderaiser
ebadb8deeb feature: package: package-json v8.1.0 2022-10-20 19:51:01 +03:00
coderaiser
63ecdcbd86 feature: package: supertape v8.1.0 2022-10-20 19:51:01 +03:00
coderaiser
10045f6ffb feature: package: putout v28.0.0 2022-10-20 19:51:01 +03:00
coderaiser
bec0d44429
Update nodejs.yml 2022-10-10 12:45:51 +03:00
coderaiser
0a345a34a1 chore: package: v16.6.0 2022-10-09 20:31:20 +03:00
coderaiser
42ddee49a7 chore: lint 2022-10-09 20:29:11 +03:00
coderaiser
0c8bf9f3d0 feature: package: @cloudcmd/fileop v6.0.0 2022-10-09 20:26:15 +03:00
coderaiser
b70aa0cb9c feature: package: @cloudcmd/move-files v6.0.0 2022-10-09 20:24:07 +03:00
coderaiser
3aa52812ab feature: package: copymitter v7.0.0 2022-10-09 20:09:53 +03:00
coderaiser
35a46d0d07 chore: package: v16.5.0 2022-08-06 18:16:15 +03:00
coderaiser
5c84d1616c chore(cloudcmd) actions: lint ☘️ 2022-08-06 15:07:59 +00:00
coderaiser
24fbeec62d feature: client: add Command Line 2022-08-06 18:05:14 +03:00
coderaiser
a5229fae06 feature: package: add funding 2022-08-01 15:09:54 +03:00
coderaiser
1195e570e4 feature(package) gritty v7.0.0 2022-07-23 10:40:22 +03:00
coderaiser
c101b039ea chore(package) v16.4.1 2022-07-20 20:17:53 +03:00
coderaiser
444f659076 chore(cloudcmd) lint 2022-07-20 20:16:35 +03:00
coderaiser
de15ed6766 feature(package) eslint-plugin-n v15.2.4 2022-07-20 20:16:35 +03:00
coderaiser
d0a8e2daac feature(package) putout v27.0.1 2022-07-20 20:16:34 +03:00
coderaiser
f085c0eb06 feature(package) eslint-plugin-putout v16.0.0 2022-07-20 20:16:34 +03:00
coderaiser
cb86e78f8b
docs(help) Environment Variables: add " " 2022-07-12 14:07:46 +03:00
coderaiser
10bd261a3f chore(cloudcmd) actions: lint ☘️ 2022-07-11 17:48:36 +00:00
coderaiser
c337e4507d
Update HELP.md 2022-07-11 20:21:30 +03:00
coderaiser
ba2d02bd3d
Update README.md 2022-07-11 20:21:12 +03:00
coderaiser
9f644f82b1
Update README.md 2022-07-11 20:20:52 +03:00
coderaiser
b6797907a8 chore(package) v16.4.0 2022-07-11 20:17:06 +03:00
coderaiser
33827fea5e feature(cloudcmd) env: add ability to pass 0 and 1 2022-07-11 13:05:57 +03:00
coderaiser
45d44dc74d
docs(help) add demo 2022-07-10 23:16:11 +03:00
coderaiser
50c3f04dcd docs(help) add Support 2022-07-02 13:53:15 +03:00
coderaiser
404142cc40 chore(package) v16.3.1 2022-07-02 13:50:21 +03:00
coderaiser
ab6b93ddca fix(client) cloudcmd: rm window.Emitify 2022-07-02 13:50:21 +03:00
coderaiser
2c9b23db4e
Update README.md 2022-07-01 15:33:46 +03:00
coderaiser
8cc9b0ec66
docs(readme) add Support 2022-07-01 15:31:12 +03:00
coderaiser
ddee470eba chore(package) v16.3.0 2022-07-01 14:29:23 +03:00
coderaiser
bf3a9acc86 chore(cloudcmd) actions: lint ☘️ 2022-07-01 10:56:25 +00:00
coderaiser
391269b1ed feature(cloudcmd) terminal-run: return -1, when not load 2022-07-01 13:49:47 +03:00
coderaiser
e44e4fa47d chore(package) v16.2.0 2022-06-17 16:49:56 +03:00
coderaiser
7fdac390de feature(package) markdown-it v13.0.1 2022-06-17 16:45:46 +03:00
coderaiser
9f4a23e0f1 feature(cloudcmd) server: convert to ESM 2022-06-17 15:34:35 +03:00
coderaiser
42e8e255c0 chore(cloudcmd) actions: lint ☘️ 2022-06-17 15:34:35 +03:00
coderaiser
c345d8b7ef chore(actions) add ☘️ 2022-06-17 15:34:35 +03:00
coderaiser
975d4eb8a0 chore(actions) add typos 2022-06-14 14:39:06 +03:00
coderaiser
ef10ebe97c chore(cloudcmd) lint 2022-06-14 14:38:11 +03:00
coderaiser
81e76857da feature(package) thread-it v2.0.0 2022-06-12 00:02:00 +03:00
coderaiser
b12e0690cd
docs(license) 2022 2022-06-03 19:07:50 +03:00
coderaiser
3d4ba373a6 chore(cloudcmd) lint using actions 2022-06-02 09:55:39 +00:00
coderaiser
ed0c2ad45a
Update FUNDING.yml 2022-06-02 12:55:16 +03:00
coderaiser
4e406d758f
Update FUNDING.yml 2022-06-02 12:54:34 +03:00
coderaiser
18adf0852d
Create FUNDING.yml 2022-06-02 12:52:55 +03:00
coderaiser
42248bc0f4 chore(cloudcmd) lint 2022-05-12 22:29:01 +03:00
coderaiser
b3f3510b2d chore(package) v16.1.1 2022-05-12 14:45:22 +03:00
coderaiser
bbf0c04f55 feature(package) edward v14.0.0 2022-05-12 14:44:11 +03:00
coderaiser
6af8f19bb6 chore(cloudcmd) lint 2022-05-11 14:21:25 +03:00
coderaiser
95ede62e81 feature(package) putout v26.0.1 2022-05-11 11:44:58 +03:00
coderaiser
0c28633bbd chore(package) v16.1.0 2022-04-23 01:35:30 +03:00
coderaiser
42c8fd7bfe feature(cloudcmd) improve support of NBSP 2022-04-23 01:34:07 +03:00
coderaiser
e129ab6a79 chore(package) v16.0.1 2022-04-22 14:49:17 +03:00
coderaiser
6e4667aa85 chore(cloudcmd) lint 2022-04-22 14:26:04 +03:00
coderaiser
46a84c54ea feature(package) dword v14.0.0 2022-04-22 14:26:04 +03:00
coderaiser
c5e3134f37 feature(package) restafary v11.0.0 2022-04-22 14:26:04 +03:00
coderaiser
aa0c15f6b6 feature(package) @cloudcmd/stub v4.0.1 2022-04-22 14:26:04 +03:00
coderaiser
23fcc2b8f7 feature(package) win32 v7.0.0 2022-04-22 14:26:04 +03:00
coderaiser
f5f3048908 chore(cloudcmd) lint using actions 2022-03-06 17:48:21 +00:00
coderaiser
d8d9025286 chore(cloudcmd) lint 2022-03-06 19:45:19 +02:00
coderaiser
66fdb550a6 feature(package) eslint-plugin-putout v14.4.0 2022-03-06 19:45:19 +02:00
coderaiser
e59f3cfa71 chore(package) v16.0.0 2022-02-19 16:29:53 +02:00
coderaiser
44422a5206 feature(cloudcmd) drop support of node < 16 2022-02-19 15:38:47 +02:00
coderaiser
b67b7cf73d feature(package) supertape v7.1.0 2022-02-19 15:38:47 +02:00
coderaiser
3ba6d4ae53 chore(cloudcmd) lint 2022-02-19 15:38:37 +02:00
coderaiser
69c8eecaf1 feature(package) eslint-plugin-putout v13.11.0 2022-02-19 15:30:39 +02:00
coderaiser
b65b3ff940 feature(package) madrun v9.0.0 2022-02-19 15:30:00 +02:00
coderaiser
4f06e6398f feature(package) putout v25.0.1 2022-02-19 15:28:21 +02:00
coderaiser
62d39841b1 chore(package) v15.9.15 2022-01-20 20:54:29 +02:00
coderaiser
2cfc4908a2 chore(cloudcmd) lint using actions 2022-01-20 18:44:25 +00:00
coderaiser
177771df6a chore(cloudcmd) lint 2022-01-20 19:50:10 +02:00
coderaiser
23171f967e fix(css) icons (#368) 2022-01-20 19:49:20 +02:00
coderaiser
09f4090a4b chore(package) v15.9.14 2022-01-13 15:51:15 +02:00
coderaiser
f2db9bf2d5 feature(package) eslint-plugin-putout v13.0.1 2022-01-13 15:50:04 +02:00
coderaiser
0ff8470278 feature(package) putout v24.0.2 2022-01-13 15:49:57 +02:00
coderaiser
9b0ce7c7b7 fix(cloudcmd) client: edit-names in vim mode 2022-01-13 12:45:10 +02:00
coderaiser
e68b3232d9 chore(cloudcmd) lint using actions 2022-01-08 18:47:37 +00:00
Timo Knapp
c32ba39f43
chore(docker) ci: update GitHub action to use redrun (#366) 2022-01-08 20:44:51 +02:00
Timo Knapp
c7371d9c3a
fix(docker) images: make dockerfiles use node:lts-buster and node:lts-buster-slim for alpine (#363) 2022-01-06 15:23:34 +02:00
coderaiser
3269cff066 chore(cloudcmd) lint using actions 2022-01-05 14:08:35 +00:00
Timo Knapp
75b35139e4
fix(docker) images: make dockerfiles use node:lts-buster-slim as base image (#357) 2022-01-05 16:06:00 +02:00
coderaiser
838b2e29cf chore(package) v15.9.13 2021-12-23 12:11:01 +02:00
coderaiser
9adc0778a9 chore(cloudcmd) lint 2021-12-23 11:57:08 +02:00
coderaiser
130ce433f4 feature(package) putout v23.0.0 2021-12-23 11:53:54 +02:00
coderaiser
cac774d7ce chore(package) v15.9.12 2021-12-16 20:07:56 +02:00
coderaiser
7053e6be0b fix(client) loadDir: history enabled by default 2021-12-16 20:06:44 +02:00
coderaiser
2743f78cd3 chore(css) lint 2021-12-15 18:05:19 +02:00
coderaiser
49f4e5bec7 chore(docker) alpine: python -> python3 2021-12-15 17:54:49 +02:00
coderaiser
228744bec8 chore(common) lint 2021-12-15 17:18:23 +02:00
coderaiser
2654197681 chore(cloudcmd) base64: lint 2021-12-15 12:21:28 +02:00
coderaiser
205d641e75 chore(common) base64: is not defined 2021-12-14 16:05:40 +02:00
coderaiser
5accfeeaa7 chore(cloudcmd) lint 2021-12-14 14:57:40 +02:00
coderaiser
a024dcdb61 chore(cloudcmd) lint using actions 2021-12-09 12:21:33 +00:00
coderaiser
5b661140fc chore(package) v15.9.11 2021-12-09 14:19:04 +02:00
coderaiser
ed14250fe2 fix(client) load: Upload stuck for zero byte files (#359) 2021-12-09 14:10:24 +02:00
coderaiser
21e9736c81 chore(putout) declare-undefined-variables: add custom declaration of stopAll 2021-12-04 21:11:52 +02:00
coderaiser
8097d96c72 chore(package) v15.9.10 2021-12-04 01:35:55 +02:00
coderaiser
efb686c332 chore(cloudcmd) lint 2021-12-04 01:35:55 +02:00
coderaiser
bd5a8afdd5 fix(client) operation: move and copy not working (#358) 2021-12-04 01:03:46 +02:00
coderaiser
d15134b272 feature(package) eslint-plugin-putout v12.2.0 2021-12-04 00:38:50 +02:00
coderaiser
b9b4af0454 refactor(client) listeners: rm initF2 2021-11-22 20:16:03 +02:00
coderaiser
18eeec0165 chore(cloudcmd) lint using actions 2021-11-22 12:24:07 +00:00
coderaiser
b2a7a6770c
docs(help) rm heroku 2021-11-22 14:21:40 +02:00
coderaiser
c40d2bb096 chore(package) v15.9.9 2021-11-22 00:53:20 +02:00
coderaiser
c7242199e7 chore(cloudcmd) lint using actions 2021-11-21 22:49:42 +00:00
coderaiser
f1fcde75c3 chore(madrun) ERR_OSSL_EVP_UNSUPPORTED error on node v17 (https://stackoverflow.com/a/69394785) 2021-11-22 00:47:31 +02:00
coderaiser
0f17c11c04 chore(cloudcmd) lint 2021-11-20 22:20:10 +02:00
coderaiser
57390d541f feature(package) putout v22.0.2 2021-11-20 21:54:16 +02:00
coderaiser
e4cf91ac1d feature(package) yargs-parser v21.0.0 2021-11-20 21:54:06 +02:00
coderaiser
8fc0731900 chore(cloudcmd) lint 2021-11-04 14:45:15 +02:00
coderaiser
ae552ede60 feature(package) yaspeller v8.0.0 2021-11-04 14:41:43 +02:00
coderaiser
3dd9d6e454 feature(package) eslint-plugin-putout v11.1.0 2021-11-04 14:41:13 +02:00
coderaiser
7258013b88 feature(package) putout v21.1.2 2021-11-04 14:41:05 +02:00
coderaiser
3172759ca0 chore(cloudcmd) lint 2021-10-19 15:59:57 +03:00
coderaiser
85015881d0 feature(package) eslint v8.0.1 2021-10-19 15:56:50 +03:00
coderaiser
977d9d057f docs(readme) rm heroku 2021-10-06 15:20:39 +03:00
coderaiser
111eba8c31 chore(cloudcmd) lint 2021-09-30 17:22:59 +03:00
coderaiser
8f466b4c9a feature(package) eslint-plugin-putout v10.3.0 2021-09-30 17:07:20 +03:00
coderaiser
057ec42b25 feature(package) find-up v6.1.0 2021-09-30 17:07:10 +03:00
coderaiser
eab9df4490 feature(package) putout v20.5.1 2021-09-30 17:06:59 +03:00
coderaiser
b6549a6484 feature(package) supertape v6.9.1 2021-09-30 16:59:53 +03:00
coderaiser
883b4487e0 chore(cloudcmd) lint 2021-08-15 14:57:22 +03:00
coderaiser
699deb86c6 feature(package) eslint-plugin-putout v9.0.1 2021-08-15 14:57:04 +03:00
coderaiser
8fcfaec8a0 chore(package) v15.9.8 2021-08-09 17:36:16 +03:00
coderaiser
a5ea620ca8 chore(user-menu) lint 2021-08-09 17:35:27 +03:00
coderaiser
c798b42a64 fix(cloudcmd) args: snake case -> camelCase: yargs strip dashed 2021-08-09 17:31:44 +03:00
coderaiser
13f7fb2200 chore(package) v15.9.7 2021-06-27 16:38:03 +03:00
coderaiser
7ca9b8cece feature(package) package-json v7.0.0 2021-06-27 16:36:53 +03:00
coderaiser
c2e51f75a1 fix(config) rm broadcast: cannot change config 2021-06-27 16:36:37 +03:00
coderaiser
4d9878b574 fix(view) close modals using ESC
show: bindKeys: truthy-> not equal false (abc727b846)
2021-06-27 15:58:38 +03:00
coderaiser
abe512c655 feature(config) add more descriptive titles 2021-06-27 15:38:35 +03:00
coderaiser
b67526f09b
chore(actions) node: add versions matrix 2021-06-13 22:57:19 +03:00
coderaiser
e236e87171 chore(package) v15.9.6 2021-06-13 15:45:24 +03:00
coderaiser
26fad02507 feature(package) @cloudcmd/move-files v5.0.0 2021-06-13 15:27:00 +03:00
coderaiser
e73c327687
docs(help) add missing "boot" 2021-06-10 22:41:01 +03:00
coderaiser
f3e0337584 chore(package) v15.9.5 2021-06-08 14:15:52 +03:00
coderaiser
1736ec7be2 chore(cloudcmd) spell 2021-06-08 14:14:55 +03:00
coderaiser
fbc8ae25ad chore(cloudcmd) lint 2021-06-08 14:13:46 +03:00
coderaiser
f92152195c feature(package) eslint-plugin-putout v8.0.1 2021-06-08 12:08:09 +03:00
coderaiser
bbe790e551 feature(package) es6-promisify v7.0.0 2021-06-08 12:08:04 +03:00
coderaiser
954f2c047c feature(package) putout v18.0.1 2021-06-08 12:07:02 +03:00
IhatemyISP
baac531655
docs(help) added instructions to autostart cloudcmd on boot for FreeBSD systems (#348) 2021-06-04 11:45:08 +03:00
khevin014
262c72d44a docs(help) added instructions to autostart cloudcmd on boot for systems using systemd (#347) 2021-05-28 16:26:00 +03:00
coderaiser
5e63a524c1 docs(readme) example: io.listen -> new Server (#341) 2021-05-04 22:23:46 +03:00
coderaiser
5d93d5752c chore(cloudcmd) lint 2021-05-04 21:02:06 +03:00
coderaiser
241efe971b feature(package) putout v17.0.0 2021-05-04 20:50:48 +03:00
coderaiser
8c59333a02 fix(load) put: replace #: single -> multiple 2021-04-12 19:17:20 +03:00
coderaiser
9a724a4bba fix(server) user-menu: e.message -> errorFind.message 2021-04-12 18:46:58 +03:00
coderaiser
8c8ac3bab4 chore(package) v15.9.4 2021-04-05 19:12:18 +03:00
coderaiser
843c319b1e feature(package) socket.io-client v4.0.1 2021-04-05 19:07:47 +03:00
coderaiser
879bc2ff8c feature(package) open v8.0.5 2021-04-05 19:07:17 +03:00
coderaiser
3e303253d2 feature(package) putout v16.4.0 2021-04-05 19:07:07 +03:00
coderaiser
ad689ece31 chore(package) v15.9.3 2021-03-17 16:08:43 +02:00
coderaiser
1801689ef7 fix(cloudcmd) Docker latest-alpine (15.9.2) stopped with errors (#337) 2021-03-17 16:01:02 +02:00
coderaiser
e77d8a709a chore(package) v15.9.2 2021-03-16 18:02:52 +02:00
coderaiser
b090b498a8 test(route) coverage 2021-03-16 17:54:44 +02:00
coderaiser
b5618412c3 feature(package) open v8.0.2 2021-03-16 17:48:27 +02:00
coderaiser
bb3e07def3 feature(package) socket.io-client v4.0.0 2021-03-16 17:48:27 +02:00
coderaiser
a3f0f4ecae feature(package) socket.io v4.0.0 2021-03-16 17:45:59 +02:00
coderaiser
df60dd7ba0 fix(route) unable to navigate between folders (#333) 2021-03-16 17:44:54 +02:00
coderaiser
21e7ea7d4c test(cloudcmd) ok -> match 2021-03-09 18:41:52 +02:00
coderaiser
a091a382ca chore(cloudcmd) lint using actions 2021-03-09 15:52:07 +00:00
coderaiser
0edbffa093 chore(user-menu) lint 2021-03-09 17:42:01 +02:00
coderaiser
08cc5dbba4 chore(archive-link) update 2021-03-05 21:01:10 +02:00
coderaiser
edbebd983e chore(cloudcmd) lint using actions 2021-03-02 12:42:54 +00:00
coderaiser
90eae0e944 test(route) flop -> win32 2021-03-02 14:40:56 +02:00
coderaiser
3976056ee8 chore(package) v15.9.1 2021-03-01 23:17:42 +02:00
coderaiser
8f12c6c25f feature(cloudcmd) icons: add archive icon for small screens 2021-03-01 22:58:33 +02:00
coderaiser
c92815d78d feature(cloudcmd) add archive-link image 2021-03-01 22:44:37 +02:00
coderaiser
2fe6dcf166 chore(package) v15.9.0 2021-03-01 18:13:17 +02:00
coderaiser
33f2572979 test(route) ci 2021-03-01 18:13:17 +02:00
coderaiser
a71dca0e70 chore(route) set content length 2021-03-01 18:13:17 +02:00
coderaiser
cb37ab871b chore(madrun) spell 2021-03-01 17:42:21 +02:00
coderaiser
f391a3391f feature(cloudcmd) add archive icon 2021-03-01 17:38:37 +02:00
coderaiser
ce511812d5 feature(client) rm unused loadCurrentTime 2021-02-28 11:12:18 +02:00
coderaiser
89af33fb9d feature(package) win32 v6.0.0 2021-02-27 20:58:06 +02:00
coderaiser
fec91e7093 feature(package) redzip v2.0.0 2021-02-27 20:52:22 +02:00
coderaiser
a092a2fc9d chore(travis) rm 2021-02-27 16:11:58 +02:00
coderaiser
775850c004 chore(package) v15.8.1 2021-02-27 16:10:47 +02:00
coderaiser
1a5dc6228c chore(cloudcmd) lint using actions 2021-02-27 14:10:23 +00:00
coderaiser
6622d508af feature(package) restafary v9.7.0 (#330) 2021-02-27 16:06:56 +02:00
coderaiser
a6a1e80afb chore(package) v15.8.0 2021-02-23 14:31:19 +02:00
coderaiser
40f885e7c4 feature(cloudcmd) add ability to suggest option, when wrong provided 2021-02-23 14:29:42 +02:00
coderaiser
f0fd4031bb feature(package) supertape v5.0.0 2021-02-23 12:45:30 +02:00
coderaiser
0831723565 chore(cloudcmd) rm dead code 2021-02-22 00:18:07 +02:00
coderaiser
71a7e9dd93 chore(package) v15.7.1 2021-02-21 11:35:51 +02:00
coderaiser
07fe299ad6 fix(cloudcmd) prefix env has no effect (#328) 2021-02-21 11:25:42 +02:00
coderaiser
b18c738f5b chore(package) v15.7.0 2021-02-19 22:27:41 +02:00
coderaiser
bcc11bda74 chore(lint) add progress 2021-02-19 22:26:13 +02:00
coderaiser
a108bd82b5 feature(package) @cloudcmd/move-files v4.0.0 2021-02-19 22:12:30 +02:00
coderaiser
e3d373acf9 chore(madrun) nyc -> c8 2021-02-17 14:09:08 +02:00
coderaiser
2a5ebe300d chore(putout) ignore: html 2021-02-13 15:04:09 +02:00
coderaiser
04e54f2794 chore(cloudcmd) lint 2021-02-13 12:33:00 +02:00
coderaiser
2e75ca18f4 feature(package) putout v15.0.0 2021-02-11 14:00:08 +02:00
coderaiser
d8f0e92727 feature(package) copymitter v6.0.0 2021-02-10 12:22:35 +02:00
coderaiser
70c8ab537c chore(actions) nodejs: putout -> cloudcmd 2021-02-09 14:46:53 +02:00
coderaiser
f97677f384 chore(putout) lint using actions 2021-02-09 11:54:09 +00:00
coderaiser
bbb6d46c09 chore(package) coverage:report 2021-02-09 13:53:09 +02:00
coderaiser
0c7cc3c0a2 docs(help) add versions history 2021-02-09 13:50:20 +02:00
coderaiser
0128014f51 chore(gitignore) add .DS_Store 2021-02-09 13:39:54 +02:00
coderaiser
75361de125 refactor(release) promisify 2021-02-09 13:39:54 +02:00
coderaiser
98be1b01f1 docs(readme) add link to patreon 2021-02-09 13:32:42 +02:00
coderaiser
3ac0bf23e4 chore(cloudcmd-hq) add 2021-02-07 15:12:23 +02:00
coderaiser
983ccac4d1
docs(readme) Docker: add "\n" 2021-02-05 11:11:38 +02:00
coderaiser
47883b8751
docs(readme) Documentation 2021-02-04 21:55:46 +02:00
Frak
955b7f0c4c
docs(README) add documentation link 2021-02-04 21:55:01 +02:00
coderaiser
77bd89f8f7 chore(putout) lint using actions 2021-02-03 19:07:12 +00:00
coderaiser
135edafaee feature(package) @cloudcmd/olark v3.0.2 2021-02-03 21:04:30 +02:00
coderaiser
fce254f724 chore(github-actions) add ability to autofix lint 2021-02-03 14:07:32 +02:00
coderaiser
60607184d4 feature(client) view: unknown file type: method: GET -> HEAD: speed up 2021-02-03 13:53:41 +02:00
coderaiser
5e545c87b3 chore(package) v15.6.0 2021-02-03 13:22:38 +02:00
coderaiser
2b9705d9fc feature(client) view: add ability to detect file type when extension is missing (coderaiser/cloudcmd#287) 2021-02-03 13:20:33 +02:00
coderaiser
0d79531b69 chore(package) v15.5.2 2021-02-02 14:03:24 +02:00
coderaiser
b4f279d07c chore(cloudcmd) lint 2021-02-02 14:03:24 +02:00
coderaiser
3cd1d67e58 fix(client) view: isAudio (#322) 2021-02-02 13:43:12 +02:00
coderaiser
2fc6c6e1a1 docs(changelog) 314 -> 319 2021-01-31 12:48:35 +02:00
coderaiser
a63ce70d49 chore(package) v15.5.1 2021-01-31 12:46:47 +02:00
coderaiser
bc80069f18 fix(cloudcmd) cannot create a directory (#314) 2021-01-31 12:45:06 +02:00
coderaiser
996d99cbac docs(readme) require -> import 2021-01-30 11:41:50 +02:00
coderaiser
a39ea0d61c chore(package) v15.5.0 2021-01-30 11:26:12 +02:00
coderaiser
3b81abed36 feature(package) style-loader v2.0.0 2021-01-30 11:20:11 +02:00
coderaiser
1b5a6a3721 feature(cloudcmd) improve error handling when viewing or editing a file 2021-01-30 11:19:10 +02:00
coderaiser
b3b618b2ca feature(package) putout v14.0.0 2021-01-26 19:28:03 +02:00
coderaiser
7d1a35d8b2 feature(package) eslint-plugin-putout v7.0.0 2021-01-26 19:27:56 +02:00
coderaiser
dae05277d6 chore(package) v15.4.4 2021-01-26 17:36:56 +02:00
coderaiser
ac85786b62 feature(package) win32 v5.1.11 2021-01-26 17:34:37 +02:00
coderaiser
325706756c chore(putout) rm apply-optional-chaining: enabled by default 2021-01-26 17:34:37 +02:00
coderaiser
ee5cbb13b0 chore(package) v15.4.3 2021-01-25 20:56:57 +02:00
coderaiser
b0e63fd3fd feature(package) restbox v3.0.0 2021-01-25 20:45:48 +02:00
coderaiser
fd32f76bf0 feature(package) ponse v6.0.0 2021-01-25 19:55:29 +02:00
coderaiser
49f298bc46 feature(package) files-io v4.0.0 2021-01-25 19:47:53 +02:00
coderaiser
a3c18dcdb2 chore(package) v15.4.2 2021-01-21 20:22:10 +02:00
coderaiser
38d29a6b27 chore(cssnano) lint 2021-01-21 20:17:31 +02:00
coderaiser
e3cac1a892 feature(package) mellow v3.0.0 2021-01-21 16:48:08 +02:00
coderaiser
9b9070b69b feature(route) tokenize -> wraptile 2021-01-21 16:30:21 +02:00
coderaiser
84b5019dd0 chore(package) v15.4.1 2021-01-20 20:29:16 +02:00
coderaiser
ee81cd1533 feature(route) redzip -> win32 (#317) 2021-01-20 20:22:21 +02:00
coderaiser
5edd57a390 chore(package) v15.4.0 2021-01-19 21:09:58 +02:00
coderaiser
f261a0ea08 feature(cloudcmd) add abilit to parse markdown inside zip archives 2021-01-19 21:08:17 +02:00
coderaiser
6182f621d6 chore(package) v15.3.4 2021-01-19 18:10:09 +02:00
coderaiser
72ed5bbe4e docs(readme) spell 2021-01-19 18:08:38 +02:00
coderaiser
fac9b347c2 feature(package) deepword v8.0.0 2021-01-19 18:06:25 +02:00
Timo Knapp
48ae1c2e63
fix(docker) images: change alpine images to be part of master image (#316) 2021-01-19 17:36:27 +02:00
coderaiser
d785952b7e feature(package) console-io v13.0.0 2021-01-19 14:36:40 +02:00
coderaiser
5f13f380e9 feature(package) edward v13.0.0 2021-01-19 14:26:04 +02:00
Timo Knapp
99b93e760a feature(docker) add support of multi-arch builds (#291) 2021-01-19 13:56:00 +02:00
coderaiser
11cc63adcd chore(package) v15.3.3 2021-01-18 21:59:37 +02:00
Jacob Henry
c057b950c8 fix(dom) bug in Firefox with Imagus extension enabled: change getCurrentName to read from data-name instead of title (#313)
Separated out name generation/parsing logic.
Added test case.
2021-01-18 21:59:37 +02:00
coderaiser
b6f30d1ccb chore(package) v15.3.2 2021-01-18 14:43:15 +02:00
coderaiser
546b511a9a fix(client) dom: goToDirectory 2021-01-18 14:43:15 +02:00
coderaiser
ddef087328 chore(package) v15.3.1 2021-01-17 17:19:27 +02:00
coderaiser
2355618409 feature(package) dword v13.0.0 2021-01-17 17:18:18 +02:00
coderaiser
28461fbe19 feature(modules) socket.io v3.1.0 2021-01-17 17:10:21 +02:00
coderaiser
cdb719eb2a fix(view) view html, pdf 2021-01-17 17:10:12 +02:00
coderaiser
da692a4798 chore(package) v15.3.0 2021-01-17 16:43:18 +02:00
coderaiser
c002fc37c5 feature(client) improve vim support: Esc - toggle vim support in editors 2021-01-17 16:39:00 +02:00
coderaiser
4e86f7f308 refactor(dom) loadCurrentSize: callback -> promise 2021-01-17 16:02:19 +02:00
coderaiser
462d7bf3b5 feature(client) view: add ability to view raw files using Shift + F3 2021-01-17 15:55:24 +02:00
coderaiser
eb2c15ba17 chore(madrun) watch:lint: staged files 2021-01-17 15:49:00 +02:00
coderaiser
635b195d48 feature(client) view: show markdown without shift 2021-01-17 15:48:34 +02:00
coderaiser
301bfa3234 feature(key) add ability to toggle global vim config on the time of session 2021-01-17 15:07:09 +02:00
coderaiser
4b51f363ae chore(package) v15.2.0 2021-01-16 00:57:51 +02:00
coderaiser
57485b5b4b feature(cloudcmd) add ability to open html files using F3 2021-01-16 00:53:37 +02:00
coderaiser
cd7bf0fe01 feature(cloudcmd) add ability to toggle vim hotkes using Esc 2021-01-16 00:53:28 +02:00
coderaiser
595805eeaf feature(package) @cloudcmd/fileop v5.0.0 2021-01-15 21:00:50 +02:00
coderaiser
a2c17e5e0e chore(client) rm console.log 2021-01-14 13:00:37 +02:00
coderaiser
af2548acd1 chore(madrun) simplify with cutEnv 2021-01-12 00:59:29 +02:00
coderaiser
82c576c850 fix(server) distribute: simplify colors 2021-01-11 13:44:31 +02:00
coderaiser
0ec17645b6 chore(package) v15.1.0 2021-01-07 00:35:33 +02:00
coderaiser
b35a3e029f feature(cloudcmd) add ability to read zip files like directories (#309) 2021-01-07 00:08:58 +02:00
coderaiser
0037ec9606 chore(package) v15.0.4 2021-01-05 19:07:42 +02:00
coderaiser
cbd5a2786c feature(package) flop v9.0.0 2021-01-05 19:02:57 +02:00
coderaiser
226d7c93bd feature(package) restafary v9.0.1 2021-01-05 19:02:53 +02:00
coderaiser
a2c82c56fb chore(package) webpack: add progress bar 2021-01-05 18:14:11 +02:00
coderaiser
dd91c810ad chore(package) v15.0.3 2021-01-05 18:05:35 +02:00
coderaiser
fcdb2e3a28 chore(cloudcmd) simportConfig -> importConfig 2021-01-05 18:04:42 +02:00
coderaiser
b06c9499a3 docs(readme) rm fossa badge 2021-01-05 17:53:37 +02:00
coderaiser
394bf46eca fix(cloudcmd) validateRoot: import -> simport: forEachKey is not a function (#311) 2021-01-05 17:51:26 +02:00
coderaiser
0967ad12e8 feature(package) onezip v5.0.0 2021-01-05 14:23:18 +02:00
coderaiser
fdcc060861 feature(package) socket.io v3.0.5 (socketio/socket.io#3720) 2021-01-05 13:41:01 +02:00
coderaiser
77384f35c4 chore(madrun) lint 2021-01-05 13:41:01 +02:00
coderaiser
59338a16ac chore(cloudcmd) lint: key-spacing 2021-01-05 13:41:01 +02:00
coderaiser
a91344595c
chore(madrun) start: js -> mjs 2021-01-04 20:45:49 +02:00
coderaiser
a2586424f9 refactor(cloudfunc) getPathLink: map -> for 2021-01-03 14:51:19 +02:00
coderaiser
d08921bde3 test(cloudfunc) lint 2021-01-03 14:51:03 +02:00
coderaiser
9214bb4f31 test(cloudfunc) getPathLink 2021-01-03 14:43:20 +02:00
coderaiser
77aff31bcc chore(package) v15.0.2 2020-12-31 18:52:13 +02:00
coderaiser
89570857bb fix(cloudcmd) criton: crash when password set (#310) 2020-12-31 18:44:14 +02:00
coderaiser
84d1db5f1e docs(readme) docker: -t -> -it 2020-12-30 16:15:38 +02:00
coderaiser
a87fb57188 chore(package) v15.0.1 2020-12-30 15:41:50 +02:00
coderaiser
95db6de63c fix(docker) cloudcmd.js -> cloudcmd.mjs 2020-12-30 15:41:50 +02:00
coderaiser
bbffe1a9bd chore(travis) node v14 2020-12-30 15:09:55 +02:00
coderaiser
9d6b6b7c93 chore(cloudcmd) lint 2020-12-30 14:41:27 +02:00
coderaiser
76e0eab94c fix(cloudcmd) css: media query for screen size with width more then 1600 (cloudcmd/console-io#6) 2020-12-30 14:38:33 +02:00
coderaiser
9a13502597 fix(cloudcmd) client: build: optional chaining 2020-12-30 14:02:36 +02:00
coderaiser
77d02c7844 feature(package) putout v13.0.0 2020-12-28 23:25:37 +02:00
coderaiser
c3339d8ea2 fix(cloudcmd) drop support of node < 14 2020-12-28 23:00:04 +02:00
coderaiser
7371871f15 chore(package) v15.0.0 2020-12-28 20:18:38 +02:00
coderaiser
8f0f6db9d6 chore(madrun) wisdom:type 2020-12-28 20:15:40 +02:00
coderaiser
27ddaf726d chore(cloudcmd) lint 2020-12-28 20:14:10 +02:00
coderaiser
e6c1d928ec feature(package) auto-globals v2.0.0 2020-12-28 19:47:46 +02:00
coderaiser
ae360b1db3 docs(readme) convert commonjs to esm 2020-12-28 17:39:08 +02:00
coderaiser
b5be1f3933 feature(cloudcmd) convert to EcmaScriptModules 2020-12-28 17:37:29 +02:00
coderaiser
006344b58a feature(package) supertape v4.1.0 2020-12-25 18:16:53 +02:00
coderaiser
b18b6af4dc feature(package) supertape v3.10.0 2020-12-21 15:19:18 +02:00
coderaiser
4d8f489b18 chore(madrun) lint: stylelint now bundled with putout 2020-12-15 16:25:06 +02:00
coderaiser
76380a1f04 chore(cloudcmd) lint 2020-12-15 15:30:32 +02:00
coderaiser
332593c23e feature(package) babel-plugin-macros v3.0.0 2020-12-15 15:26:50 +02:00
coderaiser
fd818c5f31 chore(madrun) commonjs -> esm 2020-12-14 15:19:23 +02:00
coderaiser
1b7b163a66 feature(package) putout v12.0.0 2020-12-14 15:19:23 +02:00
coderaiser
1c9ca22b93
chore(travis) rm windows 2020-12-14 00:06:20 +02:00
coderaiser
5a1a39478f test(console) hang 2020-12-04 22:54:28 +02:00
coderaiser
983609f19a chore(datetime) rm unused 2020-12-04 18:49:37 +02:00
coderaiser
c719e37cc1 chore(cloudcmd) update dependencies 2020-12-04 18:47:24 +02:00
coderaiser
4c7f8cc6b6 chore(cloudcmd) lint 2020-12-03 18:27:59 +02:00
coderaiser
1e853b040d feature(package) supertape v3.1.3 2020-12-03 18:21:01 +02:00
coderaiser
fcc59c0674 feature(package) madrun v8.0.0 2020-12-03 18:20:56 +02:00
coderaiser
ee091a33c9 chore(putout) ignore: add dist 2020-12-03 18:20:21 +02:00
coderaiser
13e7af779b docs(help) change link 2020-12-03 18:20:11 +02:00
coderaiser
a9e9dd7270 fix(cloudcmd) app, help: remove duplicate keys 2020-11-25 20:54:47 +02:00
coderaiser
75c6abb2b1 test(cloudcmd) skip: connect_error tests 2020-11-16 17:40:32 +02:00
coderaiser
ca7acdd812 feature(package) gritty v6.0.0 2020-11-16 16:43:28 +02:00
coderaiser
57750689ee feature(package) console-io v12.0.0 2020-11-16 16:17:54 +02:00
coderaiser
ecd7423ac0 docs(help) lint 2020-11-16 16:10:04 +02:00
coderaiser
f74d3e71a2 feature(package) socket.io-client v3.0.1 2020-11-16 15:44:18 +02:00
coderaiser
eba20025fe feature(package) socket.io v3.0.1 2020-11-16 15:44:09 +02:00
coderaiser
30da4bcd85 docs(readme) add to lint 2020-11-03 10:27:36 +02:00
coderaiser
ab7f266e2b feature(package) putout v11.0.2 2020-11-03 10:23:22 +02:00
coderaiser
32f97392bb feature(package) eslint-plugin-putout v6.0.0 2020-11-02 14:57:39 +02:00
coderaiser
382ac94a1f chore(travis) node v15 2020-10-25 10:12:47 +02:00
coderaiser
42046eff3a chore(putout) true -> on, false -> off 2020-10-17 18:05:31 +03:00
coderaiser
154030c5fa chore(putout) prepare for webpack v5 2020-10-17 18:04:35 +03:00
coderaiser
38fa908872 feature(package) markdown-it v12.0.0 2020-10-17 18:04:35 +03:00
j35tor
fd5b2cc6c6
docs(readme) typos in examples (#300)
Co-authored-by: j35tor <j35tor@disroot.org>
2020-10-07 12:59:32 +03:00
coderaiser
514644269c chore(cloudcmd) menu: add lint, fix:lint, test, coverage 2020-09-21 16:10:35 +03:00
coderaiser
6d1b18da07 chore(menu) button -> key 2020-09-21 15:46:35 +03:00
coderaiser
d918ed1f52 chore(github) workflows: add coverage 2020-09-17 16:59:57 +03:00
coderaiser
175d01f3d1 chore(github) workflows: split into 4 steps 2020-09-17 16:58:14 +03:00
coderaiser
1dbc978916 chore(github) workflows: node: v12 -> v14 2020-09-17 16:56:36 +03:00
coderaiser
14dc7ac3a3 feature(package) putout v10.0.0 2020-09-16 19:18:31 +03:00
coderaiser
f434bd1133 test(distribute) import: env: reassign -> delete 2020-09-11 22:06:55 +03:00
coderaiser
d8c2ac4708 feature(package) gritty v5.0.0 2020-09-11 21:52:09 +03:00
coderaiser
79f68d01c8 feature(distribute) import: do not import if env variable set 2020-09-11 21:41:16 +03:00
coderaiser
b8a83868da chore(cloudcmd) save, then import 2020-09-11 19:12:43 +03:00
coderaiser
0b74250248 fix(cloudcmd) importListen prevent server from start (#295) 2020-09-11 18:42:04 +03:00
coderaiser
8932378e07 chore(app) add stack (https://devcenter.heroku.com/articles/upgrading-to-the-latest-stack) 2020-09-11 18:16:08 +03:00
coderaiser
1e4761a10a feature(package) drop support of node < 12 2020-09-06 21:26:51 +03:00
coderaiser
0a7c52c75d chore(cloudcmd) lint: numeric separators 2020-09-06 21:25:40 +03:00
coderaiser
c61681c331 chore(madrun) rm lint:progress, -f progress enabled by default 2020-09-02 16:02:47 +03:00
coderaiser
19888b3ee5 feature(package) table v6.0.1 2020-09-02 15:53:24 +03:00
coderaiser
6d7f274bde chore(package) v14.9.3 2020-08-21 15:51:28 +03:00
coderaiser
706b823c4a fix(client) dom: buffer: get, set -> getJson, setJson (#295) 2020-08-21 15:50:17 +03:00
coderaiser
aeb5906de3 feature(storage) rm unused removeMatch 2020-08-19 18:14:30 +03:00
coderaiser
c8d2098e5b test(storage) coverage 2020-08-19 18:12:30 +03:00
coderaiser
6cb0da0ce8 chore(package) v14.9.2 2020-08-19 17:45:59 +03:00
coderaiser
d181b84c3b fix(cloudcmd) client: edit: json files (#294) 2020-08-19 17:44:26 +03:00
coderaiser
5732752350 chore(package) v14.9.1 2020-08-16 16:33:24 +03:00
coderaiser
0f93c4fa1b feature(cloudcmd) add IO.createDirectory (b54b5486f4) 2020-08-16 16:32:22 +03:00
coderaiser
92e0e4bb91 chore(package) v14.9.0 2020-08-14 19:08:45 +03:00
coderaiser
291dc39c25 feature(key) vim: add ability to navigate to next and previous using w and b 2020-08-14 19:07:28 +03:00
coderaiser
750b7571f5 feature(key) vim: add ability to navigate using to first and last file using ^ and $ 2020-08-14 19:07:28 +03:00
coderaiser
87f4022759 docs(help) UserMenu: add move, copy 2020-08-14 19:07:28 +03:00
coderaiser
d053e60ed2 chore(package) v14.8.0 2020-08-14 17:16:35 +03:00
coderaiser
5041930685 feature(cloudcmd) IO.cp -> IO.copy 2020-08-14 17:14:45 +03:00
coderaiser
13307f3861 feature(cloudcmd) IO.mv -> IO.move 2020-08-14 17:14:45 +03:00
coderaiser
b081dc8b18 feature(package) find-up v5.0.0 2020-08-13 15:52:44 +03:00
coderaiser
7fd5e2bc90 chore(package) v14.7.2 2020-08-11 13:34:49 +03:00
coderaiser
e973f5fd4e fix(client) key: F3: search appears 2020-08-11 13:31:50 +03:00
coderaiser
b2fa10f2de test(view) initConfig: add 2020-08-11 13:31:50 +03:00
coderaiser
222ce237c5 chore(package) v14.7.1 2020-08-11 01:13:50 +03:00
coderaiser
27df34f000 fix(view) init config: copy 2020-08-11 01:11:08 +03:00
coderaiser
50e0152ced chore(package) v14.7.0 2020-08-10 14:43:05 +03:00
coderaiser
c49d25229c fix(client) user menu: click on user menu title 2020-08-10 14:42:11 +03:00
coderaiser
28ceb7f7ff feature(cloudcmd) rest: add rename 2020-08-10 14:42:11 +03:00
coderaiser
d8dd9f5738 feature(rest) mv: improved user errors 2020-08-09 16:18:22 +03:00
coderaiser
16a1eade2a feature(client) io: promisify -> async 2020-08-06 11:21:57 +03:00
coderaiser
807a1bc26d chore(export) lint 2020-07-27 12:29:05 +03:00
coderaiser
e7feb83f76 chore(edit-names) rm unused arguments 2020-07-08 20:04:13 +03:00
coderaiser
a117867307 feature(package) webpack-merge v5.0.8 2020-07-08 20:04:13 +03:00
coderaiser
e08a6bead8 feature(package) eslint-plugin-putout v5.0.0 2020-06-24 16:13:38 +03:00
coderaiser
2ed1c3a9dc feature(package) putout v9.0.0 2020-06-24 16:13:32 +03:00
coderaiser
378d694871 feature(package) madrun v7.0.0 2020-06-24 16:13:30 +03:00
coderaiser
8bb746aa0e chore(cloudcmd) lint: indexOf -> includes 2020-06-07 11:29:06 +03:00
coderaiser
c30bc69f5d chore(cloudcmd) lint: convert indexOf to includes 2020-06-01 19:44:41 +03:00
coderaiser
73dc17318e test(cloudcmd) test/server/prefixer -> server/prefixer 2020-06-01 19:42:19 +03:00
coderaiser
d23118f692 chore(cloudcmd) lint 2020-05-31 03:12:07 +03:00
coderaiser
b48507d92a chore(cloudcmd) lint 2020-05-28 23:52:46 +03:00
coderaiser
7d82ef92e9 chore(package) v14.6.0 2020-05-20 18:37:22 +03:00
coderaiser
8f9c6906a1 feature(package) markdown-it v11.0.0 2020-05-20 18:33:38 +03:00
coderaiser
f506801337 feature(cloudcmd) client: add ability to handle existing file while rename (#289) 2020-05-20 18:32:28 +03:00
coderaiser
e6c51f61ca feature(package) supertape v2.0.0 2020-05-09 22:29:53 +03:00
coderaiser
75a1f9db17 feature(package) @cloudcmd/stub v3.0.0 2020-05-09 22:29:51 +03:00
coderaiser
e13ec9aaf7 chore(package) v14.5.1 2020-05-06 19:13:57 +03:00
coderaiser
5db9bc1606 fix(docker) alpine 2020-05-06 18:35:49 +03:00
coderaiser
ca06ebc233 chore(package) v14.5.0 2020-05-04 18:25:17 +03:00
coderaiser
57b5243509 feature(package) eslint v7.0.0 2020-05-04 17:56:41 +03:00
coderaiser
5f95018abe feature(package) eslint-plugin-putout v4.0.0 2020-05-04 17:47:49 +03:00
coderaiser
2a8b8b57e1 feature(package) putout v8.0.0 2020-05-04 17:47:46 +03:00
coderaiser
13d0b149d1 feature(package) madrun v6.0.0 2020-05-04 17:47:43 +03:00
coderaiser
d7a58ae791 fix(user-menu) choose using Enter 2020-05-04 14:22:18 +03:00
coderaiser
67eef31520 feature(client) directory: add abily to show progress dialog on upload 2020-05-04 14:21:49 +03:00
coderaiser
82f3198bdd chore(travis ) get back node v10 2020-04-27 11:51:54 +03:00
coderaiser
429045e419 docs(help) User Menu: __settings 2020-04-27 11:44:43 +03:00
coderaiser
a645b9317e chore(package) v14.4.0 2020-04-27 00:04:50 +03:00
coderaiser
a9e19d3b4b test(user-menu) parse-user-menu 2020-04-27 00:03:22 +03:00
coderaiser
2267b3e6b2 chore(Dokefile) node v14 2020-04-26 23:45:08 +03:00
coderaiser
5d589ee31d feature(user-menu) add ability to run selected items without showing dialog 2020-04-26 23:44:27 +03:00
coderaiser
28caa05292 test(cloudcmd) promisify 2020-04-25 23:21:44 +03:00
coderaiser
faef643956 chore(travis) node v14 2020-04-21 18:37:23 +03:00
coderaiser
dee9f02cf5
chore(user-menu) move down require of inner dependency 2020-04-14 20:55:08 +03:00
coderaiser
44a5235d30 chore(package) v14.3.10 2020-04-13 18:41:09 +03:00
coderaiser
00eecbf7c8 feature(package) yaspeller v7.0.0 2020-04-13 18:37:10 +03:00
coderaiser
798d974677 fix(util) getRegExp: multiple dots 2020-04-13 18:35:26 +03:00
coderaiser
545b5a5135 fix(cloudcmd) crash on check for update (#286) 2020-04-13 18:30:19 +03:00
coderaiser
a8bd28318f chore(package) v14.3.9 2020-04-10 17:01:07 +03:00
coderaiser
67138dab0f chore(cloudcmd) lint 2020-04-10 14:32:17 +03:00
coderaiser
2a170584e2 test(env) lint 2020-04-10 14:30:10 +03:00
coderaiser
b596376051 fix(docker) node -> node:lts (#280) 2020-04-10 13:17:42 +03:00
coderaiser
24ab06c005 fix(env) UPPER_CASE first, and then lower_case (#283) 2020-04-10 12:46:31 +03:00
coderaiser
511e40fa72 chore(cloudcmd) lint: space-before-function-paren 2020-04-09 13:37:29 +03:00
coderaiser
754d4087b4 feature(cloudcmd) promise -> async 2020-04-07 23:58:45 +03:00
coderaiser
de9a26f8ff chore(package) v14.3.8 2020-04-04 13:38:23 +03:00
coderaiser
f69a6ea82b feature(client) ajaxLoad: callback -> promise 2020-04-04 13:35:11 +03:00
coderaiser
0098fb9975 feature(get-json-from-file-table) mv out from client 2020-04-04 12:48:55 +03:00
coderaiser
b483481c81 chore(package) v14.3.7 2020-04-03 18:19:08 +03:00
coderaiser
5b9e250c95 fix(client) dom: getCurrentType 2020-04-03 18:09:11 +03:00
coderaiser
2efba6c0d7 refactor(client) loadDir: callback -> promise 2020-04-03 18:08:28 +03:00
coderaiser
1614901631 feature(package) chalk v4.0.0 2020-04-03 13:56:54 +03:00
coderaiser
96744e9857 chore(package) v14.3.6 2020-03-31 17:06:08 +03:00
coderaiser
2d08fb98b7 fix(cloudcmd) directoryStorage 2020-03-31 16:48:35 +03:00
coderaiser
12e813c432 chore(package) v14.3.5 2020-03-25 21:31:10 +02:00
coderaiser
1ca0905c52 feature(package) fullstore v3.0.0 2020-03-25 17:02:02 +02:00
coderaiser
f9f5a948b8 feature(package) html-webpack-plugin v4.0.1 2020-03-25 13:41:02 +02:00
coderaiser
31eff2fc92 feature(package) codegen.macro v4.0.0 2020-03-25 13:38:48 +02:00
coderaiser
04df87c992 chore(listeners) lint 2020-03-18 21:08:12 +02:00
coderaiser
ce503c8e9a feature(package) url-loader v4.0.0 2020-03-18 21:03:36 +02:00
coderaiser
0d3f777507 chore(package) v14.3.4 2020-03-03 12:12:09 +02:00
coderaiser
a5aa85acb1 chore(route) lint 2020-03-03 12:11:01 +02:00
coderaiser
8e2bea4230 feature(package) readjson v2.0.1 2020-03-02 19:02:56 +02:00
coderaiser
4ce883c507 feature(package) tryrequire v3.0.0 2020-03-02 18:44:54 +02:00
coderaiser
fe163ef5fb feature(package) flop v8.0.0 2020-03-01 14:10:28 +02:00
coderaiser
901fd252f1 chore(cloudcmd) lint 2020-02-29 01:14:38 +02:00
coderaiser
ed58853acc feature(package) writejson v3.0.0 2020-02-27 18:46:10 +02:00
coderaiser
defc0486a5 feature(package) try-to-catch v3.0.0 2020-02-24 16:41:29 +02:00
coderaiser
c463960bc1 feature(package) try-catch v3.0.0 2020-02-24 16:41:27 +02:00
coderaiser
575b9ab425 refactor(vim) move -> moveNext, movePrevious 2020-02-24 12:09:30 +02:00
coderaiser
7444678eb3 chore(package) v14.3.3 2020-02-23 19:32:11 +02:00
coderaiser
87555ce7ba feature(key) vim: split DOM and vim 2020-02-23 19:30:26 +02:00
coderaiser
7648aee85f chore(package) v14.3.2 2020-02-21 17:06:40 +02:00
coderaiser
83dfba2eb6 feature(package) serve-once v2.0.0 2020-02-21 16:56:19 +02:00
coderaiser
6f570722f4 feature(package) edward v12.0.0 2020-02-21 16:49:04 +02:00
coderaiser
999412e2da feature(package) dword v12.0.0 2020-02-21 16:47:30 +02:00
coderaiser
d7f20c4b3b feature(package) ponse v5.0.0 2020-02-21 16:36:06 +02:00
coderaiser
add3f456c7 chore(package) v14.3.1 2020-02-21 13:05:00 +02:00
coderaiser
88d5071400 feature(package) supermenu v4.0.1 2020-02-19 17:38:49 +02:00
coderaiser
a9ba166bd4 chore(cloudcmd) lint: remove useless arguments 2020-02-17 17:17:16 +02:00
coderaiser
8a92a94a3e feature(package) stylelint-config-standard v20.0.0 2020-02-10 12:28:39 +02:00
coderaiser
59bc7c4cd4 feature(package) http-auth v4.1.2 2020-02-04 19:13:03 +02:00
coderaiser
2f6cb2d2ad chore(travis) deploy 2020-01-29 12:32:56 +02:00
coderaiser
54f9e1271a chore(package) v14.3.0 2020-01-29 10:33:03 +02:00
coderaiser
2be3459b08 feature(listeners) improve file select with ctrl + click (#269) 2020-01-29 10:30:22 +02:00
coderaiser
31d7609858 chore(madrun) docker:manifest:create: simplify 2020-01-29 10:23:38 +02:00
Timo Knapp
7fcc860bea
feature(docker) add Dockerfile for arm based clients such as rpi (#268) 2020-01-29 10:12:25 +02:00
coderaiser
a4c8736663 feature(package) @cloudcmd/clipboard v2.0.0 2020-01-28 18:59:34 +02:00
coderaiser
ba6dd8e50e chore(package) rm unused mkdirp 2020-01-26 12:05:51 +02:00
coderaiser
8f819f1eea chore(set-current-by-char) lint: rm blank line 2020-01-14 11:18:14 +02:00
coderaiser
d5e3621a2a feature(package) stylelint v13.0.0 2020-01-13 11:35:49 +02:00
coderaiser
e5c33037e5 refactor(client) initModules: simplify key init 2020-01-08 14:54:57 +02:00
coderaiser
d0fdf1686d feature(package) emitify v4.0.1 2020-01-08 10:06:46 +02:00
coderaiser
7eb31f9412 chore(travis) windows build: git autocrlf 2020-01-03 11:42:20 +02:00
coderaiser
aeb6f76611 chore(css) add custom variables: --color, --color-transparent 2019-12-30 12:08:39 +02:00
coderaiser
03cfca8a4b feature(package) nyc v15.0.0 2019-12-27 10:45:45 +02:00
coderaiser
4aef2b6c38 feature(package) eslint-plugin-node v11.0.0 2019-12-27 10:45:42 +02:00
coderaiser
395e4a1ee4 chore(package) v14.2.1 2019-12-21 17:39:14 +02:00
coderaiser
c1cf8b414f feature(package) for-each-key v2.0.0 2019-12-21 17:37:37 +02:00
coderaiser
ba0179e62f chore(madrun) add lint:stream 2019-12-21 17:19:38 +02:00
coderaiser
075568d3ec feature(package) jonny v3.0.0 2019-12-21 17:07:49 +02:00
coderaiser
132a837717 feature(package) jaguar v6.0.0 2019-12-19 10:35:38 +02:00
coderaiser
9d6784cebd feature(package) ponse v4.0.0 2019-12-16 17:41:21 +02:00
coderaiser
a6e8a83366 feature(package) ponse v3.5.1 2019-12-15 11:45:50 +02:00
coderaiser
dbf6167aba feature(package) memfs v3.0.1 2019-11-27 13:11:25 +02:00
coderaiser
1abf7c5749 feature(package) url-loader v3.0.0 2019-11-26 17:38:22 +02:00
coderaiser
2d64b64d68 feature(package) nodemon v2.0.1 2019-11-22 15:09:49 +02:00
coderaiser
0ba7df4064 feature(package) stylelint v12.0.0 2019-11-18 12:11:33 +02:00
coderaiser
20e930dd81 chore(package) v14.2.0 2019-11-15 18:18:46 +02:00
Bruno Amaral
d836c0a99f feature(cloudcmd) add CLOUDCMD_PREFIX 2019-11-15 17:47:31 +02:00
coderaiser
98734e345f test(route) rm broken test 2019-11-15 17:42:47 +02:00
coderaiser
314f200477 chore(config) lint 2019-11-14 11:59:59 +02:00
coderaiser
321d3ad306 feature(package) chalk v3.0.0 2019-11-14 11:05:16 +02:00
coderaiser
2215cace30 chore(npmignore) rm madrun 2019-11-08 16:26:15 +02:00
coderaiser
56381ccd55 feature(package) eslint-plugin-putout v3.0.0 2019-11-06 17:08:54 +02:00
coderaiser
e86b5ce0cf feature(package) madrun v5.0.0 2019-11-06 17:08:50 +02:00
coderaiser
8b6f93625b feature(package) putout v7.0.0 2019-11-06 17:08:47 +02:00
coderaiser
4be2a53509 chore(cloudcmd) lint 2019-11-04 13:53:06 +02:00
coderaiser
4dffca0184 docs(readme) unhide -> keep 2019-10-27 11:47:54 +02:00
coderaiser
7fb2435f6b docs(help) add " " 2019-10-27 11:37:35 +02:00
coderaiser
a62fef46a0 chore(io) lint 2019-10-26 03:12:25 +03:00
coderaiser
e3d141a619 feature(package) madrun v4.0.0 2019-10-25 19:17:39 +03:00
coderaiser
037da11545 chore(travis) node v13 2019-10-23 12:52:16 +03:00
coderaiser
9778111c58 feature(package) try-to-catch v2.0.0 2019-10-16 22:07:36 +03:00
coderaiser
9311918278 chore(package) v14.1.2 2019-10-16 14:19:34 +03:00
coderaiser
c1a08d8ad3 chore(madrun) lint 2019-10-16 14:17:40 +03:00
coderaiser
4dd28a27d3 feature(package) @cloudcmd/fileop v4.0.0 2019-10-16 14:17:37 +03:00
coderaiser
44d82a6c54 feature(package) inly v4.0.0 2019-10-16 12:51:07 +03:00
coderaiser
1ec55052e6 feature(package) onezip v4.0.0 2019-10-16 12:51:04 +03:00
coderaiser
3560f5483e feature(package) open v7.0.0 2019-10-16 12:38:06 +03:00
Arek Czogała
c44b1f66ee fix(madrun) client test command: fix test:client command (#260) 2019-10-16 12:12:35 +03:00
coderaiser
d0e2b83b54 chore(client) rm "\n" 2019-10-12 21:32:54 +03:00
coderaiser
9e284e1de0 feature(package) multi-rename v2.0.0 2019-10-11 12:55:37 +03:00
coderaiser
0cfdc600e7 feature(package) shortdate v2.0.0 2019-10-11 12:39:19 +03:00
coderaiser
151cfd85ed chore(package) v14.1.1 2019-10-09 17:26:14 +03:00
coderaiser
b72df1d64c test(mv) promises 2019-10-09 17:03:46 +03:00
coderaiser
d062b8c32f feature(package) @cloudcmd/fileop v3.0.0 2019-10-07 18:08:39 +03:00
coderaiser
4749163d9c feature(package) @cloudcmd/move-files v3.0.0 2019-10-07 18:07:34 +03:00
coderaiser
bc2a2a72be feature(package) copymitter v5.0.0 2019-10-07 17:54:00 +03:00
coderaiser
2538f46dfd chore(package) v14.1.0 2019-10-02 14:14:32 +03:00
coderaiser
bb9fc8ba83 feature(view) add support of webm (#256) 2019-10-02 13:12:14 +03:00
coderaiser
794caced01 chore(cloudcmd) lint 2019-09-28 16:42:30 +03:00
coderaiser
d473a7e187 chore(package) v14.0.2 2019-09-25 14:25:03 +03:00
coderaiser
43ccc76960 fix(client) change directory with enabled dirStorage (#255) 2019-09-25 14:22:06 +03:00
coderaiser
e38766f0fa chore(package) v14.0.1 2019-09-25 00:38:04 +03:00
coderaiser
8b6d0f27d8 feature(package) deepword v7.0.0 2019-09-25 00:36:54 +03:00
coderaiser
22593cd544 fix(cloudcmd) wrong editor root on multi instance 2019-09-25 00:10:05 +03:00
coderaiser
719119b793 feature(cloudcmd) rm now (zeit/micro/issues/377) 2019-09-23 23:22:57 +03:00
coderaiser
edd1665c55 test(route) realpath on mac os 2019-09-23 12:35:59 +03:00
coderaiser
b803021ce2 refactor(server) convert fs to fs.promises 2019-09-22 23:40:10 +03:00
coderaiser
8992a1c7bc chore(package) v14.0.0 2019-09-22 14:46:43 +03:00
coderaiser
626440523d chore(travis) rm node 8 2019-09-22 14:17:55 +03:00
coderaiser
116c965cb4 feature(operation) show progress bar on first operation (#253) 2019-09-22 14:16:13 +03:00
coderaiser
3b2e2a2232 feature(package) pullout v4.0.0 2019-09-21 22:42:04 +03:00
coderaiser
0b36981c3c feature(package) console-io v11.0.0 2019-09-21 22:28:25 +03:00
coderaiser
4a70219ba4 feature(package) flop v7.0.0 2019-09-21 22:26:49 +03:00
coderaiser
ca12b927b5 feature(package) restbox v2.0.0 2019-09-21 22:21:10 +03:00
coderaiser
58cb265c61 feature(package) restafary v8.0.0 2019-09-21 22:21:05 +03:00
coderaiser
777b7e7aaf feature(package) nomine v4.0.0 2019-09-21 22:20:51 +03:00
coderaiser
29afda8b3a feature(cloudcmd) drop support of node < 10 2019-09-21 22:02:07 +03:00
coderaiser
6e4bedca2d feature(cloudcmd) remove --progress option, make always enabled 2019-09-21 22:01:15 +03:00
coderaiser
e0df785ece chore(package) v13.4.2 2019-09-21 16:47:59 +03:00
coderaiser
cd5188c71e fix(terminal) on -> onKey 2019-09-21 16:42:58 +03:00
coderaiser
715fe59ee5 docs(help) group rename link 2019-09-20 17:16:08 +03:00
coderaiser
8c318fce0e chore(package) v13.4.1 2019-09-20 17:12:52 +03:00
coderaiser
4fd5b38832 feature(package) @cloudcmd/olark v3.0.0 2019-09-20 14:30:25 +03:00
coderaiser
68d186e686 feature(package) format-io v2.0.0 2019-09-20 14:05:00 +03:00
coderaiser
8210c4f05d feature(package) limier v3.0.0 2019-09-19 21:57:34 +03:00
coderaiser
f17af9a920 feature(package) currify v4.0.0 2019-09-19 21:45:36 +03:00
coderaiser
b35c692e3b feature(package) limier v2.0.1 2019-09-19 21:40:57 +03:00
coderaiser
160114a364 chore(terminal) lint 2019-09-18 23:16:22 +03:00
coderaiser
83cf1b6990 feature(package) load.js v3.0.0 2019-09-18 17:27:48 +03:00
coderaiser
2157bbf05f feature(package) @cloudcmd/create-element v2.0.0 2019-09-18 17:27:19 +03:00
coderaiser
be8c584e84 feature(package) supermenu v3.0.0 2019-09-18 16:50:36 +03:00
coderaiser
5b14794690 feature(package) smalltalk v4.0.0 2019-09-18 16:46:23 +03:00
coderaiser
e2687af6ef feature(package) @cloudcmd/modal v2.0.0 2019-09-18 16:39:04 +03:00
coderaiser
0ac1724f05 feature(package) putout v6.0.0 2019-09-16 19:04:58 +03:00
coderaiser
a52b0b4115 chore(cloudcmd) lint 2019-09-16 17:48:42 +03:00
coderaiser
ba78be247e feature(package) stylelint-config-standard v19.0.0 2019-09-16 17:42:28 +03:00
coderaiser
e0e1a2480d feature(package) stylelint v11.0.0 2019-09-16 17:42:21 +03:00
coderaiser
7a2ebe7f13 feature(package) markdown-it v10.0.0 2019-09-11 12:15:23 +03:00
coderaiser
2291e35358 feature(package) rm version-io 2019-09-11 12:15:18 +03:00
coderaiser
9876611eef feature(package) fullstore v2.0.2 2019-09-09 19:17:40 +03:00
coderaiser
7e29a2f4ee feature(package) wraptile v3.0.0 2019-09-07 15:49:31 +03:00
coderaiser
3fff765adf feature(package) rendy v3.0.0 2019-09-06 17:34:53 +03:00
coderaiser
b543965f35 feature(package) eslint-plugin-node v10.0.0 2019-09-06 17:32:20 +03:00
coderaiser
68cda2cd46 feature(package) restafary v7.0.0 2019-09-04 16:21:29 +03:00
coderaiser
6879c17edd chore(package) v13.4.0 2019-09-03 18:48:08 +03:00
coderaiser
dda32c3a40 feature(view) add support of pdf 2019-09-03 18:46:12 +03:00
coderaiser
1f07a199db feature(package) madrun v3.0.1 2019-08-30 13:07:56 +03:00
coderaiser
c495db4bc6 chore(package) v13.3.0 2019-08-28 14:30:41 +03:00
coderaiser
950028af92 feature(cloudcmd) decrease bundle size: disable convertion to es5
cloudcmd.common.js: 155K -> 141K
cloudcmd.js: 26K -> 20K
2019-08-27 22:33:32 +03:00
coderaiser
089bdc64a0 feature(client) remove legacy suffix, use modules as is 2019-08-27 22:18:40 +03:00
coderaiser
32628ec43f feature(package) es6-promisify v6.0.2 2019-08-27 18:54:43 +03:00
coderaiser
139a91b094 feature(menu) rm mute: has no sense with new ponse headers 2019-08-26 21:58:40 +03:00
coderaiser
18111aa744 fix(client) rm additional dialog 2019-08-23 21:40:18 +03:00
coderaiser
857fe1d950 fix(user-menu) putout path 2019-08-23 15:20:51 +03:00
coderaiser
e46d104cc7 feature(markdown) move out parse to worker 2019-08-23 15:16:40 +03:00
coderaiser
560dd8fddc refactor(edit-names) smalltalk -> Dialog 2019-08-23 14:05:59 +03:00
coderaiser
a29b6d172a fix(edit-names) hide 2019-08-23 13:46:45 +03:00
coderaiser
4b3afb5223 refactor(edit-names) Dialog -> smalltalk 2019-08-23 13:46:45 +03:00
coderaiser
ca083963e9 fix(vim) find 2019-08-23 13:46:43 +03:00
coderaiser
33c1fdf629 chore(package) v13.2.1 2019-08-22 19:06:35 +03:00
coderaiser
a8793dbbc5 refactor(dom) getRefreshButton: simplify 2019-08-22 18:48:56 +03:00
coderaiser
3ac7ee4b76 fix(buffer) copy, cut 2019-08-22 18:47:58 +03:00
coderaiser
7e6b3c6ba5 fix(key) chrome event double pass 2019-08-21 22:07:56 +03:00
coderaiser
137673c551 chore(madrun) set lint:progress default lint 2019-08-21 19:43:13 +03:00
coderaiser
f22829ef4f fix(user-menu) processing menu item run error 2019-08-21 19:38:28 +03:00
coderaiser
9abb48526b chore(travis) rm allow_failures: node_js v12 2019-08-21 19:34:40 +03:00
coderaiser
57984fe2d6 feature(user-menu) rm path 2019-08-21 19:29:34 +03:00
coderaiser
98e284074c chore(parse-error) comment 2019-08-20 23:35:39 +03:00
coderaiser
99e3f5d95e chore(package) v13.2.0 2019-08-20 23:04:45 +03:00
coderaiser
8ba1340e92 chore(madrun) coverage 2019-08-20 23:02:42 +03:00
coderaiser
511cceb9d9 fix(menu) autoplay on download in firefox 2019-08-20 22:58:57 +03:00
coderaiser
64e6b8387a feature(user-menu) improve error handling 2019-08-20 22:58:57 +03:00
coderaiser
b8592d35c0 fix(dom) getCurrentData 2019-08-20 22:58:55 +03:00
coderaiser
cc76eb9d2b feature(package) eslint-plugin-putout v2.0.0 2019-08-19 20:01:54 +03:00
coderaiser
4189d20961 chore(package) v13.1.0 2019-08-16 18:29:28 +03:00
coderaiser
98a9801644 feature(cloudcmd) add ability to remember position of current file on reload 2019-08-16 18:27:52 +03:00
coderaiser
63be7c8743 feature(madrun) disable web workers, while testing 2019-08-16 18:19:22 +03:00
coderaiser
7d5b3463cc refactor(client) callbacks -> async 2019-08-16 18:06:12 +03:00
coderaiser
eee2cb1b10 docs(help) rm CLOUDCMD_USER_MENU: no longer supported 2019-08-16 15:22:21 +03:00
coderaiser
36b8e5903d feature(user-menu) speed up user menu parsing with help of worker threads 2019-08-16 14:48:51 +03:00
coderaiser
9301506d82 feature(user-menu) add ability to used EcmaScript Modules, improve error handling 2019-08-15 23:50:04 +03:00
coderaiser
bba2f7b570 fix(user-menu) hide load on error 2019-08-15 23:49:08 +03:00
coderaiser
f989880d48 fix(key) keys block 2019-08-15 23:48:55 +03:00
coderaiser
b083de710b feature(server) add compress: speed up client side load 2019-08-15 23:47:59 +03:00
coderaiser
ce8eea7b78 chore(package) v13.0.1 2019-08-14 21:39:06 +03:00
coderaiser
196ccb29fc feature(package) rimraf v3.0.0 2019-08-14 21:31:22 +03:00
coderaiser
a92948ee7e fix(cloudcmd) rm --user-menu: always enabled 2019-08-14 21:30:27 +03:00
coderaiser
9f2989fb62 chore(package) v13.0.0 2019-08-14 15:49:02 +03:00
coderaiser
1ab5b189dc chore(workflow) add 2019-08-14 15:45:14 +03:00
coderaiser
a493e5a4d1 fix(set-listeners) can not continue first error operation error 2019-08-14 15:45:14 +03:00
coderaiser
a8e679bf03 feature(cloudcmd) only user menu on f2 2019-08-14 15:45:11 +03:00
coderaiser
a61eb22b62 feature(cloudcmd) remove plugins 2019-08-14 15:25:07 +03:00
coderaiser
b93e759ba6 fix(view) getMediaElement: play video/audio 2019-08-14 15:15:45 +03:00
coderaiser
66e0acbb8f feature(package) putout v5.2.1 2019-08-12 16:54:34 +03:00
coderaiser
e75948ec01 feature(package) style-loader v1.0.0 2019-08-07 13:43:10 +03:00
coderaiser
a3ef3ae60d chore(cloudcmd) lint 2019-08-05 18:10:16 +03:00
coderaiser
a021090dc9 chore(package) v12.6.3 2019-08-02 13:53:17 +03:00
coderaiser
3c87ce0fa3 fix(operation) first copy after startup fails (close #251) 2019-08-02 13:50:56 +03:00
coderaiser
86417d4781 fix(key) chrome keydown event double pass 2019-08-02 13:48:38 +03:00
coderaiser
7c52d622ba docs(help) add two config managers example (#250) 2019-07-24 14:41:47 +03:00
coderaiser
ab183d89eb docs(help) code example 2019-07-24 14:29:44 +03:00
coderaiser
4b98fa70c0 docs(readme) rm open collective 2019-07-24 13:29:58 +03:00
fossabot
96cb2875c0 docs(readme) add license scan report and status
Signed-off-by: fossabot <badges@fossa.io>
2019-07-24 13:28:28 +03:00
coderaiser
74ee33ee4c chore(travis) disable cache for npm 2019-07-23 15:18:44 +03:00
coderaiser
a6c7d443ae chore(cloudcmd) lint 2019-07-22 20:42:09 +03:00
coderaiser
551fc98498 fix(client) load 2019-07-22 20:35:04 +03:00
coderaiser
ecd2624d2b feature(cloudcmd) simplify lint 2019-07-22 19:37:08 +03:00
coderaiser
b4629a86e4 feature(package) markdown-it v9.0.0 2019-07-11 13:16:10 +03:00
coderaiser
af28ddf201 feature(package) deepmerge v4.0.0 2019-07-10 15:31:46 +03:00
coderaiser
2f2cd58c30 chore(client) lint: merge-if-statements 2019-07-08 12:18:07 +03:00
coderaiser
ed3bdf1586 feature(package) yaspeller v6.0.0 2019-07-08 12:12:34 +03:00
coderaiser
d4ff1f97a9 chore(cloudcmd) lint 2019-07-05 14:21:21 +03:00
coderaiser
f662ec0e67 fix(cloudcmd) server start when importListen enabled 2019-06-26 14:41:55 +03:00
coderaiser
9483fbeb5d chore(cloudcmd) lint: new-line-function-call-arguments 2019-06-26 14:34:38 +03:00
coderaiser
fd6d384ba2 chore(cloudcmd) lint: convert forEach to for-of 2019-06-25 20:12:34 +03:00
coderaiser
6d69cd3a48 chore(set-current-by-char) lint 2019-06-24 15:29:38 +03:00
coderaiser
ea8ec97f49 chore(cloudcmd) lint 2019-06-19 15:05:02 +03:00
coderaiser
83a138f38c chore(cloudcmd) lint: sequence expressions 2019-06-14 14:10:18 +03:00
coderaiser
bed4f1ae13 feature(package) css-loader v3.0.0 2019-06-11 18:34:09 +03:00
coderaiser
aaeb90372e chore(cloudcmd) lint: no-paren 2019-06-11 13:30:38 +03:00
coderaiser
669f412869 feature(babel) remove unused @babel/plugin-syntax-dynamic-import 2019-06-10 18:24:36 +03:00
coderaiser
62053d9a34 feature(cloudcmd) rm Promise polyfill 2019-06-10 18:22:15 +03:00
coderaiser
e4e05e2013 feature(package) rm Object.assign polyfill 2019-06-10 18:22:15 +03:00
coderaiser
1fb920e039 chore(package) v12.6.2 2019-06-06 18:19:59 +03:00
coderaiser
b35762b1ec feature(package) remove file-loader 2019-06-06 18:19:22 +03:00
coderaiser
17498dbc07 feature(package) url-loader v2.0.0 2019-06-06 18:19:19 +03:00
coderaiser
d52fe75e43 fix(cloudcmd) config: save -> write (#247) 2019-06-06 17:58:21 +03:00
coderaiser
aca5ad0c4b chore(package) v12.6.1 2019-06-04 19:10:50 +03:00
coderaiser
b6ed7da0a7 fix(config) configManager: totally move away from singletone 2019-06-04 19:10:02 +03:00
coderaiser
2abe7d688d test(config) coverage 2019-05-31 18:30:16 +03:00
coderaiser
ce794fe0be chore(webpack) js: maxAssetSize 2019-05-31 18:17:22 +03:00
coderaiser
d81149dd15 chore(package) v12.6.0 2019-05-31 17:59:24 +03:00
coderaiser
f9c659612a feature(config-manager) add (#208) 2019-05-31 17:57:38 +03:00
coderaiser
fe9723fa15 feature(package) add support of cwd in TerminalRun with help of gritty v4.7.0 2019-05-31 13:53:31 +03:00
coderaiser
4914c22b5d docs(help) refresh -> await refresh 2019-05-28 19:10:24 +03:00
coderaiser
8961841847 feature(user-menu) add ability to ignore private methods 2019-05-28 19:04:22 +03:00
coderaiser
554023c839 chore(package) v12.5.0 2019-05-28 18:53:53 +03:00
coderaiser
71ce9fea5a docs(readme) add auth info (#219) 2019-05-28 18:50:29 +03:00
coderaiser
24aa355ed0 chore(user-menu) rm "\n" 2019-05-28 14:04:09 +03:00
coderaiser
3273c1abe5 feature(user-menu) add Compare Directories (#220) 2019-05-28 13:56:13 +03:00
coderaiser
303213c48b chore(package) v12.4.0 2019-05-27 20:33:57 +03:00
coderaiser
744983cfc4 docs(help) add User Menu Cookbook 2019-05-27 20:32:11 +03:00
coderaiser
3a16715e03 feature(terminal-run) add ability to resolve exit code 2019-05-27 20:32:09 +03:00
coderaiser
a360301759 chore(cloudfunc) rm no-multi-space 2019-05-27 19:26:29 +03:00
coderaiser
c212acd90b fix(terminal-run) resolve before close 2019-05-27 12:37:18 +03:00
coderaiser
b374437fb6 chore(package) v12.3.2 2019-05-24 19:15:55 +03:00
coderaiser
fc8eda07f7 fix(user-menu) F1 and F keys overlapping 2019-05-24 19:14:51 +03:00
coderaiser
9149f77a37 fix(select-by-pattern) crash 2019-05-24 19:04:16 +03:00
coderaiser
fc747792a1 chore(package) v12.3.1 2019-05-24 18:03:13 +03:00
coderaiser
035a63f19e fix(cloudcmd) copy 2019-05-24 18:02:34 +03:00
coderaiser
4382d8ca73 docs(help) improve User Menu Example 2019-05-24 13:28:20 +03:00
coderaiser
e1de247dbb chore(package) v12.3.0 2019-05-24 13:12:59 +03:00
coderaiser
d617dbfc03 feature(user-menu) hide scroll when small amount of items 2019-05-24 13:03:02 +03:00
coderaiser
0b0f9e80e4 chore(cloudcmd) lint 2019-05-24 12:51:50 +03:00
coderaiser
10cc40ec5a feature(user-menu) add ability to run in mobile devices 2019-05-24 12:36:42 +03:00
coderaiser
8859587768 feature(upload) improve style 2019-05-24 12:31:38 +03:00
coderaiser
070ccc4fbb feature(user-menu) imrove error output 2019-05-24 12:08:18 +03:00
coderaiser
f80f87d77d test(user-menu) coverage 2019-05-24 12:04:08 +03:00
coderaiser
093966f692 test(user-menu) clear 2019-05-23 19:16:12 +03:00
coderaiser
76184c0251 feature(user-menu) add default user menu 2019-05-23 18:18:08 +03:00
coderaiser
7b6e767ccb refactor(dom) RESTful: add tryToCatch wrapper 2019-05-23 18:18:08 +03:00
tarzak
8ac3211a86 fix(user-menu) prefix (#244) 2019-05-23 18:11:55 +03:00
coderaiser
ef38bd7aa3 feature(dialog) cancel -> tryToCatch 2019-05-22 15:16:00 +03:00
coderaiser
7e98ad725d refactor(input) mv client -> client/modules/config 2019-05-22 12:26:23 +03:00
coderaiser
ba72727fba refactor(select-by-pattern) forEach -> for-of 2019-05-22 12:26:21 +03:00
coderaiser
19239655ed test(menu) defaultMenu: add 2019-05-22 12:23:03 +03:00
coderaiser
ee59fbf8d2 refactor(cloudcmd) forEach -> for-of 2019-05-22 12:23:00 +03:00
coderaiser
f7e47d2167 chore(user-menu) double alert 2019-05-20 18:39:06 +03:00
coderaiser
a979d532d5 refactor(dom) files: promisify 2019-05-18 18:49:55 +03:00
coderaiser
9ff5dee979 refactor(files) early return 2019-05-18 17:49:56 +03:00
coderaiser
edf525f269 refactor(dom) RESTful: promisify 2019-05-17 20:10:32 +03:00
coderaiser
1b174d5f2f refactor(client) refresh: promisify 2019-05-17 19:19:51 +03:00
coderaiser
9ff5982a5b feature(user-menu) add default option: create user menu 2019-05-17 19:13:58 +03:00
coderaiser
5fb5652f3d refactor(cloudfunc) getSize: regexp 2019-05-17 14:00:52 +03:00
coderaiser
dbbeb063e7 chore(package) mv es6-promisify to dependencies 2019-05-15 18:36:20 +03:00
coderaiser
aa8c944fe9 chore(madrun) lint: add .cloudcmd.menu.js 2019-05-15 18:36:17 +03:00
coderaiser
21ac9bb45b feature(user-menu) add error handling 2019-05-15 18:24:50 +03:00
coderaiser
0b3348ee77 fix(dom) renameCurrent: try-to-promise RESTful.mv 2019-05-15 13:48:52 +03:00
coderaiser
6574d45939 feature(user-menu) add ability to navigate with j, k 2019-05-14 18:40:08 +03:00
coderaiser
ffd8a54d1e test(user-menu) getUserMenu: coverage 2019-05-14 17:58:19 +03:00
coderaiser
601a7f9310 test(route) buttons: no user menu 2019-05-14 17:55:15 +03:00
coderaiser
1dbcf92336 refactor(user-menu) menuName 2019-05-14 17:52:56 +03:00
coderaiser
a727d6f6ea feature(cloudcmd) deprecate plugins 2019-05-14 11:29:17 +03:00
coderaiser
e6f173df37 chore(travis) allow_failures: node 12 2019-05-13 18:11:51 +03:00
coderaiser
f4f88da945 docs(help) to -> two 2019-05-13 18:02:19 +03:00
coderaiser
aedafe1f4b docs(help) UserMenu: optional 2019-05-13 18:01:40 +03:00
coderaiser
e7f8769f61 docs(readme) bear in mind 2019-05-13 18:01:01 +03:00
coderaiser
ee809e1fe7 docs(readme) read 2019-05-13 17:59:19 +03:00
coderaiser
bb73d81256 chore(package) v12.2.0 2019-05-13 17:54:40 +03:00
coderaiser
ffbb96301e feature(key) add ability to rename file with Shift + F6 2019-05-13 17:51:33 +03:00
coderaiser
eb4f7c0d7c feature(user-menu) add (#221) 2019-05-13 17:45:59 +03:00
coderaiser
f60af287d3 feature(package) clean-css-loader v2.0.0 2019-05-07 18:03:26 +03:00
coderaiser
1f97fd27a0 feature(package) edward v11.0.0 2019-05-06 13:25:29 +03:00
coderaiser
c8bbc2400b feature(npmignore) add fixture.json 2019-05-06 12:13:27 +03:00
coderaiser
57142324ed feature(package) dword v11.0.0 2019-05-06 12:07:40 +03:00
coderaiser
0876469030 feature(package) smalltalk v3.4.0 2019-05-05 18:44:58 +03:00
coderaiser
f6dcdb72ec fix(operation) set-listeners: alert: noCancel -> cancel 2019-05-04 21:26:09 +03:00
coderaiser
cde38e3bb0 fix(cloudcmd) different title 2019-05-04 21:22:58 +03:00
coderaiser
632abeef87 feature(package) eslint v6.0.0-alpha 2019-05-04 20:37:25 +03:00
coderaiser
370182e3aa feature(package) eslint-plugin-node v9.0.1 2019-05-04 19:49:50 +03:00
coderaiser
4ad101dca1 feature(config) speed up load: series -> parallel 2019-05-01 18:21:16 +03:00
coderaiser
9db56a7fd7 test(terminal) node v12 support 2019-05-01 13:02:06 +03:00
coderaiser
d1af83e258 feature(cloudcmd) avoid service worker reoload scripts in dev mode 2019-05-01 12:53:02 +03:00
coderaiser
0e39ecaa77 feature(package) putout v4.23.0 2019-04-24 15:38:23 +03:00
coderaiser
2c6449b14d chore(travis) node: v12 2019-04-24 14:03:58 +03:00
coderaiser
1cfb58d922 feature(package) nyc v14.0.0 2019-04-17 11:28:34 +03:00
coderaiser
d94d448ee4 chore(package) v12.1.0 2019-04-15 15:37:38 +03:00
coderaiser
372395575c feature(edit-names) add bulk rename (#231) 2019-04-15 15:35:59 +03:00
coderaiser
768d4bbab8 feature(package) stylelint v10.0.0 2019-04-15 12:11:38 +03:00
coderaiser
0922649988 fix(heroku) app: add "}" (#236) 2019-04-15 12:04:44 +03:00
coderaiser
39318354d3 chore(package) v12.0.2 2019-04-04 15:13:47 +03:00
coderaiser
813f1c70b7 fix(listeners) any touch open file (#235) 2019-04-04 15:12:26 +03:00
coderaiser
6df78e1c9b chore(package) v12.0.1 2019-04-04 11:47:28 +03:00
coderaiser
3cf12de6c0 chore(cloudcmd) lint 2019-04-04 11:46:31 +03:00
coderaiser
46102d1a76 fix(listeners) unable to navigate into folders (#235) 2019-04-04 11:42:59 +03:00
coderaiser
841e9578b7 chore(package) v12.0.0 2019-04-01 16:27:21 +03:00
coderaiser
31e8c85d99 feature(cloudcmd) drop support of beautify, minify 2019-04-01 16:23:40 +03:00
coderaiser
009628c3ee feature(cloudcmd) improved progress of file operations 2019-04-01 15:31:27 +03:00
coderaiser
7da7bc8606 chore(madrun) watch:client:dev: rm duplicate --progress 2019-04-01 15:30:38 +03:00
coderaiser
d71066b95e feature(cloudcmd) split prefix and prefixSocket finally 2019-04-01 15:30:38 +03:00
coderaiser
5f53da58e7 chore(cloudcmd) lint: keyword spacing 2019-04-01 15:30:38 +03:00
Max_
e32e3ff47d feature(cloudcmd) view file on double click or enter 2019-04-01 15:30:29 +03:00
coderaiser
648997851c feature(cloudcmd) add ability to change directory using F3 2019-03-28 16:31:38 +02:00
coderaiser
9e2e19dfa8 chore(package) v11.8.6 2019-03-27 14:40:45 +02:00
coderaiser
e571c22891 fix(operation) progress 2019-03-27 14:39:56 +02:00
coderaiser
c1a3575d44 feature(package) opn -> open v6.0.0 2019-03-27 14:31:25 +02:00
coderaiser
6382044f1e docs(help) txt.png -> file.png 2019-03-22 13:50:06 +02:00
coderaiser
0a553558c4 chore(now) get back to v1, since v2 not support web sockets (zeit/micro#377) 2019-03-22 13:39:12 +02:00
coderaiser
6d8e58c5d8 chore(now) v2 2019-03-22 13:21:51 +02:00
coderaiser
f7134f6e2d feature(package) remove @babel/plugin-proposal-object-rest-spread 2019-03-22 13:21:51 +02:00
coderaiser
7bffaa8cc3 fix(terminal) rm IntersectionObserver handling (xtermjs/xterm.js#1929) 2019-03-14 12:20:14 +02:00
coderaiser
943924adef chore(cloudcmd) lint 2019-03-14 12:19:08 +02:00
coderaiser
916b971e77 chore(menu) lint 2019-02-28 18:56:14 +02:00
coderaiser
16e0b19df7 chore(cloudcmd) putout: convert-apply-to-spread 2019-02-27 20:53:02 +02:00
coderaiser
3175d8ab47 chore(madrun) lint 2019-02-22 13:16:04 +02:00
coderaiser
4121cc49da chore(madrun) series -> run 2019-02-21 18:09:10 +02:00
coderaiser
76c7443d07 chore(cloudcmd) lint 2019-02-21 17:17:22 +02:00
coderaiser
fa6de0ce67 test(plugins) coverage 2019-02-20 16:31:30 +02:00
coderaiser
c3bbc05f8d chore(package) v11.8.5 2019-02-20 16:19:26 +02:00
coderaiser
e4caeb66b4 fix(plugins) set content-type (#230) 2019-02-20 16:16:22 +02:00
coderaiser
3bac819760 chore(cloudcmd) lint 2019-02-18 18:47:02 +02:00
coderaiser
d6674aed3e feature(package) putout v4.0.0 2019-02-16 21:17:18 +02:00
coderaiser
f20c7b15a4 chore(npmignore) add madrun.js 2019-02-16 18:09:44 +02:00
coderaiser
17b9bde6e5 chore(package) nyc exclude 2019-02-16 18:06:46 +02:00
coderaiser
018c97f497 feature(package) madrun v2.0.0 2019-02-16 18:06:44 +02:00
coderaiser
6841da5557 chore(package) v11.8.4 2019-02-15 16:56:31 +02:00
coderaiser
f9bf2dcbcd fix(terminal) chrome does not display anything on first open (#214) 2019-02-15 13:55:41 +02:00
coderaiser
e6774023ce test(rest) rm autoGlobals 2019-02-15 13:43:24 +02:00
coderaiser
aac1c7ad43 fix(rest) can not read ###files (#223) 2019-02-15 12:50:19 +02:00
coderaiser
32de52042d chore(images) make testable 2019-02-15 12:49:51 +02:00
coderaiser
62e2ca2a64 chore(cloudcmd) lint: no-multi-spaces 2019-02-08 15:47:05 +02:00
coderaiser
d3ecafe0ea feature(package) tar-stream v2.0.0 2019-02-04 12:01:35 +02:00
coderaiser
e17dcd11c9 chore(now) add .madrun.js 2019-02-01 19:17:37 +02:00
coderaiser
d82e08281e chore(package) rm config 2019-02-01 19:05:44 +02:00
coderaiser
19763bb84d test(util) test/common/util.js -> common/util.spec.js 2019-02-01 19:05:44 +02:00
coderaiser
ea08b92e8b chore(cloudcmd) add dangle-comma 2019-02-01 19:05:41 +02:00
coderaiser
4447d43c89 feature(package) redrun -> madrun 2019-02-01 18:24:37 +02:00
coderaiser
d33ee8a7f0 fix(help) add --terminal-auto-restart 2019-02-01 17:25:34 +02:00
coderaiser
d93875b751 chore(cloudcmd) eslint-plugin-putout: one-line-destructuring 2019-02-01 15:38:18 +02:00
coderaiser
90cec0169f fix(cloudcmd) read root from custom config (#224) 2019-01-31 17:57:18 +02:00
coderaiser
040b2c2914 chore(cloudcmd) prefer const 2019-01-31 17:57:18 +02:00
coderaiser
b62984d540 chore(cloudcmd) putout: apply-destructuring 2019-01-30 16:38:08 +02:00
coderaiser
ba5fee3f94 feature(package) unionfs v4.0.0 2019-01-30 15:12:47 +02:00
coderaiser
28277e3c54 feature(package) package-json v6.0.0 2019-01-30 15:11:59 +02:00
coderaiser
79a08a36fa refactor(cloudfunc) concat -> array spread 2019-01-26 17:44:39 +02:00
coderaiser
f223cd7959 chore(eslint) rm extends from eslintrc.json, it is enabled by default 2019-01-26 17:44:25 +02:00
coderaiser
6d0f129949 chore(package) scripts: add putout to lint 2019-01-23 13:00:09 +02:00
coderaiser
8dcd80ce67 test(static) rm only 2019-01-22 11:55:18 +02:00
coderaiser
653a7bf2fa feature(package) add @putout/eslint-config 2019-01-17 13:43:09 +02:00
coderaiser
d5d67b108f chore(package) rm eslint-plugin-tape 2019-01-17 12:14:11 +02:00
coderaiser
02f8d75273 test(remove-extension) test -> client 2019-01-14 12:15:47 +02:00
coderaiser
74d56f795d feature(package) tape -> supertape 2019-01-13 20:55:42 +02:00
coderaiser
64bf5681e8 chore(putout) updated 2019-01-12 13:55:13 +02:00
coderaiser
d0a486d7e7 chore(client) split variable declarations 2019-01-10 14:58:38 +02:00
coderaiser
f6ab3ffd39 feature(package) add putout 2019-01-10 12:05:57 +02:00
coderaiser
8eeb122a38 chore(package) rm eslint-remove-line 2019-01-04 14:44:40 +02:00
coderaiser
0ca918d814 chore(files) throw() -> throw 2019-01-04 14:44:25 +02:00
coderaiser
455f4e77e0 refactor(view) viewImage: href, prefixURL -> prefixURL 2019-01-03 14:30:14 +02:00
coderaiser
d92f5f6cf6 chore(config) rm unused 2018-12-31 19:25:47 +02:00
coderaiser
d31a8188f5 chore(markdown) rm unused pullout 2018-12-31 19:24:10 +02:00
coderaiser
f2b98ba803 chore(route) rm unused 2018-12-31 19:09:01 +02:00
coderaiser
4c4ec32261 chore(validate) rm unused config 2018-12-27 20:23:49 +02:00
coderaiser
bb5898835d chore(cloudcmd) lint: add ";" 2018-12-25 15:15:31 +02:00
coderaiser
4d52059c7d chore(yaspeller) markdown, npm 2018-12-25 15:00:37 +02:00
Manoel
0c24bb1937 chore(eslint) add extension to .eslintrc file (#210)
.eslintrc without extension is deprecated
2018-12-25 14:38:47 +02:00
coderaiser
ca10cf257c feature(package) add eslint-plugin-tape 2018-12-25 14:36:19 +02:00
Tom Kenny
4c91d27cd2 docs(help) improve English translation of HELP.md (#211)
This is mostly grammar and markup fixes (written by a native English speaker).
2018-12-25 14:32:29 +02:00
coderaiser
d925634e17 feature(package) file-loader v3.0.1 2018-12-21 08:51:48 +02:00
coderaiser
160c4a8864 docs(license) 2019 2018-12-20 18:01:50 +02:00
coderaiser
29d1338a6d chore(eslint) rm sourceType 2018-12-20 18:01:30 +02:00
coderaiser
2aafe438fb chore(webpack) js: set default NODE_ENV 2018-12-20 17:30:07 +02:00
coderaiser
96d8489170 chore(webpack) js: hide size warnings 2018-12-20 17:24:36 +02:00
coderaiser
b0148003b7 feature(package) css-loader v2.0.1 2018-12-20 16:40:28 +02:00
coderaiser
a86edf1497 feature(package) kebabToCamelCase -> just-pascal-case 2018-12-05 14:12:39 +02:00
coderaiser
e6dee77695 chore(cloudcmd) destructure 2018-12-05 11:28:42 +02:00
coderaiser
4da7e07703 feature(package) deepmerge v3.0.0 2018-12-05 11:23:19 +02:00
coderaiser
47ef82aca1 chore(server) template string 2018-12-05 11:18:05 +02:00
coderaiser
e05fcf07b5 chore(package) v11.8.3 2018-12-04 20:54:23 +02:00
coderaiser
1f691f1d7f test(export) defaultConfig: prefix 2018-12-04 20:53:16 +02:00
coderaiser
9df87b827b feature(modules) socket.io v2.2.0 2018-12-04 20:44:16 +02:00
coderaiser
0fdbd9052a fix(edit) prefix (#207) 2018-12-04 20:41:54 +02:00
coderaiser
cbfce19f73 test(client) sw: register: coverage 2018-11-30 16:17:14 +02:00
coderaiser
94ad930187 feature(package) clear-module -> mock-require 2018-11-30 16:06:34 +02:00
coderaiser
afa34f7bcd test(client) dom: auto-globals 2018-11-28 11:15:24 +02:00
coderaiser
39822883d2 feature(package) auto-globals v1.7.0 2018-11-27 20:54:01 +02:00
coderaiser
0592e0f653 test(client) sw: register: auto-globals 2018-11-27 20:53:41 +02:00
coderaiser
065c2b78d5 chore(package) publishConfig: access: public 2018-11-26 21:21:57 +02:00
coderaiser
d9febd8117 feature(package) fix:lint: add eslint-remove-line 2018-11-26 21:21:48 +02:00
coderaiser
416d01f6df chore(eslint) no-multiple-empty-lines 2018-11-26 18:03:57 +02:00
coderaiser
497f7bcd40 feature(cloudcmd) sinon, sinon-called-with-diff -> @cloudcmd/stub 2018-11-23 11:55:11 +02:00
coderaiser
2f56d2b5ca test(route) realpath: error 2018-11-22 18:52:47 +02:00
coderaiser
e6195302e2 docs(readme) Docker: add -w workdir option 2018-11-22 12:13:45 +02:00
coderaiser
551f0753e8 chore(package) v11.8.2 2018-11-22 12:10:07 +02:00
coderaiser
d16e345064 fix(Dockerfile) WORKDIR (#182) 2018-11-22 12:01:14 +02:00
coderaiser
cc6e2e626b chore(package) v11.8.1 2018-11-14 18:45:33 +02:00
coderaiser
00ddcfe6f1 test(cloudcmd) before -> serve-once 2018-11-14 17:41:10 +02:00
coderaiser
2a01876c9e test(markdown) before -> serve-once 2018-11-14 17:34:42 +02:00
coderaiser
ae6936d3c2 test(route) terminal 2018-11-14 16:49:13 +02:00
coderaiser
bdf344fc2e test(plugins) description 2018-11-14 16:38:11 +02:00
coderaiser
e47d7e48d9 chore(before) rm unused 2018-11-13 16:24:58 +02:00
coderaiser
f297defea8 chore(package) nyc: exclude spec files 2018-11-13 16:24:45 +02:00
coderaiser
de3ce19eb9 test(markdown) coverage 2018-11-13 16:21:58 +02:00
coderaiser
57c57b7243 test(validate) coverage 2018-11-13 16:20:01 +02:00
coderaiser
18080f878f feature(package) pullout v3.0.0 2018-11-13 16:15:31 +02:00
coderaiser
3721e6ab40 test(plugins) options -> config 2018-11-13 15:06:50 +02:00
coderaiser
eb6a79cf97 fix(validate) corruption of config when root not found 2018-11-13 15:06:47 +02:00
coderaiser
4ff7973d43 feature(validate) root: do not validate dropbox root 2018-11-13 14:26:17 +02:00
coderaiser
4472ea7832 test(modulas) serve-once 2018-11-13 13:46:46 +02:00
coderaiser
14f0fb91ea test(plugins) serve-once 2018-11-13 12:46:49 +02:00
coderaiser
1ed504154b test(validate) rm before 2018-11-12 16:13:53 +02:00
coderaiser
8c7cd6f0de test(static) add serve-once 2018-11-12 15:54:43 +02:00
coderaiser
938938f053 docs(readme) add ` 2018-11-09 20:42:12 +02:00
coderaiser
c2bdb129e6 chore(package) v11.8.0 2018-11-09 20:36:27 +02:00
coderaiser
0908837392 feature(package) add dropbox support 2018-11-09 20:34:57 +02:00
coderaiser
ef116a9a53 test(rest) JSON.parse -> type: json 2018-11-09 14:53:20 +02:00
coderaiser
f713c24ff8 test(pack) serve-once 2018-11-09 14:53:20 +02:00
coderaiser
5505bf238d test(mv) serve-once 2018-11-09 14:53:20 +02:00
coderaiser
34b659693e chore(index) add " " 2018-11-09 14:53:20 +02:00
coderaiser
bb9dde869e test(fs) serve-once 2018-11-09 14:53:20 +02:00
coderaiser
7fc4e2f807 feature(server) add graceful shutdown 2018-11-09 14:53:15 +02:00
coderaiser
dccf79dc55 test(cp) add serve-once 2018-11-07 12:50:58 +02:00
coderaiser
a9635b49ef test(rest) config: add serve-once 2018-11-07 12:35:48 +02:00
coderaiser
d4d9a5d30f feature(package) sinon-called-with-diff v3.0.0 2018-11-05 18:44:24 +02:00
coderaiser
a6f0a8723c fix(dialog) noFiles: reject on close 2018-11-02 12:20:23 +02:00
coderaiser
8ccbff16a9 chore(package) v11.7.1 2018-11-01 19:46:34 +02:00
coderaiser
96600b6616 test(register) mock.reRequire -> reRequire 2018-11-01 19:43:32 +02:00
coderaiser
b782c0aec1 fix(cloudcmd) register service worker on http connection (#203) 2018-11-01 19:38:48 +02:00
coderaiser
7217b73e4a feature(package) criton v2.0.0 2018-11-01 12:51:44 +02:00
coderaiser
5e9db8eb3c refactor(cloudcmd) PREFIX -> prefix 2018-10-29 18:44:10 +02:00
coderaiser
6e65ad615b feature(package) eslint-plugin-node v8.0.0 2018-10-29 11:48:39 +02:00
coderaiser
9345d80b17 docs(help) example: prefix -> express mount point 2018-10-26 14:39:19 +03:00
coderaiser
f8caecf221 chore(Dockerfile) node:10 -> node 2018-10-26 11:55:04 +03:00
coderaiser
a452931ccd chore(package) v11.7.0 2018-10-25 13:12:53 +03:00
coderaiser
6348be150a chore(travis) add node v11 2018-10-25 13:04:07 +03:00
coderaiser
359a0344f8 feature(cloudcmd) add ability to set prefix for web sockets connections with --prefix-socket (#200) 2018-10-25 13:03:22 +03:00
coderaiser
63987a0585 feature(package) deepword v5.0.0 2018-10-25 12:41:19 +03:00
coderaiser
1302274bba feature(package) dword v9.0.0 2018-10-25 12:41:14 +03:00
coderaiser
c5c99a6f12 feature(package) edward v9.0.0 2018-10-25 12:41:10 +03:00
coderaiser
ded3999a12 feature(package) console-io v10.0.0 2018-10-25 12:40:59 +03:00
coderaiser
6d856d1463 feature(package) ponse v3.0.0 2018-10-24 14:49:03 +03:00
coderaiser
9450e3468b feature(package) files-io v3.0.0 2018-10-24 14:48:27 +03:00
coderaiser
96009cecd9 chore(package) v11.6.0 2018-10-23 20:04:49 +03:00
coderaiser
51ee3773f7 feature(cloudcmd) add support of express mounting point (#200) 2018-10-23 20:00:08 +03:00
coderaiser
8a92c97485 chore(package) v11.5.4 2018-10-23 17:11:32 +03:00
coderaiser
b4e2ded876 chore(cloudcmd) rm " " 2018-10-23 16:53:30 +03:00
coderaiser
9b30b0d30a feature(package) supermenu v2.1.2 2018-10-23 16:33:33 +03:00
coderaiser
35630621b6 docs(changelog) rm fix 2018-10-19 23:46:33 +03:00
coderaiser
c5cd7a2f1d feature(npmignore) add ai, cdr, eps 2018-10-19 23:39:41 +03:00
coderaiser
562c82dd62 chore(package) v11.5.3 2018-10-19 23:37:55 +03:00
coderaiser
9677dcb6bd feature(package) console-io v9.0.0 2018-10-19 23:34:28 +03:00
coderaiser
08a296b867 chore(konsole) es2018-ify 2018-10-19 20:40:00 +03:00
coderaiser
aae0025047 chore(markdown) es2018-ify 2018-10-19 20:39:45 +03:00
coderaiser
0d882d31ad chore(terminal) try-to-catch/legacy 2018-10-19 20:27:49 +03:00
coderaiser
e630e636ad chore(edit) es2018-ify 2018-10-19 20:27:15 +03:00
coderaiser
092396cc07 refactor(view) es2018-ify 2018-10-19 20:20:27 +03:00
coderaiser
0b346cc0cb chore(show-config) es2018-ify 2018-10-19 20:11:08 +03:00
coderaiser
6493cc359f feature(npmignore) add fixture 2018-10-19 20:00:31 +03:00
coderaiser
2774016518 chore(travis) add windows and osx 2018-10-19 20:00:25 +03:00
coderaiser
cfc2c84409 docs(help) status-io -> status 2018-10-19 19:07:33 +03:00
coderaiser
b7bdb67eb4 chore(package) v11.5.2 2018-10-19 14:54:31 +03:00
coderaiser
f38d6221c6 refactor(markdown) es2018-ify 2018-10-19 14:44:08 +03:00
coderaiser
b8e354b56c chore(rest) es2018-ify 2018-10-19 14:08:07 +03:00
coderaiser
1a3c535e89 chore(route) es2018-ify 2018-10-19 14:06:14 +03:00
coderaiser
d4ced2f734 fix(server) open error: exit -> warning (#196, #197, #198) 2018-10-19 13:06:36 +03:00
coderaiser
026233c804 chore(package) v11.5.1 2018-10-17 12:36:14 +03:00
coderaiser
2673e745f4 feature(olark) bower -> npm 2018-10-17 12:34:30 +03:00
coderaiser
c3dd2cb44d fix(contact) load 2018-10-17 11:45:58 +03:00
coderaiser
a2f952ff0e docs(man) --config-auth 2018-10-16 13:55:11 +03:00
coderaiser
7c9d773c73 chore(package) v11.5.0 2018-10-16 13:19:42 +03:00
coderaiser
8379a4a9bf feature(config) add ability to remove auth change from config with help of --config-auth flag 2018-10-16 13:15:56 +03:00
coderaiser
c73e4f1e29 chore(input) assign -> spread 2018-10-16 13:01:16 +03:00
coderaiser
1b8c0e2749 chore(package) v11.4.1 2018-10-16 12:49:49 +03:00
coderaiser
131b86c93a feature(package) sinon v7.0.0 2018-10-16 12:45:47 +03:00
coderaiser
51c7e414ff fix(Docker) cloudcmd_open false (#197) 2018-10-16 12:45:08 +03:00
coderaiser
ca700b82c2 chore(package) v11.4.0 2018-10-12 12:55:40 +03:00
coderaiser
8db0a03081 feature(cloudcmd) add env variable CLOUDCMD_OPEN 2018-10-12 12:54:09 +03:00
coderaiser
77862a55f6 chore(package) v11.3.1 2018-10-12 12:28:32 +03:00
coderaiser
49661297ab fix(server) crash on open error (#196) 2018-10-12 12:25:28 +03:00
coderaiser
17629f1f15 feature(cloudcmd) add unhandledRejection listener 2018-10-12 12:13:49 +03:00
coderaiser
aacf36babd feature(exit) add ability to receive error as argument 2018-10-12 12:11:15 +03:00
coderaiser
2b9fca8485 test(exit) test/server -> server/exit.spec 2018-10-12 12:04:25 +03:00
coderaiser
f4a0624470 chore(package) v11.3.0 2018-10-11 18:48:55 +03:00
coderaiser
08e5e34815 feature(img) add file-link, directory-link 2018-10-11 17:36:04 +03:00
coderaiser
846f4aa78f feature(cloudcmd) show size as <link> for links 2018-10-11 13:53:22 +03:00
coderaiser
e18ddb2e18 test(cloudfunc) clear-module -> mock-require 2018-10-10 12:57:09 +03:00
coderaiser
52ffc2ac28 feature(cloudcmd) readify: add support of links 2018-10-10 12:57:06 +03:00
coderaiser
03685ee390 feature(package) nomine v3.0.0 2018-10-10 12:31:28 +03:00
coderaiser
4428cc2232 feature(package) restafary v5.0.0 2018-10-10 11:58:00 +03:00
coderaiser
1e40d759fe feature(package) flop v6.0.0 2018-10-10 11:40:50 +03:00
coderaiser
485ba7b8ac feature(package) currify v3.0.0 2018-10-09 16:05:39 +03:00
coderaiser
901f75a499 chore(package) v11.2.3 2018-10-04 14:43:11 +03:00
coderaiser
4091346ae3 docs(readme) report -> import 2018-10-04 14:31:20 +03:00
coderaiser
e4d22db19d chore(package) rm babel-eslint 2018-10-04 13:54:12 +03:00
coderaiser
399e9c8f1d feature(package) rm unused join-io 2018-10-02 18:11:20 +03:00
coderaiser
828830c660 feature(package) apart v2.0.0 2018-10-02 13:42:06 +03:00
coderaiser
331952a8f5 chore(distribute) rm apply 2018-10-02 13:11:51 +03:00
coderaiser
9c2ed05bab feature(server) callback -> await 2018-10-02 12:48:11 +03:00
coderaiser
d72ff58fe7 chore(exit) es2018-ify 2018-10-02 12:19:45 +03:00
coderaiser
b94cd7d1a1 chore(package) v11.2.2 2018-09-28 18:15:33 +03:00
coderaiser
b5f9261504 fix(cloudcmd) prefix with leading slash (#195) 2018-09-28 18:12:50 +03:00
coderaiser
15abceefeb chore(package) v11.2.1 2018-09-28 14:09:47 +03:00
coderaiser
421b860da5 fix(sw) cache favicon.ico from root (#194) 2018-09-28 14:03:27 +03:00
coderaiser
03fda24c03 feature(package) onezip v3.0.0 2018-09-28 13:49:55 +03:00
coderaiser
207c9dde45 chore(package) v11.2.0 2018-09-28 12:59:36 +03:00
coderaiser
f070833144 feature(package) inly v3.0.0 2018-09-28 12:52:57 +03:00
coderaiser
5048a20760 feature(package) jaguar v5.0.0 2018-09-28 12:42:51 +03:00
coderaiser
3ef7ba9fdf feature(cloudcmd) add --terminal-auto-restart 2018-09-28 11:19:54 +03:00
coderaiser
91ab03c0ed chore(config) saveData -> save 2018-09-27 18:36:31 +03:00
coderaiser
f1c8082252 docs(help) add `CLOUDCMD_TERMINAL_COMMAND 2018-09-27 18:32:15 +03:00
coderaiser
d367eb46f0 chore(package) v11.1.0 2018-09-27 18:13:58 +03:00
coderaiser
ecea6c04e9 chore(stylelint) max-empty-lines 2018-09-27 17:18:04 +03:00
coderaiser
60ee31a074 feature(package) redrun v7.0.0 2018-09-27 17:05:05 +03:00
coderaiser
9218553df5 feature(package) @cloudcmd/read-files-sync v2.0.0 2018-09-27 13:58:57 +03:00
coderaiser
7d552b4089 feature(cloudcmd) --terminal-command: command to run in terminal (shell by default) 2018-09-27 13:50:17 +03:00
coderaiser
8660c06097 feature(package) gritty v4.0.0 2018-09-27 11:13:47 +03:00
coderaiser
3e7021b93e feature(package) console-io v8.0.0 2018-09-27 11:10:36 +03:00
coderaiser
5dc31e46bf chore(package) v11.0.0 2018-09-26 18:33:14 +03:00
coderaiser
ba760ab52b feature(package) babel-eslint v10.0.0 2018-09-26 18:29:36 +03:00
coderaiser
bd33a9d1df feature(package) deepword v4.0.0 2018-09-26 18:29:36 +03:00
coderaiser
500cfafca3 feature(package) edward v8.0.0 2018-09-26 18:29:36 +03:00
coderaiser
f7b39ab754 feature(package) dword v8.0.0 2018-09-26 18:29:36 +03:00
coderaiser
5c2c5321bc feature(package) restafary v4.0.0 2018-09-26 18:29:36 +03:00
coderaiser
217f3112e4 feature(package) flop v5.0.0 2018-09-26 18:29:36 +03:00
coderaiser
add71a9a7e feature(package) @cloudcmd/fileop v2.0.0 2018-09-26 18:29:36 +03:00
coderaiser
ec97df9a59 feature(package) @cloudcmd/move-files v2.0.1 2018-09-26 18:29:36 +03:00
coderaiser
1705fb7b80 feature(package) copymitter v4.0.2: add ability to copy symlinks (#191) 2018-09-26 18:28:29 +03:00
coderaiser
a232da999d chore(cloudcmd) es2018-ify 2018-09-26 18:04:00 +03:00
coderaiser
d3b965ec38 refactor(config) patch: then -> await 2018-09-26 15:36:33 +03:00
coderaiser
4a8b6e4f66 chore(view) rm dead code 2018-09-26 12:52:45 +03:00
coderaiser
33828dd155 feature(config) disable online by default 2018-09-26 12:32:33 +03:00
coderaiser
63a0c1e806 feature(config) enable open by default 2018-09-26 12:32:33 +03:00
coderaiser
1865b26b58 feature(package) set engine to node v8.0.0 LTS 2018-09-26 12:32:15 +03:00
coderaiser
a1a8f90fdb feature(package) package-json v5.0.0 2018-09-26 12:32:15 +03:00
coderaiser
432c571f55 feature(server) drop support of VCAP_APP_PORT 2018-09-26 12:32:15 +03:00
coderaiser
abc6f7b22e feature(cloudcmd) showUpdateInfo: rm rendy 2018-09-25 19:04:04 +03:00
coderaiser
da5bf3ce40 feature(package) squad v3.0.0 2018-09-24 22:45:13 +03:00
coderaiser
3eb3976b54 chore(package) v10.8.2 2018-09-21 18:48:01 +03:00
coderaiser
0c5bde5a89 fix(distribute) export: config 2018-09-21 18:41:49 +03:00
coderaiser
2d7722c19f fix(sw) register: null -> stub 2018-09-21 18:33:48 +03:00
coderaiser
95c160ca55 chore(now) add man 2018-09-21 17:22:52 +03:00
coderaiser
df302a799c chore(now) add export 2018-09-21 17:17:05 +03:00
coderaiser
5818cd4375 chore(package) v10.8.1 2018-09-20 17:03:19 +03:00
coderaiser
2ed62021f6 fix(view) change elements position when open image 2018-09-20 13:38:29 +03:00
coderaiser
8872d419e2 docs(readme) Orthodox web file manager -> File manager for the web 2018-09-19 17:50:31 +03:00
coderaiser
434b0f30e8 chore(package) v10.8.0 2018-09-19 17:18:18 +03:00
coderaiser
f20a781c0b feature(package) load -> load.js + @cloudcmd/create/element 2018-09-19 12:51:25 +03:00
coderaiser
8ab8adb400 feature(cloudcmd) rm jquery 2018-09-19 12:51:25 +03:00
coderaiser
ec2591bff2 chore(terminal) rm additional element 2018-09-17 14:48:41 +03:00
coderaiser
4cb8a57494 chore(package) v10.7.0 2018-09-14 12:37:22 +03:00
coderaiser
35d5e36421 feature(view) fancybox -> @cloudcmd/modal 2018-09-14 12:34:54 +03:00
coderaiser
99a93d77b3 fix(cloudcmd) onUpdateFound: doubled prefix for cloudcmd.common.js (#188) 2018-09-14 10:30:47 +03:00
coderaiser
d0f528892b chore(webpack) simplify build from symlinks 2018-09-14 10:30:28 +03:00
coderaiser
2d7b97986f chore(package) v10.6.0 2018-09-10 15:26:23 +03:00
coderaiser
537c303a18 feature(events) add ability to remove all added listeners 2018-09-10 14:55:08 +03:00
coderaiser
a7ac83cbd3 feature(cloudcmd) add ability update cloudcmd without page reload 2018-09-10 14:43:16 +03:00
coderaiser
3db3e61e81 chore(cloudcmd) add " " 2018-09-10 13:01:59 +03:00
coderaiser
507054c9ff test(route) no one file panel 2018-09-10 12:59:51 +03:00
coderaiser
de42d38b31 test(route) one panel mode -> one file panel 2018-09-10 12:58:34 +03:00
coderaiser
2935181452 fix(view) title: xss 2018-09-10 12:53:41 +03:00
coderaiser
f04808c709 feature(cloudcmd) add --show-file-name to add file name title in view and edit (#183) 2018-09-10 12:13:49 +03:00
coderaiser
ce0938ea11 docs(readme) add --no-show-config 2018-09-10 11:52:39 +03:00
coderaiser
c356bc76f4 fix(sw) navigation error 2018-09-10 11:27:27 +03:00
coderaiser
adbfb95012 chore(package) v10.5.3 2018-09-08 21:35:48 +03:00
coderaiser
dd7e94cde8 fix(webpack) css: font resource ignores prefix setting (#185) 2018-09-08 20:59:55 +03:00
coderaiser
e337a34cd7 chore(sw) rm unused isBasic 2018-09-08 20:59:55 +03:00
coderaiser
98be918c0f refactor(sw) move out url checks from fetch 2018-09-08 20:59:50 +03:00
coderaiser
3778c80fd6 test(config) before -> connect 2018-09-08 00:00:19 +03:00
coderaiser
58986eb52e fix(sw) no auth dialog when serve by service worker 2018-09-07 23:59:29 +03:00
coderaiser
ef0a14ba63 chore(webpack) js: add support of spread in sw 2018-09-07 23:59:29 +03:00
coderaiser
6e9acd781f fix(sw) http auth 2018-09-07 23:59:29 +03:00
coderaiser
6cbdddcd61 feature(package) babel-loader v8.0.0 2018-09-07 20:21:56 +03:00
coderaiser
03977fb928 feature(package) babel v7.0.0 2018-09-07 20:21:24 +03:00
coderaiser
aaecb99d36 feature(package) table v5.0.2 2018-09-07 20:19:23 +03:00
coderaiser
4981220d83 feature(package) style-loader v0.23.0 2018-09-07 20:18:03 +03:00
coderaiser
ed7255ea0e feature(package) nyc v13.0.1 2018-09-07 20:17:10 +03:00
coderaiser
a0a85df559 feature(package) babel-eslint v9.0.0 2018-09-07 20:17:00 +03:00
coderaiser
b1c4d5bad0 docs(help) add "--" 2018-08-25 13:49:48 +03:00
coderaiser
0e8e1edb8e docs(readme) add " " 2018-08-25 13:48:33 +03:00
coderaiser
f0bfc6cbf8 chore(package) v10.5.2 2018-08-25 13:45:40 +03:00
coderaiser
8b10dd3e3d fix(konsole) try to load console.js when console is disabled 2018-08-25 13:32:14 +03:00
coderaiser
c0ff6d7e08 chore(package) v10.5.1 2018-08-25 13:20:04 +03:00
coderaiser
7981d4a257 fix(log) makeColor: mac os 2018-08-24 23:27:38 +03:00
coderaiser
c83cbeeb22 feature(export) add config send log 2018-08-24 19:19:25 +03:00
coderaiser
3250c07a16 refactor(import) squad 2018-08-24 19:12:33 +03:00
coderaiser
954db9ad07 test(console) rm enabled by default 2018-08-24 19:11:51 +03:00
coderaiser
c1e5b5b1e5 docs(readme) localhost -> 127.0.0.1 2018-08-23 23:40:20 +03:00
coderaiser
e5f9b50d21 chore(now) cloudcmd_import_url 2018-08-23 22:59:46 +03:00
coderaiser
c9e9dd2854 chore(package) v10.5.0 2018-08-23 22:45:13 +03:00
coderaiser
1ca08c33fd docs(readme) add " " 2018-08-23 22:44:13 +03:00
coderaiser
5daf1124a1 fix(edit-file) multiple f4 2018-08-23 22:44:13 +03:00
coderaiser
9d7d66fc99 chore(now) add quotes 2018-08-23 22:44:13 +03:00
coderaiser
62412c6d9f chore(appveyor) true 2018-08-23 22:44:13 +03:00
coderaiser
6f1c834e48 chore(now) import token 2018-08-23 22:44:13 +03:00
coderaiser
ecfb4ff31e fix(config) init: load when configDialog disabled 2018-08-23 22:44:13 +03:00
coderaiser
76368ca861 fix(name-size-date) .name width 2018-08-23 22:44:13 +03:00
coderaiser
3b6788fc16 chore(package) rm redundant heroku-postbuild 2018-08-23 22:44:13 +03:00
coderaiser
4887224e45 chore(dom) rm unused 2018-08-23 22:44:13 +03:00
coderaiser
9d20120497 fix(listeners) isNoCurrent: can not go to root when root is empty 2018-08-23 22:44:13 +03:00
coderaiser
2ad2fc4023 feature(distribute) add ability to import config from remote export server 2018-08-23 22:44:10 +03:00
coderaiser
b8e4f9659a feature(package) file-loader v2.0.0 2018-08-23 12:12:47 +03:00
coderaiser
571df9cd06 feature(package) watch:lint:server 2018-08-21 18:27:42 +03:00
coderaiser
3a740330ec test(static) before -> connect 2018-08-20 13:16:52 +03:00
coderaiser
46c6ca51cf test(config) test/config -> server/config.spec 2018-08-20 00:30:46 +03:00
coderaiser
eb11192ab7 chore(images) rm unused CloudCmd 2018-08-20 00:28:18 +03:00
coderaiser
2d5453a532 chore(info) rm "\n" 2018-08-18 22:28:38 +03:00
coderaiser
7173808ce4 feature(package) add watch:test:server 2018-08-18 22:28:24 +03:00
coderaiser
c731f706f8 refactor(cloudcmd) showUpdateInfo: early return 2018-08-18 22:26:29 +03:00
coderaiser
b965ae338c chore(config) reconnectionDelay 2018-08-16 22:48:48 +03:00
coderaiser
d4f2308d77 chore(images) rm log 2018-08-16 22:30:17 +03:00
coderaiser
f0a1721069 fix(client) parallel -> series: route 2018-08-16 22:26:40 +03:00
coderaiser
c054033c54 chore(index) add quotes 2018-08-16 22:25:58 +03:00
coderaiser
441d8ed35e refactor(route) indexProcessing: noKeysPanel 2018-08-16 22:25:31 +03:00
coderaiser
7643d11f74 feature(package) yaspeller v5.0.0 2018-08-13 14:22:56 +03:00
coderaiser
ab3a53a4ec feature(package) style-loader v0.22.0 2018-08-08 11:19:56 +03:00
coderaiser
a69f639541 docs(readme) badges: rm: npm, dependencies 2018-08-06 15:09:16 +03:00
coderaiser
0471d99d13 feature(package) serviceworker-webpack-plugin v1.0.1 2018-08-03 11:43:22 +03:00
coderaiser
4c453e22be test(dom) isContainClass 2018-07-25 18:49:27 +03:00
coderaiser
2ad777025a chore(now) add cssnano.config.js 2018-07-20 14:15:37 +03:00
coderaiser
22da4860f7 chore(package) v10.4.1 2018-07-18 14:35:01 +03:00
coderaiser
0e14b02109 fix(img) loading: svg minify 2018-07-18 12:11:56 +03:00
coderaiser
e034f7c1b6 docs(readme) rm license badge 2018-07-17 13:03:20 +03:00
coderaiser
279fff4395 chore(package) v10.4.0 2018-07-17 12:53:37 +03:00
coderaiser
13d501b75b feature(package) engines: node v4.5.0 2018-07-17 12:47:47 +03:00
coderaiser
3b6f5a0abf feature(package) eslint-plugin-node v7.0.0 2018-07-17 12:41:26 +03:00
coderaiser
d5266070e7 fix(sw) cache of 401 2018-07-17 12:27:10 +03:00
coderaiser
def7a08855 feature(package) @cloudcmd/clipboard v1.0.2 2018-07-16 17:12:44 +03:00
coderaiser
619e0828af fix(polyfill) scrollIntoViewIfNeeded in firefox 2018-07-16 16:07:04 +03:00
coderaiser
6957a876e8 chore(listeners) add "," 2018-07-16 15:56:52 +03:00
coderaiser
75bbb2399c feature(package) rm unused html-webpack-exclude-assets-plugin 2018-07-16 14:32:16 +03:00
coderaiser
c7baed8395 feature(package) gritty v3.0.0 2018-07-16 14:21:04 +03:00
coderaiser
c02b4e35ba feature(package) optimize-css-assets-webpack-plugin v5.0.0 2018-07-16 11:39:07 +03:00
coderaiser
f32c6fcac8 feature(package) @cloudcmd/clipboard v1.0.1 2018-07-13 14:21:03 +03:00
coderaiser
e77d995b35 feature(package) clear-module v3.0.0 2018-07-12 11:38:08 +03:00
coderaiser
e40d03114f feature(package) smalltalk v3.1.0 2018-07-10 17:43:46 +03:00
coderaiser
4e332163e2 feature(package) css-loader v1.0.0 2018-07-09 12:46:33 +03:00
coderaiser
df59469aa3 feature(Dockerfile) mhart/alpine-node -> node:alpine 2018-07-05 16:16:29 +03:00
coderaiser
bf8523b948 docs(readme) badges: flat -> flat-square 2018-07-05 13:52:24 +03:00
coderaiser
ff9eccc38c chore(package) v10.3.2 2018-07-02 14:04:23 +03:00
coderaiser
48779742e3 fix(terminal) prevent init when config disabled 2018-07-02 12:41:47 +03:00
coderaiser
01a09a5f90 test(vim) coverage 2018-07-02 11:41:38 +03:00
coderaiser
aacb1af6b5 fix(operation) next current file after delete 2018-07-01 22:24:24 +03:00
coderaiser
ae468b4de5 fix(key) vim: do not react on navigation after view hide 2018-07-01 21:45:38 +03:00
coderaiser
fc8cbf0f07 feature(package) codegen.macro v3.0.0 2018-06-29 11:52:12 +03:00
coderaiser
af4df5e64f test(vim) mv out from test 2018-06-27 17:39:59 +03:00
coderaiser
0732063e18 chore(package) v10.3.1 2018-06-25 11:49:11 +03:00
coderaiser
374d96053b fix(npmignore) rm dist*/modules 2018-06-25 11:33:01 +03:00
coderaiser
872e4b17b4 feature(package) eslint v5.0.0 2018-06-25 10:42:47 +03:00
coderaiser
467d862215 chore(package) v10.3.0 2018-06-22 17:13:52 +03:00
coderaiser
e91620d17f fix(operation) set next file current when can not delete 2018-06-22 17:11:40 +03:00
coderaiser
37d0d70482 feature(webpack) minimize service worker size 2018-06-22 16:45:49 +03:00
coderaiser
dc781447a8 feature(terminal) move out terminal.css from view.css 2018-06-22 16:43:41 +03:00
coderaiser
15e5fb6951 chore(babel) fast-async: generators -> promises 2018-06-22 16:17:24 +03:00
coderaiser
133c1484f6 feature(package) fast-async v7.0.6 2018-06-22 15:51:29 +03:00
coderaiser
3e310724ff feature(cloudcmd) import -> load.js 2018-06-22 11:22:42 +03:00
coderaiser
4b528280ba feature(load-module) add 2018-06-22 11:07:03 +03:00
coderaiser
146b32b215 chore(package) v10.2.3 2018-06-21 20:44:42 +03:00
coderaiser
1330acbf22 fix(cloudcmd) env variables override (#179) 2018-06-21 17:51:15 +03:00
coderaiser
5592e9dba5 feature(upload-files) add ability to show error message 2018-06-19 15:36:45 +03:00
coderaiser
75f6fac284 fix(sw) register when prefix changed 2018-06-19 15:00:54 +03:00
coderaiser
71c65d7354 refactor(load-remote) wraptile 2018-06-15 14:39:06 +03:00
coderaiser
040b45394a feature(gitignore) add jquery-mouse-wheel 2018-06-15 14:17:51 +03:00
coderaiser
aa645cdfd2 chore(package) v10.2.2 2018-06-15 12:26:41 +03:00
coderaiser
153e2a63e0 test(rest) coverage 2018-06-15 11:26:00 +03:00
coderaiser
fa619b59d6 fix(config) set file mode permissions to readable only by current user (#61) 2018-06-14 16:11:02 +03:00
coderaiser
255621073d chore(package) v10.2.1 2018-06-13 17:32:05 +03:00
coderaiser
5580bcde0b fix(style) .fm: scrolling on ios 2018-06-13 16:31:44 +03:00
coderaiser
97c50d588f feature(dom) touchstart: set passive listener
https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
2018-06-13 12:17:24 +03:00
coderaiser
aa8916aea5 feature(package) format-io v1.0.0 2018-06-12 15:27:35 +03:00
coderaiser
9bc578fbbe docs(readme) add screenshot 2018-06-12 10:40:09 +03:00
coderaiser
d3cbd442e7 feature(package) add domtokenlist-shim from npm 2018-06-11 18:16:22 +03:00
coderaiser
1ce28fd500 feature(polyfill) add scroll-into-view-if-needed polyfill from npm 2018-06-11 18:02:35 +03:00
coderaiser
e12359fdaa chore(package) v10.2.0 2018-06-11 17:33:31 +03:00
coderaiser
9feb4f0fcd chore(package) rm prewisdom 2018-06-11 17:32:52 +03:00
coderaiser
cfa7a8b640 feature(cloudcmd) add ability to set current file closer to removed files 2018-06-11 15:59:41 +03:00
coderaiser
0202192fc0 feature(client) add ability to clear localStorage on logOut 2018-06-11 15:20:48 +03:00
coderaiser
76c3db3e5f feature(package) sinon v6.0.0 2018-06-11 11:01:31 +03:00
coderaiser
37a6ee08dc chore(package) v10.1.2 2018-06-09 11:42:37 +03:00
coderaiser
55488ae292 fix(dom) saveDataToStorage, getDataFromStorage: localStorage option check (#177) 2018-06-09 11:37:41 +03:00
coderaiser
a5c7db711c chore(package) v10.1.1 2018-06-08 17:08:57 +03:00
coderaiser
62d6095edb fix(menu) initial position 2018-06-08 16:52:37 +03:00
coderaiser
9f653d0371 chore(webpack) rm comment 2018-06-08 16:31:02 +03:00
coderaiser
d401a6c33b refactor(client) rm applyConstructor 2018-06-08 16:06:01 +03:00
coderaiser
2239f47d45 chore(package) v10.1.0 2018-06-07 19:33:21 +03:00
coderaiser
f7f0b07361 refactor(menu) rm Loading 2018-06-07 19:32:29 +03:00
coderaiser
d43e0b3e59 fix(operation) deleteSilent: refresh: on error -> always 2018-06-07 11:57:38 +03:00
coderaiser
c015ce6ce3 feature(edit-names-vim) add 2018-06-07 11:57:34 +03:00
coderaiser
772b82857b chore(edit-names) rm duplicate hide 2018-06-07 11:16:50 +03:00
coderaiser
e2cdcbd5ce fix(edit-file-vim) check is file changed on close 2018-06-06 17:04:39 +03:00
coderaiser
b5ff6695e1 feature(package) pullout v2.0.0 2018-06-06 11:43:54 +03:00
coderaiser
8f5d7f1e7f fix(sw) "only-if-cached" can be set only with "same-origin" mode 2018-06-05 18:07:31 +03:00
coderaiser
70e6836f35 test(register) add 2018-06-05 14:34:55 +03:00
coderaiser
40bf54aec1 chore(client) createFileTable: shorthand properties 2018-06-05 10:56:43 +03:00
coderaiser
3a46607c0f chore(package) v10.0.3 2018-06-04 16:36:05 +03:00
coderaiser
11eb619fc6 fix(index) zoom on tap 2018-06-04 14:52:36 +03:00
coderaiser
54ce29d33e fix(client) logout: servicer worker: unregister 2018-06-04 14:43:16 +03:00
coderaiser
82807b2c5c chore(sw) onFetch console.error: e -> e, pathname 2018-06-04 11:24:48 +03:00
coderaiser
ddd44e7753 feature(package) webpack-cli v3.0.1 2018-06-04 10:57:51 +03:00
coderaiser
e5d2f75606 feature(rest) add memory info 2018-06-01 16:31:34 +03:00
coderaiser
9da17585e8 feature(package) babel v7 2018-06-01 16:31:30 +03:00
coderaiser
20185d0fad feature(package) nyc v12.0.1 2018-06-01 14:09:36 +03:00
coderaiser
accdcc885d test(cloudcmd) sw 2018-05-31 13:54:28 +03:00
coderaiser
0323dd3a91 feature(cloudcmd) pullout/legacy -> pullout 2018-05-31 13:43:07 +03:00
coderaiser
293e8eb6c5 feature(package) nomine v2.0.0 2018-05-31 11:51:52 +03:00
coderaiser
b175ea18e2 chore(edit-names) shorthand properties 2018-05-31 11:27:19 +03:00
coderaiser
2fb5bc8f5b refactor(client) loadStyle: plugins -> name 2018-05-30 17:21:53 +03:00
coderaiser
90c96791be refactor(sw) add directory 2018-05-29 17:48:19 +03:00
coderaiser
ff9834cf24 chore(package) v10.0.2 2018-05-29 17:12:11 +03:00
coderaiser
530d0ee14c fix(listeners) copyPath 2018-05-29 16:54:38 +03:00
coderaiser
4aedc1d481 fix(font) copy path 2018-05-29 16:42:03 +03:00
coderaiser
950e54c990 docs(help) heroku: http -> https 2018-05-29 16:32:24 +03:00
coderaiser
b2960285bf chore(package) v10.0.1 2018-05-29 16:29:36 +03:00
coderaiser
ad7f7fcc37 fix(font) terminal icon 2018-05-29 15:09:13 +03:00
coderaiser
2fc08a1c6c docs(readme) heroku url: http -> https 2018-05-29 14:27:06 +03:00
coderaiser
3954bbe862 chore(Dockerfile) node v10 2018-05-29 10:55:08 +03:00
coderaiser
2d028b4969 chore(package) v10.0.0 2018-05-25 18:06:23 +03:00
coderaiser
93047e67c0 chore(tmpl) rm htmlDialogs 2018-05-25 17:47:17 +03:00
coderaiser
66ef51a47d chore(help) rm --cache, --no-cache 2018-05-25 17:45:58 +03:00
coderaiser
4dd54bab8e chore(app) rm duplicate CLOUDCMD_ONE_FILE_PANEL 2018-05-25 17:26:07 +03:00
coderaiser
a2416003d6 chore(cloudcmd) rm unused 2018-05-25 17:03:32 +03:00
coderaiser
7e14d61a34 feature(cloudcmd) --one-panel-mode -> --one-file-panel 2018-05-25 17:03:32 +03:00
coderaiser
0cb953af85 feature(cloudcmd) clear storage -> copy path (#173) 2018-05-25 17:03:07 +03:00
coderaiser
dc781a04c0 feature(config) rm option: htmlDialogs 2018-05-25 16:18:37 +03:00
coderaiser
234f7bcac0 feature(cloudcmd) add service worker 2018-05-25 15:59:22 +03:00
coderaiser
58c10e201a feature(config) rm option: cache 2018-05-25 15:50:23 +03:00
coderaiser
28892b3933 feature(cloudcmd) rm option: localStorage 2018-05-25 15:50:16 +03:00
coderaiser
62f166f15c chore(package) v9.6.0 2018-05-24 17:14:53 +03:00
coderaiser
a193943480 fix(docker) node v10.1 2018-05-24 17:03:25 +03:00
coderaiser
dee8810f3a feature(cloudcmd) rm global window.exec 2018-05-24 14:56:06 +03:00
coderaiser
16905fd42c feature(package) rm vulnerable fresh-require 2018-05-23 14:19:51 +03:00
coderaiser
979a8f32dc feature(package) rm vulnerable nsp 2018-05-23 14:19:51 +03:00
coderaiser
4118f90b6b fix(current-file) getParrentDirPath: path contains "+++" 2018-05-23 14:19:42 +03:00
coderaiser
550f76461e refactor(current-file) mv getParentDirPath 2018-05-23 10:03:06 +03:00
coderaiser
b3fbba10b2 feature(terminal) set fontFamily 2018-05-22 16:52:04 +03:00
coderaiser
e5526572ac feature(modules) socket.io v2.1.1 2018-05-22 11:52:12 +03:00
coderaiser
5944521719 test(rest) mv: rename 2018-05-16 13:53:11 +03:00
coderaiser
835717a084 docs(help) local storage: deprecated 2018-05-15 18:11:22 +03:00
coderaiser
907b0aacdf chore(package) v9.5.0 2018-05-15 18:08:34 +03:00
coderaiser
e77e2dbcce feature(cloudcmd) deprecate localStorage 2018-05-15 18:07:17 +03:00
coderaiser
d6c3a240b5 feature(key) add ability to copy path with help of Ctrl + p 2018-05-15 17:33:14 +03:00
coderaiser
f98027e64b fix(server) mv: rename file 2018-05-15 16:49:36 +03:00
coderaiser
c45ddd7c7c chore(gitignore) add yarn.lock 2018-05-14 12:07:07 +03:00
coderaiser
0f3692928a chore(files) function -> arrow 2018-05-12 12:05:35 +03:00
coderaiser
5f86875ef2 docs(readme) rm duplicate CLOUDCMD_CONFIG_DIALOG 2018-05-12 12:00:45 +03:00
coderaiser
2e0f8604e5 fix(cloudcmd) choose 2018-05-11 18:26:44 +03:00
coderaiser
2c5ef742cc chore(travis) rm node v9 2018-05-11 18:17:58 +03:00
coderaiser
cdc7fed69c test(cloudcmd) deprecate: one panel mode 2018-05-11 18:08:06 +03:00
coderaiser
24ef843b65 chore(vim) rm "\n" 2018-05-11 18:07:49 +03:00
coderaiser
9b2c276036 test(package) gritty: terminal enabled 2018-05-11 15:33:17 +03:00
coderaiser
9c18764178 feature(env) return boolean only 2018-05-11 13:12:10 +03:00
coderaiser
4e99372e6f feature(cloudcmd) move out dist from route 2018-05-11 13:06:31 +03:00
coderaiser
bb44a14780 refactor(listeners) isNoCurrent 2018-05-11 10:24:14 +03:00
coderaiser
493edf8cc5 fix(konsole) Ctrl + P: paste current directory path 2018-05-11 10:14:49 +03:00
coderaiser
c25dd8d774 fix(operation) set moveFn to RESTful.mv on disconnect 2018-05-10 16:16:49 +03:00
coderaiser
6e4115a8d0 docs(readme) gemnasium -> david 2018-05-10 10:29:05 +03:00
coderaiser
40f86c1b5a chore(package) v9.4.0 2018-05-08 16:17:13 +03:00
coderaiser
f1bc32617d chore(travis) rm allow failures 2018-05-08 16:12:37 +03:00
coderaiser
e10eab4de4 chore(travis) script: set series 2018-05-08 16:12:07 +03:00
coderaiser
f92964f578 chore(rest) rm " " 2018-05-08 16:12:07 +03:00
coderaiser
9963577a65 feature(cloudcmd) deprecate --one-panel-mode in favour --one-file-panel 2018-05-08 16:12:04 +03:00
coderaiser
697df5846f feature(cloudcmd) add ability to show progress on move (#157) 2018-05-08 11:16:55 +03:00
coderaiser
c793082ec8 test(terminal) enabled: no string 2018-05-08 10:32:36 +03:00
coderaiser
1b7811c185 feature(package) rm checkup 2018-05-04 16:14:09 +03:00
coderaiser
fe00e26cc7 refactor(rest) currify -> wraptile 2018-05-04 16:14:00 +03:00
coderaiser
d54ba5e25f feature(package) wraptile v2.0.0 2018-05-03 20:01:34 +03:00
coderaiser
aba4dbec0a fix(name-size) margin-right: 0 2018-05-02 20:36:03 +03:00
coderaiser
7ee202d666 feature(package) ponse v2.0.0 2018-05-02 15:00:05 +03:00
coderaiser
0c7b727c9f feature(package) onezip v2.0.0 2018-05-02 14:40:37 +03:00
coderaiser
03a27ecaa9 feature(package) jaguar v4.0.0 2018-05-02 14:39:03 +03:00
coderaiser
6ffd299343 feature(package) files-io v2.0.0 2018-05-02 14:38:52 +03:00
coderaiser
a494028746 feature(package) inly v2.0.0 2018-05-02 14:38:42 +03:00
coderaiser
3425b58855 chore(package) v9.3.2 2018-05-01 22:00:10 +03:00
coderaiser
8adca517ce feature(package) clean-css-loader v1.0.1 2018-05-01 21:56:54 +03:00
coderaiser
5acf252c45 fix(cloudcmd) cyrillic symbols in names 2018-05-01 21:56:14 +03:00
coderaiser
88acb4c9a8 test(terminal) enabled 2018-05-01 21:56:14 +03:00
coderaiser
2ba0fffe85 feature(package) copymitter v3.0.0: improved copy accuracy (#157) 2018-05-01 21:56:06 +03:00
coderaiser
b6e046f223 fix(operation) update file list after error on copy 2018-05-01 13:05:04 +03:00
coderaiser
7163f2df4e docs(readme) gitter url: cloudcmd -> cloudcmd/hello 2018-04-30 20:29:10 +03:00
coderaiser
da25d21898 docs(help) comments: multiline -> one line 2018-04-30 20:14:49 +03:00
coderaiser
4a78738b2a chore(package) v9.3.1 2018-04-30 13:48:49 +03:00
coderaiser
56c16666c3 chore(travis) add allow-failures 2018-04-30 13:36:47 +03:00
coderaiser
7978318992 feature(package) sinon v5.0.1 2018-04-30 13:19:26 +03:00
coderaiser
10ed681608 test(current-file) add 2018-04-30 13:19:22 +03:00
coderaiser
f9075ce252 refactor(listeners) decodePath 2018-04-30 12:57:00 +03:00
coderaiser
753db12b2d fix(listeners) onPathElementClick: empty space (#171) 2018-04-30 12:30:21 +03:00
coderaiser
20afb1c1c9 chore(shell) rm redundant 2018-04-30 12:09:11 +03:00
coderaiser
942fa6ff6e feature(travis) node_js: add 10 2018-04-30 11:24:24 +03:00
coderaiser
f11b22d248 feature(docker) node v10 2018-04-30 11:24:03 +03:00
coderaiser
6b3283e5b2 chore(package) v9.3.0 2018-04-27 17:06:49 +03:00
coderaiser
f604927cb6 feature(package) smalltalk: bower -> npm 2018-04-27 17:04:39 +03:00
coderaiser
9f0d3b2c4e feature(modules) menu-io -> supermenu 2018-04-27 15:22:24 +03:00
coderaiser
b7262f954b feature(package) rendy v2.0.0 2018-04-26 12:11:55 +03:00
coderaiser
44f5a062f7 chore(package) v9.2.0 2018-04-25 17:19:27 +03:00
coderaiser
396919fe6c test(route) render ddos 2018-04-25 17:17:49 +03:00
coderaiser
6a67e57344 test(cloudfunc) readFilesSync 2018-04-25 17:16:53 +03:00
coderaiser
5479dce7da feature(cloudcmd) add ability to use not only alphabet and number symbols (#167) 2018-04-25 17:16:50 +03:00
coderaiser
48c36eb5d3 fix(client) when password changed console and terminal can not authenticate when auth enabled 2018-04-24 10:54:02 +03:00
coderaiser
183700a7d4 test(route) encode 2018-04-23 17:25:43 +03:00
coderaiser
9dcbd7790d chore(package) v9.1.6 2018-04-23 17:23:00 +03:00
coderaiser
23f4d4702c fix(cloudfunc) XSS vulnerability: html in file name: allows executing malicious javascript code in the user's browser 2018-04-23 17:05:14 +03:00
coderaiser
c413d0ba6e feature(entity) add &quot; 2018-04-23 17:04:59 +03:00
coderaiser
44e2ec7f90 chore(cloudcmd) rm redundant 2018-04-23 16:43:31 +03:00
coderaiser
55c5375067 feature(package) add prewisdom 2018-04-20 15:14:36 +03:00
coderaiser
7a4a277aad chore(eslintrc) server: quotes 2018-04-20 15:06:29 +03:00
coderaiser
9bda8031d0 test(console) before -> connect 2018-04-20 15:02:21 +03:00
coderaiser
8ab347f262 test(modules) before -> connect 2018-04-20 14:26:43 +03:00
coderaiser
59d9dc2275 chore(package) v9.1.5 2018-04-19 18:31:23 +03:00
coderaiser
9fe2bdee0a fix(terminal) rows and cols 2018-04-19 18:26:27 +03:00
coderaiser
05af6770b2 fix(wepback) js: devtoolModuleFilenameTemplate 2018-04-19 18:08:11 +03:00
coderaiser
33b8e65002 feature(package) style-loader v0.21.0 2018-04-19 11:43:45 +03:00
coderaiser
11184ae086 test(validate) root: before -> connect 2018-04-19 11:43:35 +03:00
coderaiser
446095591b test(route) promise -> await 2018-04-18 14:49:25 +03:00
coderaiser
9632b671be feature(travis) node_js: rm 6 2018-04-18 14:34:47 +03:00
coderaiser
b5b6931e6b fix(now) files: add .webpack 2018-04-17 14:34:04 +03:00
coderaiser
34041bb6d2 chore(package) v9.1.4 2018-04-17 11:24:42 +03:00
coderaiser
7745fb0e9b test(before) add connect 2018-04-17 11:21:46 +03:00
coderaiser
c7f14d37e9 test(route) sendIndex: coverage 2018-04-17 11:03:13 +03:00
Matt Hoover
2008f55166 fix(download) download files with "#" in name (#80) 2018-04-17 09:46:50 +03:00
coderaiser
fb79abcab7 chore(package) v9.1.3 2018-04-16 10:25:48 +03:00
coderaiser
cb0494d2dc refactor(view) showImage: assign -> spread 2018-04-16 10:24:07 +03:00
David Rapin
cf4a273e83 fix(view) showImage: left key button in image view (#164) 2018-04-16 10:11:15 +03:00
coderaiser
f17d5b149a fix(edit-file-vim) Shift + Esc: task manager 2018-04-15 12:39:42 +03:00
coderaiser
e3470dcad9 chore(package) v9.1.2 2018-04-12 12:05:34 +03:00
coderaiser
b42715950f test(terminal) coverage 2018-04-12 12:04:43 +03:00
coderaiser
6f208c5dfb fix(operations) for-each-key v1.0.1: update file list after removing file 2018-04-12 12:04:36 +03:00
coderaiser
567a14f93d feature(webpack) deepmerge -> webpack-merge 2018-04-11 11:31:32 +03:00
coderaiser
1e716ef64f feature(webpack) split config to: js, html and css 2018-04-11 11:31:04 +03:00
coderaiser
3b17a16217 chore(package) v9.1.1 2018-04-10 12:27:14 +03:00
coderaiser
7eff4f7e41 fix(columns) name-size in firefox (#162) 2018-04-10 12:24:44 +03:00
coderaiser
11c249c8f0 feature(package) add for-each-key from npm 2018-04-04 18:03:12 +03:00
coderaiser
f694857e63 feature(modules) socket.io v2.1.0 2018-04-02 14:52:11 +03:00
coderaiser
e9b56e5887 docs(help) add CLOUDCMD_CACHE 2018-04-02 13:35:03 +03:00
coderaiser
afcbc17250 chore(package) v9.1.0 2018-04-02 13:29:41 +03:00
coderaiser
dd60a3e43f feature(cloudcmd) add --cache cli option 2018-04-02 13:28:17 +03:00
coderaiser
f248e29405 fix(client) authCheck: can not connect via web sockets when auth disabled (#160) 2018-04-02 13:28:05 +03:00
coderaiser
31737ec68f chore(package) v9.0.0 2018-03-30 16:37:47 +03:00
coderaiser
745e9b732c feature(cloudcmd) showKeysPanel -> keysPanel 2018-03-30 15:55:05 +03:00
coderaiser
ab83db8059 test(cloudcmd) coverage 2018-03-30 15:12:59 +03:00
coderaiser
0dd475fcff feature(package) dword v7.0.0 2018-03-30 10:54:14 +03:00
coderaiser
63fe6beac2 feature(package) deepword v3.0.0 2018-03-30 10:53:36 +03:00
coderaiser
eb13b764cf feature(package) edward v7.0.0 2018-03-30 10:52:52 +03:00
coderaiser
a36f862938 feature(package) console-io v7.0.0 2018-03-30 10:26:27 +03:00
coderaiser
e688e9d39e feature(cloudcmd) drop support of gritty < v2 2018-03-30 09:45:48 +03:00
coderaiser
21c829adc2 feature(config) auth 2018-03-30 09:27:57 +03:00
coderaiser
bc25f1babb feature(cloudcmd) spero, ishtar, salam, remedy, omnes -> fileop 2018-03-29 18:49:40 +03:00
coderaiser
cccffc57ba fix(cloudcmd) --no-prefix 2018-03-29 18:48:14 +03:00
coderaiser
eab4d3cc57 fix(client) goToParentDir 2018-03-29 14:15:37 +03:00
coderaiser
bfcb075480 feature(for-each-key) add 2018-03-29 14:15:32 +03:00
coderaiser
68e9bd813e feature(package) html-webpack-exclude-assets-plugin v0.0.7 2018-03-29 11:14:43 +03:00
coderaiser
c0442ce5cf chore(query) add " " 2018-03-26 13:47:03 +03:00
coderaiser
cb3bfefd83 fix(query) portrait on iphone 6 firefox 2018-03-25 14:51:49 +03:00
coderaiser
5568d8f777 feature(query) add support if iphone 6 landscape 2018-03-25 14:02:06 +03:00
coderaiser
2283ce9cbd chore(package) v8.5.2 2018-03-24 21:31:37 +02:00
coderaiser
c03b465051 chore(package) v8.5.1 2018-03-24 21:11:51 +02:00
coderaiser
dd53d178ea fix(operation) progress of copy/move (#155) 2018-03-24 21:09:30 +02:00
coderaiser
407892e995 chore(package) v8.5.0 2018-03-23 14:13:56 +02:00
coderaiser
293043999c feature(cloudcmd) add --sync-console-path 2018-03-23 14:13:41 +02:00
coderaiser
f680180d95 feature(package) console-io v6.0.1 2018-03-20 17:35:18 +02:00
coderaiser
d4d667a99d feature(package) html-webpack-exclude-assets-plugin v0.0.6 2018-03-20 11:46:33 +02:00
coderaiser
5aee086b6b feature(package) html-webpack-plugin v3.0.7 2018-03-20 11:42:31 +02:00
coderaiser
d9c6da1c5f chore(package) rm unused jscs, jshint 2018-03-20 11:35:58 +02:00
coderaiser
3817ee7ae2 feature(cloudcmd) add emitter 2018-03-19 21:23:30 +02:00
coderaiser
92960e7f8a feature(package) os-homedir -> os.homedir 2018-03-19 15:35:39 +02:00
coderaiser
6a704a81b8 fix(rest) jonny: node v4 support 2018-03-16 16:00:45 +02:00
coderaiser
2c467919ed test(cp) always rm tmp dir 2018-03-16 16:00:45 +02:00
coderaiser
62461ad338 refactor(rest) early return 2018-03-16 16:00:40 +02:00
coderaiser
b269ce95b4 refactor(move-files) move out from rest 2018-03-16 15:44:37 +02:00
coderaiser
d10c024d8d test(rest) add mkdirp 2018-03-16 12:47:43 +02:00
coderaiser
05341e2bcb chore(package) v8.4.1 2018-03-16 12:31:22 +02:00
coderaiser
016b92381c fix(rest) moveFiles: could not rename (#150) 2018-03-16 12:29:51 +02:00
coderaiser
1665b607cf chore(package) v8.4.0 2018-03-14 15:12:21 +02:00
coderaiser
f25ccaf67d feature(name-size-date) improve view 2018-03-14 11:54:46 +02:00
coderaiser
b232a936fb feature(columns) add name-size (#139) 2018-03-14 11:54:33 +02:00
coderaiser
22142e00ba feature(package) redrun v6.0.0 2018-03-07 19:15:10 +02:00
coderaiser
712e80d53b test(rest) mv: coverage 2018-03-07 18:07:33 +02:00
coderaiser
a41fd8cea5 chore(webpack) add ";" 2018-03-07 17:52:49 +02:00
coderaiser
dadc294765 test(rest) cp: coverage 2018-03-07 17:52:41 +02:00
coderaiser
d6bd52e866 refactor(webpack) extractPlugin 2018-03-06 19:28:57 +02:00
coderaiser
efab57df8b feature(package) url-loader v1.0.1 2018-03-05 14:06:34 +02:00
coderaiser
a5554933f0 refactor(columns) read-files-sync 2018-03-05 12:54:54 +02:00
coderaiser
22f8fbbf95 test(columns) add 2018-03-02 22:43:45 +02:00
coderaiser
178446a8b3 test(route) no index 2018-03-02 22:35:17 +02:00
coderaiser
b1bb35bfd9 feature(app) add CLOUDCMD_COLUMNS 2018-03-02 22:29:03 +02:00
coderaiser
128078ad6f chore(package) v8.3.0 2018-03-02 22:02:24 +02:00
coderaiser
1407a9849a chore(screen) config 2018-03-02 21:59:13 +02:00
coderaiser
36f95702e1 chore(man) rm ` 2018-03-02 21:59:04 +02:00
coderaiser
172b2f9ea2 fix(route) buildIndex: getIndexPath 2018-03-02 21:53:24 +02:00
coderaiser
dce3efe71b chore(webpack) rm default libraryTarget 2018-03-02 21:53:24 +02:00
coderaiser
b5f98be162 feature(cloudcmd) --columns: add ability to set visible columns (#146) 2018-03-02 21:53:14 +02:00
coderaiser
6c9913e5f1 feature(package) html-webpack-plugin v3.0.4 2018-03-02 14:42:56 +02:00
coderaiser
8f9867d028 feature(package) limier v2.0.0 2018-03-02 11:53:23 +02:00
coderaiser
9293d7599c featur(package) pre6to5:client, pre6to5:client:dev 2018-03-01 17:47:57 +02:00
coderaiser
73ae281bba feature(package) webpack v4.0.0 2018-03-01 17:47:54 +02:00
coderaiser
0a8ed76315 fix(listeners) pop: change #hash 2018-02-23 17:36:19 +02:00
coderaiser
239f537742 refactor(events) concat -> rest 2018-02-23 17:14:33 +02:00
coderaiser
a37cb35829 chore(package) rm unused mkdirp 2018-02-23 17:06:41 +02:00
coderaiser
7a95e0439e refactor(client) init 2018-02-23 17:06:31 +02:00
coderaiser
dfee961458 feature(package) rm jscs, jshint 2018-02-23 17:01:09 +02:00
coderaiser
54a72bd714 test(static) auth: coverage 2018-02-23 16:35:14 +02:00
coderaiser
cd0fad79e8 test(rest) isRootAll: coverage 2018-02-23 16:35:09 +02:00
coderaiser
cd1fe7db29 feature(package) jonny v2.0.3 2018-02-20 17:37:52 +02:00
coderaiser
44dc379053 refactor(config) object properties shorthands 2018-02-20 15:25:43 +02:00
coderaiser
1887b0e13c test(cloudcmd) add clear-module, mock-require 2018-02-19 17:08:12 +02:00
coderaiser
41e0d3ad8b docs(readme) create issue -> create an issue 2018-02-19 15:50:45 +02:00
coderaiser
b39bc5a218 feature(package) flop v4.0.0 2018-02-19 15:32:58 +02:00
coderaiser
895e34856d refactor(opearation) destructuring 2018-02-19 15:25:19 +02:00
coderaiser
196b72448d feature(package) add mock-require, clear-module 2018-02-19 15:24:21 +02:00
coderaiser
2cd1bd9201 chore(package) v8.2.2 2018-02-19 11:13:18 +02:00
coderaiser
8b3d894df1 feature(package) stylelint v9.0.0 2018-02-19 11:07:33 +02:00
coderaiser
ed2cbfed65 fix(directory) upload files with help of dragndrop when root directory is empty (#145) 2018-02-19 11:07:27 +02:00
coderaiser
06e55831f1 feature(package) squad v2.0.0 2018-02-16 13:57:43 +02:00
coderaiser
3f2cf39f45 feature(package) sinon-called-with-diff v2.0.0 2018-02-14 10:19:05 +02:00
coderaiser
1e4a58da2a feature(package) tryrequire v2.0.1 2018-02-09 11:35:23 +02:00
coderaiser
73c7f8713b feature(package) try-catch v2.0.0 2018-02-08 18:17:41 +02:00
coderaiser
7acf191f61 feature(package) eslint-plugin-node v6.0.0 2018-02-06 13:14:47 +02:00
coderaiser
c427244469 feature(package) es6-promisify v6.0.0 2018-01-31 16:04:23 +02:00
coderaiser
5bf10b60b1 feature(package) style-loader v0.20.1 2018-01-29 11:12:54 +02:00
coderaiser
103276eda3 chore(package) v8.2.1 2018-01-23 16:48:37 +02:00
coderaiser
4ca0be8c21 docs(readme) Windows: gritty 2018-01-23 16:47:32 +02:00
coderaiser
94747c9932 fix(operation) paste files when current file is ".." (#142) 2018-01-23 16:42:39 +02:00
coderaiser
10ffddc2f1 chore(listeners) add "\n" 2018-01-22 15:43:21 +02:00
coderaiser
1a424162c7 feature(bower) jquery v3.3.1 2018-01-22 15:42:18 +02:00
coderaiser
491e6220ca chore(index) rm " " 2018-01-19 15:36:40 +02:00
coderaiser
0cea45164e chore(polyfill) es2015-ify 2018-01-19 15:24:42 +02:00
coderaiser
ed5aeff441 chore(rest) sendRequest: var -> const 2018-01-19 15:24:42 +02:00
coderaiser
e547187490 chore(load) es2015-ify 2018-01-19 15:24:42 +02:00
coderaiser
b972b5eff3 refactor(dom) goToDirectory 2018-01-19 15:24:39 +02:00
coderaiser
60fb02f387 chore(dom) scrollIntoViewIfNeeded 2018-01-19 14:54:26 +02:00
coderaiser
c8e9e291ad chore(dom) deleteSelected: for -> map 2018-01-19 14:48:32 +02:00
coderaiser
e6e0b6d3be chore(modules) delSelected -> DOM.deleteSelected 2018-01-19 14:48:20 +02:00
coderaiser
5cfd640131 chore(dom) deleteCurrent: es2015-ify 2018-01-19 14:37:30 +02:00
coderaiser
e92f791c81 chore(dom) hidePanel: es2015-ify 2018-01-19 14:33:49 +02:00
coderaiser
0803780a30 chore(dom) getPanel: es2015-ify 2018-01-19 14:02:10 +02:00
coderaiser
ce8b075f46 chore(package) v8.2.0 2018-01-16 17:29:49 +02:00
coderaiser
1cab380c83 chore(yaspeller) add maintainers, sexualized 2018-01-16 17:23:45 +02:00
coderaiser
f195f8cee1 feature(config) username, password: add autocomplete 2018-01-16 16:44:28 +02:00
coderaiser
c04867451b feature(config) div -> form 2018-01-16 16:44:18 +02:00
coderaiser
da48b5a146 chore(config) rm " " 2018-01-16 16:35:37 +02:00
coderaiser
b8a7cebf08 chore(listeners) var -> const 2018-01-15 15:11:42 +02:00
coderaiser
eda607ff21 feature(package) mock-require v3.0.1 2018-01-15 13:58:56 +02:00
coderaiser
7179f426e2 docs(help) showConfig 2017-12-29 12:57:50 +02:00
coderaiser
f0dce68553 fix(config) showConfig 2017-12-29 12:57:40 +02:00
coderaiser
bcb726144f chore(package) codestyle: calm 2017-12-29 11:49:34 +02:00
coderaiser
5ab570f1f3 fix(now) add quotes 2017-12-29 11:22:25 +02:00
coderaiser
8f1757bd39 chore(operation) add wraptile 2017-12-28 14:25:30 +02:00
coderaiser
0d92aa21fb docs(code-of-conduct) add 2017-12-22 12:14:36 +02:00
coderaiser
ca53e56ee1 chore(edit-file-vim) add destructuring 2017-12-11 17:21:10 +02:00
coderaiser
5a70d3ddfe docs(changelog) rm test, chore 2017-12-08 17:31:12 +02:00
coderaiser
b2b55dc151 chore(package) v8.1.3 2017-12-08 17:29:32 +02:00
coderaiser
ee172502fe feature(edit-file-vim) setOption -> setKeyMap 2017-12-08 17:26:18 +02:00
coderaiser
91590b69ef fix(view) Info.files -> Info 2017-12-08 17:26:03 +02:00
coderaiser
c03fbbf11f refactor(config) connection 2017-12-07 14:43:33 +02:00
coderaiser
aa707d9afb test(config) coverage: middle 2017-12-07 14:15:03 +02:00
coderaiser
81f4a207a7 test(route) keys panel: show 2017-12-06 15:04:32 +02:00
coderaiser
af70eb5ee6 fix(config) patch 2017-12-04 18:32:08 +02:00
coderaiser
53d79bfda8 refactor(config) patch: promisify 2017-12-01 18:25:29 +02:00
coderaiser
d3b6a7505f test(rest) isRootWin32 2017-12-01 15:46:26 +02:00
coderaiser
b64ed343c2 feature(package) stylelint-config-standard v18.0.0 2017-11-27 16:29:47 +02:00
coderaiser
0d48c6b1e9 refactor(config) manageConfig 2017-11-20 17:48:09 +02:00
coderaiser
9c050b3c6e test(config) listen 2017-11-20 16:14:19 +02:00
coderaiser
45b6d20aaa refactor(rest) object shorthand 2017-11-17 16:10:43 +02:00
coderaiser
1419a85f83 fix(fancybox) _afterZoomIn: hide 2017-11-14 17:58:41 +02:00
coderaiser
31889030f1 refactor(view) addEvent: last in first out 2017-11-14 13:16:59 +02:00
coderaiser
b676c67b96 refactor(view) setCurrentByPosition 2017-11-14 12:54:41 +02:00
coderaiser
a088a6718e refactor(view) isImage 2017-11-13 13:44:07 +02:00
coderaiser
ca284ed72f test(cloudcmd) replaceDist: !isDev: dist-dev -> dist 2017-11-13 10:28:15 +02:00
coderaiser
69807a729d teste(cloudcmd) replaceDist: coverage 2017-11-09 16:38:27 +02:00
coderaiser
81262a0711 test(cloudcmd) getPrefix: coverage 2017-11-09 16:25:47 +02:00
coderaiser
bdb7bee0b0 test(cloudcmd) replacePrefix 2017-11-09 16:15:19 +02:00
coderaiser
cc30178aaa test(cloudcmd) getPrefix: coverage 2017-11-09 16:10:16 +02:00
coderaiser
65cbc8455a test(cloudcmd) authCheck 2017-11-09 15:49:48 +02:00
coderaiser
c5a4914103 chore(package) codestyle: rm calm 2017-11-08 18:14:28 +02:00
coderaiser
7c326bcac5 chore(cloudcmd) add ";" 2017-11-08 18:13:06 +02:00
coderaiser
a315e2d8c6 chore(package) fix:lint:dev 2017-11-08 18:12:33 +02:00
coderaiser
0b8d271536 chore(package) fix:lint:server: eslint -> lint 2017-11-08 18:05:24 +02:00
coderaiser
016b5c79f9 test(cloudcmd) getPrefix 2017-11-08 18:05:24 +02:00
coderaiser
10255164d5 test(cloudcmd) _authenticate 2017-11-08 18:05:19 +02:00
coderaiser
430307e574 feature(package) nsp v3.1.0 2017-11-07 10:48:42 +02:00
coderaiser
c4859cbd03 chore(package) codestyle calm 2017-11-06 15:30:42 +02:00
coderaiser
e9fa175d91 chore(yaspeller) Node 2017-11-06 09:35:34 +02:00
coderaiser
62c6acbd0c chore(yaspellerrc) named 2017-11-06 09:34:28 +02:00
coderaiser
5d613886fe refactor(cloudcmd) rm isOption 2017-11-03 17:27:08 +02:00
coderaiser
89efc7b4b3 refactor(cloudcmd) listen: rm unused size 2017-11-03 13:23:22 +02:00
coderaiser
dae5e69f7e chore(Dockerfile) node -> node:8 2017-11-01 12:21:32 +02:00
coderaiser
87ea05ba9a chore(travis) node_js: 7 -> 9 2017-11-01 12:20:06 +02:00
coderaiser
64e8a7bae8 chore(package) v8.1.2 2017-10-23 18:23:37 +03:00
coderaiser
3d874b9326 chore(rest) add " " 2017-10-23 18:18:27 +03:00
coderaiser
35b954ab46 test(rest) getWin32RootMsg 2017-10-23 18:18:27 +03:00
coderaiser
38291f1fc3 test(rest) formatMsg 2017-10-23 18:18:22 +03:00
coderaiser
ecbf8f2fe5 fix(operation) update panel after error on delete files 2017-10-23 12:40:02 +03:00
coderaiser
ba7cefc48b fix(operation) noFilesCheck: false positive: files selected but current is ".." 2017-10-23 11:37:49 +03:00
coderaiser
bba55adcb9 docs(license) 2018 2017-10-20 16:14:40 +03:00
coderaiser
eb549a5515 chore(package) v8.1.1 2017-10-19 19:43:36 +03:00
coderaiser
691aa7ad04 feature(bower) smalltalk v2.5.1 2017-10-19 19:42:16 +03:00
coderaiser
56c2c389c7 chore(menu) rm duplicate 2017-10-19 19:27:29 +03:00
coderaiser
b3a1f8bd8b chore(package) v8.1.0 2017-10-19 15:47:06 +03:00
coderaiser
2d93350d03 feature(package) lint:js:eslint:client -> lint:client 2017-10-19 15:46:37 +03:00
coderaiser
4d93472df0 fix(menu) when click on ".." show full menu 2017-10-19 15:46:34 +03:00
coderaiser
4f1e70a06b fix(menu) show menu on F9 when current is ".." 2017-10-19 13:41:56 +03:00
coderaiser
430c408383 refactor(menu) bind -> wrap 2017-10-19 12:44:43 +03:00
coderaiser
0303129006 chore(menu) rm " " 2017-10-19 12:36:18 +03:00
coderaiser
0c88313682 fix(menu) title: Menu -> Cloud Commander 2017-10-19 12:15:56 +03:00
coderaiser
4662bd7312 fix(menu) uploadTo: when error - do nothing, everything already done 2017-10-19 12:09:31 +03:00
coderaiser
11c6ccb025 feature(cloud) filepicker v2 2017-10-19 12:08:38 +03:00
coderaiser
1ece504bd6 feature(client) log: return str 2017-10-19 12:08:30 +03:00
coderaiser
83440e6da8 refactor(cloud) Util -> time, timeEnd 2017-10-18 16:49:49 +03:00
coderaiser
193448929f chore(package) v8.0.5 2017-10-13 17:08:38 +03:00
coderaiser
b51682fce4 feature(polyfill) clean up old polyfills 2017-10-13 17:07:07 +03:00
coderaiser
74e351475e refactor(config) fillTemplate: forEach -> squad, map 2017-10-13 17:01:45 +03:00
coderaiser
09059a0fe8 feature(events) rm unused dispatch 2017-10-13 17:01:39 +03:00
coderaiser
fb990f4ba7 chore(input) add "\n" 2017-10-13 16:04:47 +03:00
coderaiser
34d266b0fb chore(package) v8.0.4 2017-10-10 17:26:26 +03:00
coderaiser
733ac56aa4 feature(package) deepmerge v2.0.0 2017-10-10 11:06:43 +03:00
coderaiser
772f8abc98 feature(bower) smalltalk v2.5.0 2017-10-09 11:08:13 +03:00
coderaiser
6a0759227f chore(package) v8.0.3 2017-10-06 18:57:16 +03:00
coderaiser
7985c2db16 fix(operation) deleted file do not disappear 2017-10-06 18:52:07 +03:00
coderaiser
b633688bbd chore(package) v8.0.2 2017-10-06 16:23:15 +03:00
coderaiser
3562b6cd6f refactor(operation) add noFilesCheck 2017-10-06 16:05:51 +03:00
coderaiser
c2c66fb29f fix(operation) delete: check no files after ask 2017-10-06 15:48:27 +03:00
coderaiser
13495b8c63 feature(package) url-loader v0.6.1 2017-10-04 18:16:00 +03:00
coderaiser
619b00c8b5 feature(package) style-loader v0.19.0 2017-10-03 16:31:24 +03:00
coderaiser
d4c520d97a chore(package) v8.0.1 2017-10-02 14:51:37 +03:00
coderaiser
9ca6cfcaba fix(package) get back file-loader 2017-10-02 14:04:55 +03:00
coderaiser
cce6cd417c chore(package) v8.0.0 2017-10-02 13:59:07 +03:00
coderaiser
625e9b7183 chore(package) rm unused file-loader 2017-10-02 13:50:25 +03:00
coderaiser
598817a02e feature(cloudcmd) middleware: password: plain -> encrypted (#136) 2017-10-02 13:43:23 +03:00
coderaiser
6255bed777 feature(package) coveralls v3.0.0 2017-09-29 14:09:02 +03:00
coderaiser
fb5fb3df16 chore(package) v7.9.0 2017-09-29 14:08:58 +03:00
coderaiser
e5e8a566e2 feature(cloudcmd) add --confirm-move 2017-09-29 13:56:39 +03:00
coderaiser
743b76d3ec feature(cloudcmd) add --confirm-copy 2017-09-29 12:19:19 +03:00
coderaiser
df28ac7a78 chore(npmignore) rm unused 2017-09-29 12:19:19 +03:00
coderaiser
e3e9e92b44 test(route) getIndexPath 2017-09-29 12:19:15 +03:00
coderaiser
1005690acb test(route) file: fs 2017-09-27 14:54:14 +03:00
coderaiser
132bfc5d05 test(route) buttons: console 2017-09-27 14:54:14 +03:00
coderaiser
671101d201 feature(template) add: read all templates on start 2017-09-27 14:53:56 +03:00
coderaiser
29ac0677af test(route) keys panel 2017-09-26 13:34:04 +03:00
coderaiser
7c460fc13b test(route) buttons: one panel mode: copy, move 2017-09-26 13:25:32 +03:00
coderaiser
1283a0c5a9 feature(package) sinon v4.0.0 2017-09-26 11:21:04 +03:00
coderaiser
30991d7d49 chore(package) v7.8.0 2017-09-25 18:02:56 +03:00
coderaiser
0c2adc7f4b docs(help) Drag and Drop 2017-09-25 17:58:53 +03:00
coderaiser
c8cbe8c871 feature(listeners) add ability to move files via shift + drag 2017-09-25 17:58:21 +03:00
coderaiser
0cef0c5971 chore(package) v7.7.3 2017-09-22 19:40:11 +03:00
coderaiser
192a5dfdcc feature(bower) smalltalk v2.4.2 2017-09-22 16:19:02 +03:00
coderaiser
f983a2b405 chore(package) v7.7.2 2017-09-22 11:57:14 +03:00
coderaiser
b940d95a01 feature(package) spead up directory upload: philip: bower -> npm 2017-09-22 11:18:47 +03:00
coderaiser
b3aba1f5e3 chore(webpack) add "\n" 2017-09-19 18:54:21 +03:00
coderaiser
0a5cf9dbc3 chore(package) v7.7.1 2017-09-18 12:39:00 +03:00
coderaiser
f20debdc48 feature(package) babel-preset-2015 -> babel-preset-env 2017-09-18 12:03:37 +03:00
Tung Nguyen
750ba5571f fix(operation) RESTful.remove -> RESTful.delete (#132)
In OperationProto class, deleteFn is incorrectly set to RESTful.remove, which is undefined, when socket is disconnected.
2017-09-18 10:38:06 +03:00
coderaiser
7f7489c6a7 chore(package) v7.7.0 2017-09-12 11:48:31 +03:00
coderaiser
588025aa88 feature(cloudcmd) add support of CLOUDCMD_VIM env variable 2017-09-12 10:39:12 +03:00
coderaiser
c86c7a8c88 chore(package) v7.6.0 2017-09-11 18:03:43 +03:00
coderaiser
2edf7f8321 feature(vim) add find support with: "/", "n" and "N" 2017-09-11 17:21:43 +03:00
coderaiser
3693f6f799 feature(package) yaspeller v4.0.0 2017-09-11 10:33:20 +03:00
coderaiser
305e0845ae chore(package) v7.5.2 2017-09-08 17:12:55 +03:00
coderaiser
150375160f fix(config) vim: "false" -> false 2017-09-08 17:11:07 +03:00
coderaiser
63edc5697e chore(package) v7.5.1 2017-09-08 16:01:37 +03:00
coderaiser
dad0b7b904 fix(config) vim enabled by default 2017-09-08 15:56:34 +03:00
coderaiser
8d4083f038 fix(cloudcmd) --vim 2017-09-08 15:55:40 +03:00
coderaiser
9ff3c0938a chore(package) v7.5.0 2017-09-08 13:55:18 +03:00
coderaiser
324022743b feature(vim) add hot keys 2017-09-08 13:50:05 +03:00
coderaiser
dc79ab4a25 refactor(key) key -> key/index 2017-09-05 18:07:46 +03:00
coderaiser
752020de1a test(route) symlink-dir: autocreate 2017-09-05 16:07:09 +03:00
coderaiser
c039fae343 chore(package) v7.4.0 2017-09-04 14:10:43 +03:00
coderaiser
26e1e276ff test(route) coverage 2017-09-04 14:09:53 +03:00
coderaiser
408ad49dc0 chore(route) object shorthands 2017-09-04 14:09:52 +03:00
coderaiser
ed8a88bae3 chore(key) rm " " 2017-09-04 14:09:52 +03:00
coderaiser
02f3d3b271 feature(key) add ability to extract archives with Alt + F9 2017-09-04 14:09:46 +03:00
coderaiser
8bf1ea1d4a feature(key) add ability to pack files with Alt + F5 2017-09-04 14:09:33 +03:00
coderaiser
ee434d9376 chore(key) add early return 2017-09-04 09:55:17 +03:00
coderaiser
744b4d0919 docs(readme) rm ")" 2017-09-04 09:53:11 +03:00
coderaiser
4a9fa84d77 feature(package) docker:rm-old: --cam -> -P 2017-08-31 13:17:50 +03:00
coderaiser
fb349a964e feature(package) scripts: wisdom:type: add support of wisdom 6 2017-08-30 12:48:08 +03:00
coderaiser
02e026c09a feature(package) docker:rm-old: --parallel -> --calm 2017-08-30 12:18:54 +03:00
coderaiser
3b5b023dbb feature(package) wisdom: rm docker:rm-old 2017-08-29 15:29:03 +03:00
coderaiser
fb9b8727a0 chore(package) v7.3.2 2017-08-29 12:22:27 +03:00
coderaiser
b3355f1de5 fix(operation) pack in old packer type after changin packer without reload 2017-08-29 11:55:28 +03:00
coderaiser
a777b33389 chore(buffer) object properties shorthands 2017-08-28 11:04:38 +03:00
coderaiser
8ca69c669f chore(buffer) rm " " 2017-08-28 10:44:59 +03:00
coderaiser
fc5b454ad3 test(markdown) coverage 2017-08-17 14:17:28 +03:00
coderaiser
6dba4ba186 test(markdown) coverage: put: error 2017-08-17 13:12:21 +03:00
coderaiser
ad380bb233 test(markdown) coverage 2017-08-17 11:41:30 +03:00
coderaiser
dd256a9252 chore(markdown) rm " " 2017-08-17 11:12:50 +03:00
coderaiser
594d3770b2 test(markdown) coverage 2017-08-16 14:23:53 +03:00
coderaiser
56a833516d chore(markdown) rm " " 2017-08-16 14:09:06 +03:00
coderaiser
f1b750f73b docs(readme) appveyor badge 2017-08-16 13:50:11 +03:00
coderaiser
4a2f8dd3fe docs(readme) add appveyor badge 2017-08-16 10:43:31 +03:00
coderaiser
2af3fbc31e feature(appveyor) add terminal 2017-08-16 10:33:20 +03:00
coderaiser
d6bb29d962 feature(cloudcmd) add now demo 2017-08-15 18:32:00 +03:00
coderaiser
848502448e chore(gitignore) rm unused docker.sh 2017-08-14 18:24:34 +03:00
coderaiser
d39850809b docs(readme) filePicker: add "\n" 2017-08-14 16:40:59 +03:00
coderaiser
e06b2d01ca chore(package) v7.3.1 2017-08-14 15:55:19 +03:00
coderaiser
4efdf94daa fix(cloudcmd) empty string in CLOUDCMD_NAME and CLOUDCMD_ROOT 2017-08-14 15:48:59 +03:00
coderaiser
d0e9edccf2 chore(package) docker-loing: rm $DOCKER_EMAIL 2017-08-14 14:52:28 +03:00
coderaiser
8b28bdca22 chore(package) v7.3.0 2017-08-14 14:44:07 +03:00
coderaiser
824309f626 chore(package) add version-io 2017-08-14 14:44:07 +03:00
coderaiser
ef62697950 chore(travis) docker-ci 2017-08-14 14:36:31 +03:00
coderaiser
9fc3529511 chore(travis) docker.sh -> .travis 2017-08-14 14:27:00 +03:00
coderaiser
9d6e83875d chore(travis) rm "," 2017-08-14 14:12:33 +03:00
coderaiser
cc1205f6b4 feature(cloudcmd) add support of CLOUDCMD_ONE_PANEL_MODE (#64) 2017-08-14 13:49:45 +03:00
coderaiser
98609fde69 feature(cloudcmd) add support of CLOUDCMD_ROOT (#64) 2017-08-14 13:48:43 +03:00
coderaiser
a0f8d02993 feature(travis) add node v8 condition 2017-08-14 12:11:39 +03:00
coderaiser
83ab65396f feature(cloudcmd) add ability to build docker images with help of travis 2017-08-14 12:06:25 +03:00
coderaiser
b8153e9f20 chore(package) v7.2.2 2017-08-11 18:38:22 +03:00
coderaiser
4808a18305 fix(route) buildIndex: no index.html 2017-08-10 17:04:54 +03:00
coderaiser
d2229e965a refactor(route) buildIndex: shorthands 2017-08-10 17:03:35 +03:00
coderaiser
f1bb0bfa71 chore(index) rm " " 2017-08-07 17:07:02 +03:00
coderaiser
a466c19af1 chore(dockerignore) rm redundant bin/legacy.js 2017-08-07 16:23:17 +03:00
coderaiser
832527d0dc chore(npmignore) rm bin/legacy.js 2017-08-07 16:21:53 +03:00
coderaiser
cc29c2a318 refactor(view) fancybox -> fancybox.open: compatibility with fancybox v3 2017-08-07 14:03:27 +03:00
coderaiser
d0a017f6bf chore(util) add ";" 2017-08-07 13:35:35 +03:00
coderaiser
08d131a2f1 feature(Dockerfile) set package-lock false 2017-08-07 12:19:05 +03:00
coderaiser
b63604882c feature(dockerignore) yarn-error 2017-08-07 12:18:33 +03:00
coderaiser
8b7b3f27ed test(util) scope: coverage 2017-08-04 14:04:06 +03:00
coderaiser
abc051cad1 test(util) findObjByNameInArr: coverage 2017-08-04 13:58:36 +03:00
coderaiser
e2b1351424 test(util) getRegExp: coverage 2017-08-04 13:49:16 +03:00
coderaiser
8c01cd4605 chore(util) rm unused extendProto 2017-08-04 13:47:24 +03:00
coderaiser
406030544c feature(package) sinon v3.0.0 2017-08-04 13:28:56 +03:00
coderaiser
1a5abdef7b test(util) getExt: coverage 2017-08-03 16:34:48 +03:00
coderaiser
42c6c37ed8 test(util) escapeRegExp 2017-08-03 16:29:24 +03:00
coderaiser
5283af224f test(util) getRegExp 2017-08-03 14:46:59 +03:00
coderaiser
e0a656864e test(util) findObjByNameInArr 2017-08-03 14:43:39 +03:00
coderaiser
a8fafbf87b test(cloudfunc) coverage 2017-08-02 13:18:02 +03:00
coderaiser
9dd993fe3f refactor(cloudfunc) buildFromJSON: getDotDot 2017-08-02 12:35:49 +03:00
coderaiser
7cb681f293 test(cloudfunc) getPathLink 2017-08-02 12:20:58 +03:00
coderaiser
b695420114 rafactor(cloudfunc) buildFromJSON: getHeaderField: add 2017-08-02 12:03:00 +03:00
coderaiser
9fde2e3361 refactor(util) simplify 2017-08-02 11:30:31 +03:00
coderaiser
62f66c0c01 refactor(util) getRegExp 2017-08-02 11:20:02 +03:00
coderaiser
73e464848f chore(util) lint 2017-08-01 17:06:48 +03:00
coderaiser
697d256730 chore(package) v7.2.1 2017-07-31 15:29:45 +03:00
coderaiser
1197bcfdd4 fix(config) aditional panel 2017-07-31 15:23:37 +03:00
coderaiser
19096e2f14 fix(view) no scrallbar on help 2017-07-31 15:23:37 +03:00
coderaiser
c4b279c9be refactor(dom) updateCurrentInfo: current 2017-07-31 15:23:34 +03:00
coderaiser
a3f64221df fix(package) docker:push:latest: add (#127) 2017-07-31 12:27:02 +03:00
coderaiser
afc2569f38 chore(terminal) add "," 2017-07-28 15:00:40 +03:00
coderaiser
d156cf87ec chore(package) v7.2.0 2017-07-28 14:40:57 +03:00
coderaiser
b232d4c27e feature(cloudcmd) add support of env variable CLOUDCMD_CONSOLE 2017-07-28 14:30:10 +03:00
Jörn Zaefferer
a5656d15b4 feature(contact) add ability to hide contact button with --no-contact (#125) 2017-07-28 14:29:02 +03:00
coderaiser
7147e0a85c chore(package) v7.1.1 2017-07-27 16:37:46 +03:00
coderaiser
1ffc212583 fix(view) config: additional panel at the bottom 2017-07-27 12:50:18 +03:00
coderaiser
172c6efbf9 fix(view) terminal: set .view height 2017-07-27 12:50:08 +03:00
coderaiser
1fdc441e56 chore(package) v7.1.0 2017-07-27 11:24:29 +03:00
coderaiser
868c424f52 fix(route) showKeysPanel 2017-07-27 11:14:07 +03:00
coderaiser
99e022728d fix(config) additional bar: .view: rm height: 100% 2017-07-26 17:57:32 +03:00
coderaiser
9cdca9efe5 feature(cloudcmd) --name: add ability to set tab name in web browser 2017-07-26 17:57:26 +03:00
coderaiser
9ef0dd02dd fix(view) key binding after click outside the modal window 2017-07-26 16:05:05 +03:00
coderaiser
1521abf34b chore(cloudfunc) rm "\n" 2017-07-26 14:33:54 +03:00
coderaiser
9c16e62deb test(cloudfunc) getTitle 2017-07-26 14:27:54 +03:00
coderaiser
98de9c6bfd test(cloudfunc) getTitle 2017-07-26 12:05:48 +03:00
coderaiser
cf36456303 refactor(cloudfunc) formatMsg: name default value 2017-07-26 11:58:38 +03:00
coderaiser
99d8487b29 feature(Dockerfile) decrease image size: clean npm cache after install 2017-07-20 11:29:03 +03:00
coderaiser
dbd09e5f32 feature(gitignore) add yarn-error.log 2017-07-20 11:20:51 +03:00
coderaiser
d5718b5e52 feature(package) stylelint-config-standard v17.0.0 2017-07-17 12:14:50 +03:00
coderaiser
d206d5d3cf feature(package) stylelint v8.0.0 2017-07-17 12:14:40 +03:00
coderaiser
e8b5f46dfd chore(package) v7.0.2 2017-07-14 17:43:40 +03:00
coderaiser
df9b7b32cb feature(package) deepword v2.0.0 2017-07-14 16:56:50 +03:00
coderaiser
05f8b0b524 feature(package) dword v6.0.0 2017-07-14 16:46:06 +03:00
coderaiser
7b281df7ae docs(help) before -> first 2017-07-14 16:45:59 +03:00
coderaiser
6c92415de8 feature(package) edward v6.0.0 2017-07-14 16:26:40 +03:00
coderaiser
0787491822 feature(package) restafary v3.0.0 2017-07-14 16:26:40 +03:00
coderaiser
11717b61a2 feature(package) remedy v3.0.0 2017-07-14 16:26:40 +03:00
coderaiser
3c223e63e6 feature(gitignore) add yarn.lock 2017-07-14 16:26:40 +03:00
coderaiser
d8a599832c feature(package) flop v3.0.0 2017-07-14 16:26:40 +03:00
coderaiser
a7e139c5f8 feature(package) join-io v2.0.0 2017-07-14 16:26:40 +03:00
coderaiser
7a128d4ba4 feature(package) add eslint-plugin-node 2017-07-14 16:26:40 +03:00
coderaiser
a8005ad4ec chore(package) v7.0.1 2017-07-14 16:26:40 +03:00
coderaiser
b6537a5cfd fix(cloudcmd) node v4 support: currify, pullout 2017-07-14 16:26:39 +03:00
coderaiser
3f065f4241 feature(package) console-io v5.0.0 2017-07-14 16:26:39 +03:00
coderaiser
3638d2aa94 chore(webpack.config) add ";" 2017-07-14 16:26:39 +03:00
coderaiser
04c13c16ab chore(route) rm unused 2017-07-14 16:26:39 +03:00
coderaiser
3af24aa339 feature(npmignore) add css, html 2017-07-14 16:26:39 +03:00
coderaiser
5b758818b6 chore(package) v7.0.0 2017-07-14 16:26:39 +03:00
coderaiser
185460341e feature(auth) add currify 2017-07-14 16:26:38 +03:00
coderaiser
20e76dfc1c feature(cloudcmd) require es2015 versions of packages 2017-07-14 16:26:38 +03:00
coderaiser
7d01a4be3d feature(package) opn v5.1.0 2017-07-14 16:26:38 +03:00
coderaiser
3c759b7c14 feature(package) http-auth v3.2.3 2017-07-14 16:26:38 +03:00
coderaiser
c2a61c1584 feature(package) package-json v4.0.1 2017-07-14 16:26:38 +03:00
coderaiser
ab751b7ac8 feature(package) chalk v2.0.1 2017-07-14 16:26:38 +03:00
coderaiser
7a43ae5e9d feature(cloudcmd) rm support of node.js < 4.0.0 2017-07-14 16:26:38 +03:00
coderaiser
03dbb4489b feature(cloudcmd) rm config option: minify 2017-07-14 16:26:38 +03:00
coderaiser
039b535098 feature(route) rm minify 2017-07-14 16:26:38 +03:00
coderaiser
d98156faed test(terminal) coverage 2017-07-14 16:26:38 +03:00
coderaiser
ea7219f37b feature(package) extract-text-webpack-plugin v3.0.0 2017-07-14 16:26:38 +03:00
coderaiser
a76f6d6dee chore(terminal) rm new line 2017-07-14 16:26:38 +03:00
coderaiser
18bf29bdcc chore(webpack) unnecessary escape character 2017-07-14 16:26:38 +03:00
coderaiser
e6cc96e901 chore(route) rm unused DIR_JSON 2017-07-14 16:26:38 +03:00
coderaiser
21ffe6957d feature(package) socket.io v2.0.3 2017-07-14 16:26:32 +03:00
coderaiser
503b0c0f6e chore(package) v6.15.5 2017-07-14 15:47:03 +03:00
coderaiser
e238d52444 fix(cloudcmd) socket.io: support of node < 4 (#121) 2017-07-14 15:42:15 +03:00
coderaiser
3137a23a1c chore(package) v6.15.4 2017-07-10 15:20:07 +03:00
coderaiser
2b5ec2a949 feature(bower) smalltalk v2.4.1 (#117) 2017-07-10 12:43:50 +03:00
coderaiser
ac33f904c3 feature(package) ishtar v2.0.0 2017-07-07 16:50:24 +03:00
coderaiser
7e36d208cd feature(package) remedy v2.0.0 2017-07-07 16:31:17 +03:00
coderaiser
58763a62d7 feature(package) spero v2.0.0 2017-07-07 14:45:44 +03:00
coderaiser
8162523549 chore(main) quotes 2017-07-07 11:03:49 +03:00
coderaiser
1e0d104cda feature(package) rm mollify 2017-07-07 10:54:03 +03:00
coderaiser
616867b3b5 feature(css) add minification build step 2017-07-06 17:35:27 +03:00
coderaiser
981d5b9380 feature(webpack) loaders -> rules 2017-07-06 15:03:15 +03:00
coderaiser
103e51bee0 chore(cloudcmd) deepword: rm minify: does nothing 2017-07-05 16:33:52 +03:00
coderaiser
d209ad08ea feature(package) dword v5.0.0 2017-07-05 14:57:54 +03:00
coderaiser
fcd327ce7d feature(package) edward v5.0.0 2017-07-04 16:35:16 +03:00
coderaiser
fba5df03d9 feature(package) console-io v4.0.0 2017-07-04 14:22:30 +03:00
coderaiser
18c2c4797b chore(package) v6.15.3 2017-06-26 13:08:37 +03:00
coderaiser
f9a4770f4c fix(client) save directory path and file list to storage when dirStorage disabled 2017-06-26 12:18:16 +03:00
coderaiser
6ea54f25c9 chore(client) var -> const 2017-06-26 12:06:49 +03:00
coderaiser
70986f5a51 fix(view) show: close view on ESC 2017-06-23 17:12:36 +03:00
coderaiser
64e6048d7b chore(package) v6.15.2 2017-06-22 12:19:25 +03:00
coderaiser
97c471b71b feature(package) heroku-postbuild -> heroku-postbuild, postheroku-postbuild 2017-06-21 16:03:40 +03:00
coderaiser
706008fcd7 feature(package) webpack v3.0.0 2017-06-21 15:35:05 +03:00
coderaiser
6ab971d51b fix(konsole) when disabled error occures on second call 2017-06-21 13:58:40 +03:00
coderaiser
da8281e387 fix(config) when disabled error occures on second call 2017-06-21 13:56:43 +03:00
coderaiser
56a359a823 fix(terminal) when disabled, error occures on second call 2017-06-21 13:55:31 +03:00
coderaiser
e6a882d265 chore(package) v6.15.1 2017-06-14 15:24:11 +03:00
coderaiser
5b1a514db7 fix(client) rigth -> right 2017-06-14 15:22:33 +03:00
coderaiser
6706d359f4 fix(client) baseInit: init both panels in OnePanelMode (#116) 2017-06-14 11:26:46 +03:00
coderaiser
63f00db931 feature(modules) socket.io v2.0.3 2017-06-13 11:16:58 +03:00
coderaiser
71d366a6a1 feature(package) eslint v4.0.0 2017-06-12 17:24:21 +03:00
coderaiser
ca5a614a55 feature(app) add auth env variables 2017-06-06 16:40:03 +03:00
coderaiser
b307461d46 fix(Dockerfile) ENTRYPOINT: command -> executable 2017-06-06 14:59:23 +03:00
coderaiser
8d27102a46 chore(package) v6.15.0 2017-06-06 11:36:11 +03:00
coderaiser
84f775620f refactor(cloudcmd) port: early return 2017-06-06 11:28:53 +03:00
coderaiser
6ccb4f0be1 feature(show-config) add ability to show config values with --show-config 2017-06-06 11:28:07 +03:00
coderaiser
8132bbe3a3 fix(cloudcmd) editor: choose -> env 2017-06-06 09:35:42 +03:00
coderaiser
fc0c528037 feature(cloudcmd) add CLOUDCMD_USERNAME 2017-06-06 09:35:06 +03:00
coderaiser
4a7b11de86 feature(cloudcmd) add CLOUDCMD_PASSWORD 2017-06-06 09:33:05 +03:00
coderaiser
4860e467cb feature(help) add CLOUDCMD_AUTH 2017-06-06 09:26:56 +03:00
coderaiser
7efcf6c93d feature(modules) socket.io v2.0.2 2017-06-06 08:16:53 +03:00
coderaiser
d5d6c5fe77 feature(package) nyc v11.0.2 2017-06-06 08:16:53 +03:00
coderaiser
ec9665cdca feature(gitignore) add package-lock.json 2017-06-06 08:16:53 +03:00
coderaiser
3ec89e0d72 docs(help) Config: rm sha-1 2017-06-05 21:10:09 +03:00
coderaiser
fd7a548afb feature(package) docker:rm: add -f: force 2017-06-02 12:46:50 +03:00
coderaiser
22f1ed41f7 feature(travis) node_js: 7 -> 8 2017-05-31 12:34:27 +03:00
coderaiser
6e8fb09aa1 feature(dockerignore) reduce size of image 2017-05-30 18:01:59 +03:00
coderaiser
88dac21b21 feature(package) scripts: docker:tag 2017-05-30 18:01:20 +03:00
coderaiser
a5559b1d35 feature(npmignore) add bower.json, manifest.yml 2017-05-30 18:01:07 +03:00
coderaiser
8bfecf21f7 docs(readme) docker run 2017-05-30 15:16:02 +03:00
coderaiser
a73fddfeb2 feature(Dockerfile) Entrypoint: set absolute: add ability to override WorkDir 2017-05-30 14:47:42 +03:00
coderaiser
d50823e6a1 chore(package) v6.14.4 2017-05-25 15:50:58 +03:00
coderaiser
c9a1441c6d fix(package) put fullstore in dependencies 2017-05-25 11:59:40 +03:00
coderaiser
708b7251b6 chore(index) add ";" 2017-05-25 10:56:30 +03:00
coderaiser
77a680ac37 chore(client) add ";" 2017-05-25 10:56:02 +03:00
coderaiser
c91b4a7e52 chore(package) keywords: terminal 2017-05-24 11:46:43 +03:00
coderaiser
f47e224d3f chore(package) watch:client:dev: move upper 2017-05-24 11:40:24 +03:00
coderaiser
f5da939bfa feature(bower) smalltalk v2.4.0 2017-05-23 14:26:22 +03:00
coderaiser
c41efde6a6 feature(package) rm unused version-io 2017-05-23 12:35:27 +03:00
coderaiser
4b41832be7 chore(release) early return 2017-05-23 11:20:34 +03:00
coderaiser
052134d392 chore(package) v6.14.3 2017-05-22 17:20:44 +03:00
coderaiser
30bdde839f fix(client) dirStorage: save date 2017-05-22 17:12:32 +03:00
coderaiser
0e30e972d1 refactor(client) loadModule: add early return 2017-05-22 16:50:10 +03:00
coderaiser
6109edea6e chore(release) rm " " 2017-05-22 13:42:19 +03:00
coderaiser
190b797751 feature(bower) philip v1.3.7 2017-05-22 12:38:23 +03:00
coderaiser
ce73cbfbe7 feature(cloudcmd) store -> fullstore 2017-05-22 12:32:39 +03:00
coderaiser
60fe5b600e chore(package) v6.14.2 2017-05-18 17:05:35 +03:00
coderaiser
6be2c41823 fix(edit-file) show editor when access denied 2017-05-18 16:49:12 +03:00
coderaiser
a741795ef3 chore(package) v6.14.1 2017-05-18 15:02:49 +03:00
coderaiser
e2f3f83265 feature(edit-file-vim) add ability to reuse edit-file: minimize file size 2017-05-18 14:56:55 +03:00
405 changed files with 24481 additions and 33813 deletions

View file

@ -1,9 +0,0 @@
{
"presets": [
"es2015"
],
"plugins": [
"transform-object-assign"
]
}

9
.babelrc.json Normal file
View file

@ -0,0 +1,9 @@
{
"presets": [
"@babel/preset-env"
],
"plugins": [
"module:babel-plugin-macros",
"@babel/plugin-transform-optional-chaining"
]
}

View file

@ -1,3 +0,0 @@
{
"directory" : "modules"
}

4
.browserslistrc Normal file
View file

@ -0,0 +1,4 @@
last 2 Chrome versions
last 2 Safari versions
Firefox ESR
not dead

31
.cloudcmd.menu.js Normal file
View file

@ -0,0 +1,31 @@
export default {
'F2 - Rename File': renameCurrent,
'L - Lint': run('npm run lint'),
'F - Fix Lint': run('npm run fix:lint'),
'T - Test': run('npm run test'),
'C - Coverage': run('npm run coverage'),
'D - Build Dev': run('npm run build:client:dev'),
'P - Build Prod': run('npm run build:client'),
};
async function renameCurrent(DOM) {
await DOM.renameCurrent();
}
function run(command) {
return async ({CloudCmd, DOM}) => {
const {TerminalRun, config} = CloudCmd;
const {CurrentInfo} = DOM;
const {dirPath} = CurrentInfo;
const cwd = config('root') + dirPath;
return await TerminalRun.show({
cwd,
command,
closeMessage: 'Press any key to close Terminal',
autoClose: false,
});
};
}

View file

@ -1,24 +1,23 @@
.*
*.spec.js
node_modules
npm-debug.log*
coverage
test
manifest.yml
app.json
bower.json
yarn-error.log
yarn.lock
now.json
modules/jquery/dist
modules/jquery/external
modules/jquery/src
docker
!modules/jquery/dist/jquery.min.js
webpack.config.js
cssnano.config.js
modules/fancybox/lib/
modules/fancybox/demo
modules/fancybox/sprite.psd
modules/execon
bin/release.js
client
legacy
server_
.nyc_output
*.swp

View file

@ -9,7 +9,7 @@ root = true
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
trim_trailing_whitespace = false
indent_style = space
indent_size = 4

View file

@ -1,17 +0,0 @@
{
"env": {
"es6": true,
"node": true,
"browser": true
},
"parserOptions": {
"ecmaVersion": 6,
"sourceType": "module"
},
"rules": {
"indent": ["error", 4],
"semi": "error",
"no-use-before-define": ["error", "nofunc"]
},
"extends": ["eslint:recommended"]
}

3
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,3 @@
github: coderaiser
open_collective: cloudcmd
ko_fi: coderaiser

View file

@ -1,12 +0,0 @@
<!--
Thank you for reporting an issue. Please fill in the template below. If unsure
about something, just do as best as you're able.
-->
* **Version** (`cloudcmd -v`):
* **Node Version** `node -v`:
* **OS** (`uname -a` on Linux):
* **Browser name/version**:
* **Used Command Line Parameters**:
* **Changed Config**:

45
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,45 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: needs clarification
assignees: coderaiser
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- **Version** (`cloudcmd -v`):
- **Node Version** `node -v`:
- **OS** (`uname -a` on Linux):
- **Browser name/version**:
- **Used Command Line Parameters**:
- **Changed Config**:
```json
{}
```
- [ ] 🎁 **I'm ready to donate on https://opencollective.com/cloudcmd**
- [ ] 🎁 **I'm ready to donate on https://ko-fi.com/coderaiser**
- [ ] 💪 **I'm willing to work on this issue**
**Additional context**
Add any other context about the problem here.

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View file

@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Stack Overflow
url: https://stackoverflow.com/search?q=cloudcmd
about: Please ask and answer questions here.

View file

@ -0,0 +1,21 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -0,0 +1,24 @@
***
name: Tracking issue
about: Create an issue with bug report or feature request.
title: ""
labels: needs triage
assignees: coderaiser
***
- **Version** (`cloudcmd -v`):
- **Node Version** `node -v`:
- **OS** (`uname -a` on Linux):
- **Browser name/version**:
- **Used Command Line Parameters**:
- **Changed Config**:
```json
{}
```
- [ ] 🎁 **I'm ready to donate on https://opencollective.com/cloudcmd**
- [ ] 🎁 **I'm ready to donate on https://ko-fi.com/coderaiser**
- [ ] 💪 **I'm willing to work on this issue**

View file

@ -4,6 +4,5 @@ about something, just do as best as you're able.
-->
- [ ] commit message named according to [Contributing Guide](https://github.com/coderaiser/cloudcmd/blob/master/CONTRIBUTING.md "Contributting Guide")
- [ ] `npm run codestyle` is OK
- [ ] `npm run fix:lint` is OK
- [ ] `npm test` is OK

60
.github/workflows/docker-io.yml vendored Normal file
View file

@ -0,0 +1,60 @@
name: Docker IO
permissions:
contents: write
on:
- push
jobs:
buildx:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Use Node.js 24.x
uses: actions/setup-node@v6
with:
node-version: 24.x
- name: Install Redrun
run: bun i redrun -g --no-save
- name: NPM Install
run: bun i --no-save
- name: Lint
run: redrun lint
- name: Build
id: build
run: |
redrun build
VERSION=$(grep '"version":' package.json -m1 | cut -d\" -f4)
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Login to DockerHub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push io-image
uses: docker/build-push-action@v7
with:
context: .
file: docker/Dockerfile.io
platforms: linux/amd64,linux/arm64
push: true
tags: |
coderaiser/cloudcmd:io
coderaiser/cloudcmd:${{ steps.build.outputs.version }}-io
ghcr.io/${{ github.repository }}-io
ghcr.io/${{ github.repository }}:${{ steps.build.outputs.version }}-io

88
.github/workflows/docker.yml vendored Normal file
View file

@ -0,0 +1,88 @@
name: Docker CI
permissions:
contents: write
on:
push:
tags:
- "*"
jobs:
buildx:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout
uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Use Node.js 22.x
uses: actions/setup-node@v6
with:
node-version: 22.x
- name: Install Redrun
run: bun i redrun -g --no-save
- name: NPM Install
run: bun i --no-save
- name: Lint
run: redrun lint
- name: Build
id: build
run: |
redrun build
VERSION=$(grep '"version":' package.json -m1 | cut -d\" -f4)
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Set up QEMU
uses: docker/setup-qemu-action@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v4
- name: Login to DockerHub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_TOKEN }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v4
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Build and push base-image
uses: docker/build-push-action@v7
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64,linux/arm64
push: true
tags: |
coderaiser/cloudcmd:latest
coderaiser/cloudcmd:${{ steps.build.outputs.version }}
ghcr.io/${{ github.repository }}:latest
ghcr.io/${{ github.repository }}:${{ steps.build.outputs.version }}
- name: Build and push alpine-image
uses: docker/build-push-action@v7
with:
context: .
file: docker/Dockerfile.alpine
platforms: linux/amd64,linux/arm64
push: true
tags: |
coderaiser/cloudcmd:alpine
coderaiser/cloudcmd:latest-alpine
coderaiser/cloudcmd:${{ steps.build.outputs.version }}-alpine
ghcr.io/${{ github.repository }}:latest-alpine
ghcr.io/${{ github.repository }}:${{ steps.build.outputs.version }}-alpine
- name: Build and push slim-image
uses: docker/build-push-action@v7
with:
context: .
file: docker/Dockerfile.slim
platforms: linux/amd64,linux/arm64
push: true
tags: |
coderaiser/cloudcmd:slim
coderaiser/cloudcmd:latest-slim
coderaiser/cloudcmd:${{ steps.build.outputs.version }}-slim
ghcr.io/${{ github.repository }}-slim
ghcr.io/${{ github.repository }}:${{ steps.build.outputs.version }}-slim

53
.github/workflows/nodejs.yml vendored Normal file
View file

@ -0,0 +1,53 @@
name: Node CI
on:
- push
permissions:
contents: write
jobs:
build:
runs-on: ubuntu-latest
env:
NAME: cloudcmd
strategy:
matrix:
node-version:
- 22.x
- 24.x
- 26.x
steps:
- uses: actions/checkout@v5
- uses: oven-sh/setup-bun@v2
with:
bun-version: latest
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
- name: Install Redrun
run: bun i redrun madrun -g --no-save
- name: Install
run: bun i --no-save
- name: Init Madrun
run: madrun --init
- name: Lint
run: redrun fix:lint
- name: Typos
uses: coderaiser/typos.ai@v1.1.8
with:
key: ${{ secrets.TYPOS_AI_KEY }}
- name: Commit fixes
uses: EndBug/add-and-commit@v10
continue-on-error: true
with:
message: "chore: ${{ env.NAME }}: actions: lint ☘️"
- name: Build
run: redrun build
- name: Test
run: redrun test
- name: Coverage
run: redrun coverage coverage:report
- name: Coveralls
uses: coverallsapp/github-action@v2
continue-on-error: true
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

35
.gitignore vendored
View file

@ -1,30 +1,17 @@
node_modules
npm-debug.log*
coverage
modules/jquery/dist
modules/jquery/external
modules/jquery/src
!modules/jquery/dist/jquery.min.js
modules/fancybox/lib/
modules/fancybox/demo
modules/fancybox/sprite.psd
modules/fancybox/*.json
modules/fancybox/gulpfile.js
modules/jquery-mousewheel
modules/execon
modules/emitify
legacy
server_
*.swp
*.log
*.lock
.nyc_output
.DS_Store
.idea
*.swp
package-lock.json
npm-debug.log*
node_modules
coverage
modules/execon
modules/emitify
dist
dist-dev

20
.jscsrc
View file

@ -1,20 +0,0 @@
{
"preset": "crockford",
"requireSpaceAfterKeywords": false,
"requireCapitalizedConstructors": false,
"requireMultipleVarDecl": false,
"disallowTrailingWhitespace": "ignoreEmptyLines",
"disallowTrailingComma": false,
"disallowDanglingUnderscores": false,
"validateIndentation": false,
"requireCurlyBraces": false,
"requireVarDeclFirst": false,
"requireSpacesInAnonymousFunctionExpression": {
"beforeOpeningCurlyBrace": true
},
"excludeFiles": [
"node_modules/**",
"modules/**",
"bower_components/**"
]
}

View file

@ -1,24 +0,0 @@
{
"esversion": 6,
"unused" : true,
"bitwise" : false,
"browser" : true,
"devel" : true,
"eqeqeq" : true,
"jquery" : false,
"newcap" : false,
"noarg" : true,
"node" : true,
"noempty" : true,
"nonew" : true,
"strict" : true,
"undef" : true,
"evil" : true,
"expr" : true,
"quotmark": "single",
"validthis": true,
"-W024": true,
"-W120": true,
"-W079": true,
"-W138": true
}

62
.madrun.js Normal file
View file

@ -0,0 +1,62 @@
import {run, cutEnv} from 'madrun';
import {defineEnv} from 'supertape/env';
const testEnv = defineEnv({
timeout: 7000,
css: true,
});
const buildEnv = {
NODE_ENV: 'production',
};
export default {
'start': () => 'node bin/cloudcmd.js',
'start:dev': async () => await run('start', null, {
NODE_ENV: 'development',
}),
'build:start': () => run(['build:client', 'start']),
'build:start:dev': () => run([
'build:client:dev',
'start:dev',
]),
'lint:all': () => run('lint:progress'),
'lint': () => 'redlint fix; putout .',
'lint:progress': () => run('lint', '-f progress'),
'watch:lint': () => 'nodemon -w client -w server -w test -w common -w .webpack -x "putout -s"',
'fresh:lint': () => run('lint', '--fresh'),
'lint:fresh': () => run('lint', '--fresh'),
'fix:lint': async () => `putout --fix . && redlint fix`,
'lint:stream': () => run('lint', '-f stream'),
'test': () => [testEnv, `tape '{test}/**/*.js' '{bin,client,static,common,server}/**/*.spec.js' -f fail`],
'test:e2e': () => `tape 'test-e2e/**/*.js'`,
'test:client': () => `tape 'test/client/**/*.js'`,
'test:server': () => `tape 'test/**/*.js' 'server/**/*.spec.js' 'common/**/*.spec.js'`,
'wisdom': async () => await run(['lint:all', 'build', 'test'], null, {
CI: 1,
}),
'wisdom:type': () => 'bin/release.js',
'coverage': async () => [testEnv, `c8 ${await cutEnv('test')}`],
'coverage:report': () => 'c8 report --reporter=lcov',
'report': () => 'c8 report --reporter=lcov',
'6to5': () => [buildEnv, 'rspack build --config rspack.config.js'],
'6to5:client': () => run('6to5', '--mode production'),
'6to5:client:dev': async () => await run('6to5', '--mode development', {
NODE_ENV: 'development',
}),
'pre6to5:client': () => 'rimraf dist',
'pre6to5:client:dev': () => 'rimraf dist-dev',
'watch:client': () => run('6to5:client', '--watch'),
'watch:client:dev': () => run('6to5:client:dev', '--watch'),
'watch:server': () => 'nodemon bin/cloudcmd.js',
'watch:test': async () => [testEnv, `nodemon -w client -w server -w test -w common -x ${await cutEnv('test')}`],
'watch:test:client': async () => `nodemon -w client -w test/client -x ${await run('test:client')}`,
'watch:test:server': async () => `nodemon -w client -w test/client -x ${await run('test:server')}`,
'watch:coverage': async () => [testEnv, `nodemon -w server -w test -w common -x ${await cutEnv('coverage')}`],
'watch:fix:lint': async () => `nodemon -w client -w server -w test -w common -x '${await run('fix:lint')}'`,
'build': async () => run('6to5:*'),
'build:dev': async () => run('build:client:dev'),
'build:client': () => run('6to5:client'),
'build:client:dev': () => run('6to5:client:dev'),
'heroku-postbuild': () => run('6to5:client'),
};

View file

@ -1,34 +1,29 @@
*.spec.*
*.config.*
*.fixture.js*
*.ai
*.cdr
*.eps
*.log
*.lock
.*
manifest.yml
Dockerfile*
docker-compose.yml
shell
test
coverage
modules/jquery/dist
modules/jquery/external
modules/jquery/src
!modules/jquery/dist/jquery.min.js
modules/fancybox/lib/
modules/fancybox/demo
modules/fancybox/sprite.psd
modules/execon
modules/emitify
now.json
app.json
circle.yml
bin/release.js
bin/legacy.js
client
legacy/bin/release.js
legacy/bin/legacy.js
bower.json
deno.json
bin/release.*
img/logo/cloudcmd-hq.png
webpack.config.js
docker
test*
fixture
fixture-*
coverage
css
html
client

15
.nycrc.json Normal file
View file

@ -0,0 +1,15 @@
{
"checkCoverage": false,
"all": false,
"exclude": [
"**/*.spec.js",
"**/*.*.js",
"**/*.config.*",
"**/fixture",
"**/test/**"
],
"branches": 100,
"lines": 100,
"functions": 100,
"statements": 100
}

60
.putout.json Normal file
View file

@ -0,0 +1,60 @@
{
"plugins": ["cloudcmd"],
"ignore": [
"*.md",
"app.json",
"fontello.json",
"html",
"fixture*"
],
"rules": {
"package-json/add-type": "off"
},
"match": {
".filesystem.json": {
"nodejs/rename-file-cjs-to-js": "off"
},
"base64": {
"types/convert-typeof-to-is-type": "off"
},
"*.md": {
"nodejs/convert-commonjs-to-esm": "on"
},
".webpack": {
"webpack": "on"
},
"server": {
"nodejs/remove-process-exit": "on"
},
"server/{server,exit}.js": {
"nodejs/remove-process-exit": "off"
},
"server/{server,exit,terminal,distribute/log}.{js,mjs}": {
"remove-console": "off"
},
"client/{client,cloudcmd,load-module}.{js,mjs}": {
"remove-console": "off"
},
"client": {
"nodejs": "off"
},
"client/sw": {
"remove-console": "off"
},
"test/common/cloudfunc.js": {
"remove-console": "off"
},
"storage.js": {
"promises/remove-useless-async": "off"
},
"docker.yml": {
"github/set-node-versions": "off"
},
"vim.js": {
"merge-duplicate-functions": "off"
},
"common": {
"nodejs/declare": "off"
}
}
}

38
.rspack/css.js Normal file
View file

@ -0,0 +1,38 @@
import {env} from 'node:process';
import {rspack} from '@rspack/core';
const {CssExtractRspackPlugin} = rspack;
const isDev = env.NODE_ENV === 'development';
const plugins = [
new CssExtractRspackPlugin({
filename: '[name].css',
}),
];
const rules = [{
test: /\.css$/i,
use: [CssExtractRspackPlugin.loader, {
loader: 'css-loader',
options: {
url: true,
},
}],
}, {
test: /\.(png|gif|svg|woff|woff2|eot|ttf)$/,
type: 'asset/inline',
}];
export default {
mode: isDev ? 'development' : 'production',
plugins,
module: {
rules,
},
optimization: {
minimize: !isDev,
minimizer: [
new rspack.LightningCssMinimizerRspackPlugin(),
],
},
};

36
.rspack/html.js Normal file
View file

@ -0,0 +1,36 @@
import {env} from 'node:process';
import HtmlWebpackPlugin from 'html-webpack-plugin';
const isDev = env.NODE_ENV === 'development';
export const plugins = [
new HtmlWebpackPlugin({
inject: false,
template: 'html/index.html',
minify: !isDev && getMinifyHtmlOptions(),
}),
];
function getMinifyHtmlOptions() {
return {
removeComments: true,
removeCommentsFromCDATA: true,
removeCDATASectionsFromCDATA: true,
collapseWhitespace: true,
collapseBooleanAttributes: true,
removeAttributeQuotes: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
/* оставляем, поскольку у нас
* в элемент fm генерируеться
* таблица файлов
*/
removeEmptyElements: false,
removeOptionalTags: true,
removeScriptTypeAttributes: true,
removeStyleLinkTypeAttributes: true,
minifyJS: true,
};
}

173
.rspack/js.js Normal file
View file

@ -0,0 +1,173 @@
import {resolve, sep} from 'node:path';
import {fileURLToPath} from 'node:url';
import {env} from 'node:process';
import {rspack} from '@rspack/core';
const resolveModule = (a) => fileURLToPath(import.meta.resolve(a));
const {
EnvironmentPlugin,
NormalModuleReplacementPlugin,
ProvidePlugin,
} = rspack;
const modules = './modules';
const dirModules = './client/modules';
const dirCss = './css';
const dirThemes = `${dirCss}/themes`;
const dirColumns = `${dirCss}/columns`;
const dir = './client';
const {NODE_ENV} = env;
const isDev = NODE_ENV === 'development';
const rootDir = new URL('..', import.meta.url).pathname;
const dist = resolve(rootDir, 'dist');
const distDev = resolve(rootDir, 'dist-dev');
const devtool = isDev ? 'eval' : 'source-map';
const noParse = (a) => a.endsWith('.spec.js');
// codegen.macro is a babel-macro (build-time codegen), not supported by
// Rspack's native SWC transform, so client/sw/sw.js (the only file that
// uses it) keeps going through babel-loader. Everything else uses
// Rspack's built-in SWC loader, which is the main source of the speedup.
const rules = [{
test: /sw\/sw\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
}, {
test: /\.[mc]?js$/,
exclude: [/node_modules/, /sw\/sw\.js$/],
loader: 'builtin:swc-loader',
options: {
jsc: {
parser: {
syntax: 'ecmascript',
},
},
env: {
targets: 'defaults',
},
},
}];
const plugins = [
new NormalModuleReplacementPlugin(/^node:/, (resource) => {
resource.request = resource.request.replace(/^node:/, '');
}),
new NormalModuleReplacementPlugin(/^putout$/, '@putout/bundle'),
new EnvironmentPlugin({
NODE_ENV,
}),
new ProvidePlugin({
process: 'process/browser',
}),
];
const splitChunks = {
chunks: 'all',
cacheGroups: {
abcCommon: {
name: 'cloudcmd.common',
chunks: (chunk) => {
const lazyChunks = [
'sw',
'nojs',
'view',
'edit',
'terminal',
'config',
'user-menu',
'help',
'themes/dark',
'themes/light',
'columns/name-size',
'columns/name-size-date',
'columns/name-size-time',
'columns/name-size-date-time',
];
return !lazyChunks.includes(chunk.name);
},
minChunks: 1,
enforce: true,
priority: -1,
reuseExistingChunk: true,
},
},
};
export default {
resolve: {
symlinks: false,
alias: {
'node:process': 'process',
'node:path': 'path',
},
fallback: {
path: resolveModule('path-browserify'),
process: resolveModule('process/browser'),
util: resolveModule('util'),
},
},
devtool,
optimization: {
splitChunks,
},
entry: {
'themes/dark': `${dirThemes}/dark.css`,
'themes/light': `${dirThemes}/light.css`,
'columns/name-size': `${dirColumns}/name-size.css`,
'columns/name-size-date': `${dirColumns}/name-size-date.css`,
'columns/name-size-date-time': `${dirColumns}/name-size-date-time.css`,
'nojs': `${dirCss}/nojs.css`,
'help': `${dirCss}/help.css`,
'view': `${dirCss}/view.css`,
'config': `${dirCss}/config.css`,
'terminal': `${dirCss}/terminal.css`,
'user-menu': `${dirCss}/user-menu.css`,
'sw': `${dir}/sw/sw.js`,
'cloudcmd': `${dir}/cloudcmd.js`,
[`${modules}/edit`]: `${dirModules}/edit.js`,
[`${modules}/edit-file`]: `${dirModules}/edit-file.js`,
[`${modules}/edit-file-vim`]: `${dirModules}/edit-file-vim.js`,
[`${modules}/edit-names`]: `${dirModules}/edit-names.js`,
[`${modules}/edit-names-vim`]: `${dirModules}/edit-names-vim.js`,
[`${modules}/menu`]: `${dirModules}/menu/index.js`,
[`${modules}/view`]: `${dirModules}/view/index.js`,
[`${modules}/help`]: `${dirModules}/help.js`,
[`${modules}/markdown`]: `${dirModules}/markdown.js`,
[`${modules}/config`]: `${dirModules}/config/index.js`,
[`${modules}/contact`]: `${dirModules}/contact.js`,
[`${modules}/upload`]: `${dirModules}/upload.js`,
[`${modules}/operation`]: `${dirModules}/operation/index.js`,
[`${modules}/konsole`]: `${dirModules}/konsole.js`,
[`${modules}/terminal`]: `${dirModules}/terminal.js`,
[`${modules}/terminal-run`]: `${dirModules}/terminal-run.js`,
[`${modules}/cloud`]: `${dirModules}/cloud.js`,
[`${modules}/user-menu`]: `${dirModules}/user-menu/index.js`,
[`${modules}/polyfill`]: `${dirModules}/polyfill.js`,
[`${modules}/command-line`]: `${dirModules}/command-line.js`,
},
output: {
filename: '[name].js',
path: isDev ? distDev : dist,
pathinfo: isDev,
devtoolModuleFilenameTemplate,
publicPath: '/dist/',
},
module: {
rules,
noParse,
},
plugins,
performance: {
maxEntrypointSize: 800_000,
maxAssetSize: 600_000,
},
};
function devtoolModuleFilenameTemplate(info) {
const resource = info.absoluteResourcePath.replace(rootDir + sep, '');
return `file://cloudcmd/${resource}`;
}

View file

@ -1,15 +0,0 @@
extends: stylelint-config-standard
rules:
indentation: 4
declaration-block-trailing-semicolon: always
declaration-colon-space-before: null
selector-list-comma-newline-after: null
comment-empty-line-before: null
number-leading-zero: null
number-no-trailing-zeros: null
string-quotes: single
function-url-quotes: never
no-eol-whitespace: null
font-family-name-quotes: always-unless-keyword
rule-empty-line-before: null

View file

@ -1,17 +0,0 @@
language: node_js
node_js:
- 7
- 6
script:
- npm run codestyle
- npm run 6to5:client:dev
- npm run coverage && npm run report
notifications:
email:
on_success: never
on_failure: change
sudo: false

2
.typos.toml Normal file
View file

@ -0,0 +1,2 @@
[files]
extend-exclude = ["ChangeLog"]

View file

@ -10,6 +10,7 @@
".md"
],
"dictionary":[
"CloudCmd",
"Dev",
"Dropbox",
"Deepword",
@ -20,17 +21,24 @@
"Heroku",
"Iptables",
"JitSu",
"Node",
"IO",
"Olena",
"TarZak",
"Termux",
"Zalitok",
"WebSocket",
"auth",
"autostart",
"binded",
"cd",
"cloudcmd",
"coderaiser",
"com",
"dev",
"deepword",
"dev",
"destructuring",
"dropbox",
"dword",
"edward",
"favicon",
@ -38,17 +46,27 @@
"gz",
"io",
"js",
"linux",
"maintainers",
"markdown",
"microservice",
"minification",
"mouseup",
"named",
"nginx",
"npm",
"or io",
"patreon",
"rc",
"refactor",
"sexualized",
"sslPort",
"unselect",
"util",
"v0",
"v1",
"v2",
"yml"
"yml",
"systemd"
]
}

46
CODE_OF_CONDUCT.md Normal file
View file

@ -0,0 +1,46 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment include:
- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

View file

@ -1,27 +1,30 @@
Commit
---------------
## Commit
Format of the commit message: **type(scope) subject**
**Type**:
- feature(scope) subject
- fix(scope) subject
- docs(scope) subject
- refactor(scope) subject
- test(scope) subject
- chore(scope) subject
- feature: scope: subject
- fix: scope: subject
- docs: scope: subject
- refactor: scope: subject
- test: scope: subject
- chore: scope: subject
**Scope**:
Scope could be anything specifying place of the commit change.
For example util, console, view, edit, style etc...
**Subject text**:
- use imperative, present tense: “change” not “changed” nor “changes”
- don't capitalize first letter
- no dot (.) at the end
**Message body**:
**Message body**:
- just as in <subject> use imperative, present tense: “change” not “changed” nor “changes”
- includes motivation for the change and contrasts with previous behavior
**Examples**:
- [fix(style) .name{width}: 37% -> 35%](https://github.com/coderaiser/cloudcmd/commit/94b0642e3990c17b3a0ee3efeb75f343e1e7c050)
- [fix(console) dispatch: focus -> mouseup](https://github.com/coderaiser/cloudcmd/commit/f41ec5058d1411e86a881f8e8077e0572e0409ec)
- [fix: style: .name{width}: 37% -> 35%](https://github.com/coderaiser/cloudcmd/commit/94b0642e3990c17b3a0ee3efeb75f343e1e7c050)
- [fix: console: dispatch: focus -> mouseup](https://github.com/coderaiser/cloudcmd/commit/f41ec5058d1411e86a881f8e8077e0572e0409ec)

3606
ChangeLog

File diff suppressed because it is too large Load diff

View file

@ -1,20 +0,0 @@
FROM node
MAINTAINER Coderaiser
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install --production && \
npm i gritty
COPY . /usr/src/app
ENV cloudcmd_terminal true
ENV cloudcmd_terminal_path gritty
EXPOSE 8000
ENTRYPOINT ["bin/cloudcmd.js"]

View file

@ -1,24 +0,0 @@
FROM mhart/alpine-node
MAINTAINER Coderaiser
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install --production && \
apk update && \
apk add --no-cache bash make g++ python && \
npm i gritty && \
apk del make g++ python && \
rm -rf /usr/include /tmp/* /var/cache/apk/*
COPY . /usr/src/app
ENV cloudcmd_terminal true
ENV cloudcmd_terminal_path gritty
EXPOSE 8000
ENTRYPOINT ["bin/cloudcmd.js"]

1495
HELP.md

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
(The MIT License)
Copyright (c) 2012-2017 Coderaiser <mnemonic.enemy@gmail.com>
Copyright (c) 2012-2025 Coderaiser <mnemonic.enemy@gmail.com>
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the

197
README.md
View file

@ -1,41 +1,33 @@
# Cloud Commander v6.14.0 [![License][LicenseIMGURL]][LicenseURL] [![NPM version][NPMIMGURL]][NPMURL] [![Dependency Status][DependencyStatusIMGURL]][DependencyStatusURL] [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Package Quality][PackageQualityIMGURL]][PackageQualityURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] [![OpenCollective](https://opencollective.com/cloudcmd/backers/badge.svg)](#backers) [![OpenCollective](https://opencollective.com/cloudcmd/sponsors/badge.svg)](#sponsors)
# Cloud Commander v19.19.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] [![Deploy on InstaPods][DeployInstaPodsIMG]][DeployInstaPodsURL]
### [Main][MainURL] [Blog][BlogURL] Live([Heroku][HerokuURL])
### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL]
[NPM_INFO_IMG]: https://nodei.co/npm/cloudcmd.png
[MainURL]: http://cloudcmd.io "Main"
[BlogURL]: http://blog.cloudcmd.io "Blog"
[HerokuURL]: http://cloudcmd.herokuapp.com/ "Heroku"
[NPMURL]: https://npmjs.org/package/cloudcmd "npm"
[NPMIMGURL]: https://img.shields.io/npm/v/cloudcmd.svg?style=flat
[LicenseURL]: https://tldrlegal.com/license/mit-license "MIT License"
[LicenseIMGURL]: https://img.shields.io/badge/license-MIT-317BF9.svg?style=flat
[DependencyStatusURL]: https://gemnasium.com/coderaiser/cloudcmd "Dependency Status"
[DependencyStatusIMGURL]: https://img.shields.io/gemnasium/coderaiser/cloudcmd.svg?style=flat
[BuildStatusURL]: https://travis-ci.org/coderaiser/cloudcmd "Build Status"
[BuildStatusIMGURL]: https://img.shields.io/travis/coderaiser/cloudcmd.svg?style=flat
[MainURL]: https://cloudcmd.io "Main"
[BlogURL]: https://blog.cloudcmd.io "Blog"
[SupportURL]: https://patreon.com/coderaiser "Patreon"
[DemoURL]: https://cloudcmd-zdp6.onrender.com
[NPM_INFO_IMG]: https://nodei.co/npm/cloudcmd.png
[BuildStatusURL]: https://github.com/coderaiser/cloudcmd/actions/workflows/nodejs.yml "Build Status"
[BuildStatusIMGURL]: https://github.com/coderaiser/cloudcmd/actions/workflows/nodejs.yml/badge.svg
[CodacyURL]: https://www.codacy.com/app/coderaiser/cloudcmd
[CodacyIMG]: https://api.codacy.com/project/badge/Grade/ddda78be780549ce8754f8d47a8c0e36
[GitterURL]: https://gitter.im/cloudcmd/hello
[GitterIMGURL]: https://img.shields.io/gitter/room/coderaiser/cloudcmd.js.svg
[DeployURL]: https://heroku.com/deploy?template=https://github.com/coderaiser/cloudcmd "Deploy"
[DeployIMG]: https://www.herokucdn.com/deploy/button.png
[DeployInstaPodsIMG]: https://img.shields.io/badge/deploy%20on-InstaPods-blue
[DeployInstaPodsURL]: https://app.instapods.com/dashboard/pods/create?app=cloudcmd&ref=cloudcmd
[PackageQualityURL]: http://packagequality.com/#?package=cloudcmd "Package Quality"
[PackageQualityIMGURL]: http://packagequality.com/shield/cloudcmd.svg
**Cloud Commander** a file manager for the web with console and editor.
[CodacyURL]: https://www.codacy.com/app/coderaiser/cloudcmd
[CodacyIMG]: https://api.codacy.com/project/badge/Grade/ddda78be780549ce8754f8d47a8c0e36
[GitterURL]: https://gitter.im/cloudcmd
[GitterIMGURL]: https://img.shields.io/gitter/room/coderaiser/cloudcmd.js.svg
[DeployURL]: https://heroku.com/deploy?template=https://github.com/coderaiser/cloudcmd "Deploy"
[DeployIMG]: https://www.herokucdn.com/deploy/button.png
**Cloud Commander** is an orthodox web file manager with console and editor.
![Cloud Commander](http://cloudcmd.io/img/logo/cloudcmd.png "Cloud Commander")
![Cloud Commander](https://cloudcmd.io/img/logo/cloudcmd.png "Cloud Commander")
## Install
```
npm i cloudcmd -g
```
## Start
For starting just type in console:
@ -48,7 +40,13 @@ cloudcmd
Open url `http://localhost:8000` in browser.
### View
You will see something similar to this.
![View](https://cloudcmd.io/img/screen/view.png "View")
## Deploy
`Cloud Commander` could be easily deployed to [Heroku][DeployURL].
[![Deploy][DeployIMG]][DeployURL]
@ -72,54 +70,72 @@ npm i cloudcmd express socket.io -S
And create `index.js`:
```js
const http = require('http');
const cloudcmd = require('cloudcmd');
const io = require('socket.io');
const app = require('express')();
import http from 'node:http';
import {cloudcmd} from 'cloudcmd';
import {Server} from 'socket.io';
import express from 'express';
const app = express();
const port = 1337;
const prefix = '/cloudcmd';
const prefix = '/';
const server = http.createServer(app);
const socket = io.listen(server, {
path: `${prefix}/socket.io`
const socket = new Server(server, {
path: `${prefix}socket.io`,
});
const config = {
prefix /* base URL or function which returns base URL (optional) */
name: 'cloudcmd :)',
};
const plugins = [
__dirname + '/plugin.js'
];
const filePicker = {
data: {
FilePicker: {
key: 'key',
}
}
},
},
};
// override option from json/modules.json
const modules = {filePicker};
const modules = {
filePicker,
};
app.use(cloudcmd({
socket, /* used by Config, Edit (optional) and Console (required) */
config, /* config data (optional) */
plugins, /* optional */
modules, /* optional */
const {
createConfigManager,
configPath,
} = cloudcmd;
const configManager = createConfigManager({
configPath,
});
app.use(prefix, cloudcmd({
socket, // used by Config, Edit (optional) and Console (required)
config, // config data (optional)
modules, // optional
configManager, // optional
}));
server.listen(port);
```
Docker
---------------
## Docker
The docker images are provided for multiple architectures and types. The following list shows all existing images:
| Architecture | Type |
|----------------|--------------|
| amd64 | linux |
| arm64 (arm/v8) | linux |
| amd64 | linux-alpine |
| arm64 (arm/v8) | linux-alpine |
`Cloud Commander` could be used as a [docker container](https://hub.docker.com/r/coderaiser/cloudcmd/ "Docker container") this way:
```sh
docker run -v ~:/root -v /:/mnt/fs -t -p 8000:8000 coderaiser/cloudcmd
docker run -it --rm -v ~:/root -v /:/mnt/fs -w=/root -p 8000:8000 coderaiser/cloudcmd
```
Config would be read from home directory, hosts root file system would be mount to `/mnt/fs`,
@ -145,84 +161,19 @@ When you create this file run:
docker-compose up
```
Get involved
---------------
## Documentation
More documentation you can find on https://cloudcmd.io/.
## Get involved
There is a lot ways to be involved in `Cloud Commander` development:
- if you find a bug or got idea to share [create issue](https://github.com/coderaiser/cloudcmd/issues/new "Create issue");
- support project on patreon: https://patreon.com/coderaiser;
- if you find a bug or got idea to share [create an issue](https://github.com/coderaiser/cloudcmd/issues/new "Create issue");
- if you fixed a bug, typo or implemented new feature [create pull request](https://github.com/coderaiser/cloudcmd/compare "Create pull request");
- if you know languages you can help with [site translations](https://github.com/coderaiser/cloudcmd/wiki "Cloud Commander community wiki");
## Backers
Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/cloudcmd#backer)]
[![](https://opencollective.com/cloudcmd/backer/0/avatar.svg)](https://opencollective.com/cloudcmd/backer/0/website)
[![](https://opencollective.com/cloudcmd/backer/1/avatar.svg)](https://opencollective.com/cloudcmd/backer/1/website)
[![](https://opencollective.com/cloudcmd/backer/2/avatar.svg)](https://opencollective.com/cloudcmd/backer/2/website)
[![](https://opencollective.com/cloudcmd/backer/3/avatar.svg)](https://opencollective.com/cloudcmd/backer/3/website)
[![](https://opencollective.com/cloudcmd/backer/4/avatar.svg)](https://opencollective.com/cloudcmd/backer/4/website)
[![](https://opencollective.com/cloudcmd/backer/5/avatar.svg)](https://opencollective.com/cloudcmd/backer/5/website)
[![](https://opencollective.com/cloudcmd/backer/6/avatar.svg)](https://opencollective.com/cloudcmd/backer/6/website)
[![](https://opencollective.com/cloudcmd/backer/7/avatar.svg)](https://opencollective.com/cloudcmd/backer/7/website)
[![](https://opencollective.com/cloudcmd/backer/8/avatar.svg)](https://opencollective.com/cloudcmd/backer/8/website)
[![](https://opencollective.com/cloudcmd/backer/9/avatar.svg)](https://opencollective.com/cloudcmd/backer/9/website)
[![](https://opencollective.com/cloudcmd/backer/10/avatar.svg)](https://opencollective.com/cloudcmd/backer/10/website)
[![](https://opencollective.com/cloudcmd/backer/11/avatar.svg)](https://opencollective.com/cloudcmd/backer/11/website)
[![](https://opencollective.com/cloudcmd/backer/12/avatar.svg)](https://opencollective.com/cloudcmd/backer/12/website)
[![](https://opencollective.com/cloudcmd/backer/13/avatar.svg)](https://opencollective.com/cloudcmd/backer/13/website)
[![](https://opencollective.com/cloudcmd/backer/14/avatar.svg)](https://opencollective.com/cloudcmd/backer/14/website)
[![](https://opencollective.com/cloudcmd/backer/15/avatar.svg)](https://opencollective.com/cloudcmd/backer/15/website)
[![](https://opencollective.com/cloudcmd/backer/16/avatar.svg)](https://opencollective.com/cloudcmd/backer/16/website)
[![](https://opencollective.com/cloudcmd/backer/17/avatar.svg)](https://opencollective.com/cloudcmd/backer/17/website)
[![](https://opencollective.com/cloudcmd/backer/18/avatar.svg)](https://opencollective.com/cloudcmd/backer/18/website)
[![](https://opencollective.com/cloudcmd/backer/19/avatar.svg)](https://opencollective.com/cloudcmd/backer/19/website)
[![](https://opencollective.com/cloudcmd/backer/20/avatar.svg)](https://opencollective.com/cloudcmd/backer/20/website)
[![](https://opencollective.com/cloudcmd/backer/21/avatar.svg)](https://opencollective.com/cloudcmd/backer/21/website)
[![](https://opencollective.com/cloudcmd/backer/22/avatar.svg)](https://opencollective.com/cloudcmd/backer/22/website)
[![](https://opencollective.com/cloudcmd/backer/23/avatar.svg)](https://opencollective.com/cloudcmd/backer/23/website)
[![](https://opencollective.com/cloudcmd/backer/24/avatar.svg)](https://opencollective.com/cloudcmd/backer/24/website)
[![](https://opencollective.com/cloudcmd/backer/25/avatar.svg)](https://opencollective.com/cloudcmd/backer/25/website)
[![](https://opencollective.com/cloudcmd/backer/26/avatar.svg)](https://opencollective.com/cloudcmd/backer/26/website)
[![](https://opencollective.com/cloudcmd/backer/27/avatar.svg)](https://opencollective.com/cloudcmd/backer/27/website)
[![](https://opencollective.com/cloudcmd/backer/28/avatar.svg)](https://opencollective.com/cloudcmd/backer/28/website)
[![](https://opencollective.com/cloudcmd/backer/29/avatar.svg)](https://opencollective.com/cloudcmd/backer/29/website)
## Sponsors
Become a sponsor and get your logo on our README on Github with a link to your site. [[Become a sponsor](https://opencollective.com/cloudcmd#sponsor)]
[![](https://opencollective.com/cloudcmd/sponsor/0/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/0/website)
[![](https://opencollective.com/cloudcmd/sponsor/1/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/1/website)
[![](https://opencollective.com/cloudcmd/sponsor/2/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/2/website)
[![](https://opencollective.com/cloudcmd/sponsor/3/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/3/website)
[![](https://opencollective.com/cloudcmd/sponsor/4/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/4/website)
[![](https://opencollective.com/cloudcmd/sponsor/5/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/5/website)
[![](https://opencollective.com/cloudcmd/sponsor/6/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/6/website)
[![](https://opencollective.com/cloudcmd/sponsor/7/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/7/website)
[![](https://opencollective.com/cloudcmd/sponsor/8/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/8/website)
[![](https://opencollective.com/cloudcmd/sponsor/9/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/9/website)
[![](https://opencollective.com/cloudcmd/sponsor/10/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/10/website)
[![](https://opencollective.com/cloudcmd/sponsor/11/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/11/website)
[![](https://opencollective.com/cloudcmd/sponsor/12/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/12/website)
[![](https://opencollective.com/cloudcmd/sponsor/13/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/13/website)
[![](https://opencollective.com/cloudcmd/sponsor/14/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/14/website)
[![](https://opencollective.com/cloudcmd/sponsor/15/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/15/website)
[![](https://opencollective.com/cloudcmd/sponsor/16/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/16/website)
[![](https://opencollective.com/cloudcmd/sponsor/17/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/17/website)
[![](https://opencollective.com/cloudcmd/sponsor/18/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/18/website)
[![](https://opencollective.com/cloudcmd/sponsor/19/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/19/website)
[![](https://opencollective.com/cloudcmd/sponsor/20/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/20/website)
[![](https://opencollective.com/cloudcmd/sponsor/21/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/21/website)
[![](https://opencollective.com/cloudcmd/sponsor/22/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/22/website)
[![](https://opencollective.com/cloudcmd/sponsor/23/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/23/website)
[![](https://opencollective.com/cloudcmd/sponsor/24/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/24/website)
[![](https://opencollective.com/cloudcmd/sponsor/25/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/25/website)
[![](https://opencollective.com/cloudcmd/sponsor/26/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/26/website)
[![](https://opencollective.com/cloudcmd/sponsor/27/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/27/website)
[![](https://opencollective.com/cloudcmd/sponsor/28/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/28/website)
[![](https://opencollective.com/cloudcmd/sponsor/29/avatar.svg)](https://opencollective.com/cloudcmd/sponsor/29/website)
## License
MIT

125
app.json
View file

@ -11,6 +11,7 @@
"folder",
"orthodox"
],
"stack": "heroku-18",
"env": {
"NPM_CONFIG_PRODUCTION": {
"description": "Keep false to install devDependencies and build frontend",
@ -22,6 +23,31 @@
"value": "edward",
"required": false
},
"CLOUDCMD_CONTACT": {
"description": "enable contact",
"value": "true",
"required": false
},
"CLOUDCMD_CONFIG_DIALOG": {
"description": "show config dialog",
"value": "false",
"required": false
},
"CLOUDCMD_CONFIG_AUTH": {
"description": "disable auth change in config dialog",
"value": "false",
"required": false
},
"CLOUDCMD_CONSOLE": {
"description": "enable console",
"value": "true",
"required": false
},
"CLOUDCMD_SYNC_CONSOLE_PATH": {
"description": "sync console path",
"value": "false",
"required": false
},
"CLOUDCMD_TERMINAL": {
"description": "enable terminal",
"value": "true",
@ -32,8 +58,103 @@
"value": "gritty",
"required": false
},
"CLOUDCMD_CONFIG_DIALOG": {
"description": "show config dialog",
"CLOUDCMD_TERMINAL_COMMAND": {
"description": "set command to run in terminal (shell by default)",
"value": "",
"required": false
},
"CLOUDCMD_ONE_FILE_PANEL": {
"description": "show one file panel",
"value": "false",
"required": false
},
"CLOUDCMD_KEYS_PANEL": {
"description": "show keys panel",
"value": "true",
"required": false
},
"CLOUDCMD_NAME": {
"description": "set tab name in web browser",
"value": "",
"required": false
},
"CLOUDCMD_AUTH": {
"description": "enable authorization",
"value": "false",
"required": false
},
"CLOUDCMD_USERNAME": {
"description": "set username",
"value": "root",
"required": false
},
"CLOUDCMD_PASSWORD": {
"description": "set password",
"value": "toor",
"required": false
},
"CLOUDCMD_ROOT": {
"description": "set root dir",
"value": "",
"required": false
},
"CLOUDCMD_VIM": {
"description": "enable vim hot keys",
"value": "false",
"required": false
},
"CLOUDCMD_COLUMNS": {
"description": "set visible columns",
"value": "name-size-date-owner-mode",
"required": false
},
"CLOUDCMD_OPEN": {
"description": "open web browser when server started",
"value": "false",
"required": false
},
"CLOUDCMD_CONFIRM_COPY": {
"description": "confirm copy",
"value": "true",
"required": false
},
"CLOUDCMD_CONFIRM_MOVE": {
"description": "confirm move",
"value": "true",
"required": false
},
"CLOUDCMD_SHOW_FILE_NAME": {
"description": "show file name in view and edit",
"value": "false",
"required": false
},
"CLOUDCMD_EXPORT": {
"description": "enable export of config through a server",
"value": "false",
"required": false
},
"CLOUDCMD_EXPORT_TOKEN": {
"description": "authorization token used by export server",
"value": "root",
"required": false
},
"CLOUDCMD_IMPORT": {
"description": "enable import of config",
"value": "false",
"required": false
},
"CLOUDCMD_IMPORT_TOKEN": {
"description": "authorization token used to connect to export server",
"value": "root",
"required": false
},
"CLOUDCMD_IMPORT_URL": {
"description": "url of an import server",
"value": "http://localhost:8000",
"required": false
},
"CLOUDCMD_IMPORT_LISTEN": {
"description": "enable listen on config updates from import server",
"value": "false",
"required": false
}

View file

@ -1,24 +1,50 @@
#!/usr/bin/env node
'use strict';
import process from 'node:process';
import {promisify} from 'node:util';
import {tryToCatch} from 'try-to-catch';
import parse from 'yargs-parser';
import exit from '../server/exit.js';
import {createConfig, configPath} from '../server/config.js';
import * as env from '../server/env.js';
import prefixer from '../server/prefixer.js';
import * as validate from '../server/validate.js';
import Info from '../package.json' with {
type: 'json',
};
const Info = require('../package');
const DIR_SERVER = '../server/';
process.on('unhandledRejection', exit);
const exit = require(DIR_SERVER + 'exit');
const config = require(DIR_SERVER + 'config');
const env = require(DIR_SERVER + 'env');
const isUndefined = (a) => typeof a === 'undefined';
const choose = (a, b) => {
if (!a && typeof a !== 'boolean')
if (isUndefined(a))
return b;
return a;
};
const argv = process.argv;
const args = require('minimist')(argv.slice(2), {
const config = createConfig({
configPath,
});
const maybeRoot = (a) => {
if (a === '.')
return process.cwd();
return a;
};
const yargsOptions = {
configuration: {
'strip-aliased': true,
'strip-dashed': true,
},
coerce: {
root: maybeRoot,
},
string: [
'name',
'port',
'password',
'username',
@ -27,7 +53,16 @@ const args = require('minimist')(argv.slice(2), {
'packer',
'root',
'prefix',
'prefix-socket',
'terminal-path',
'terminal-command',
'columns',
'menu',
'theme',
'import-url',
'import-token',
'export-token',
'dropbox-token',
],
boolean: [
'auth',
@ -36,50 +71,91 @@ const args = require('minimist')(argv.slice(2), {
'server',
'online',
'open',
'minify',
'progress',
'config-dialog',
'config-auth',
'config-port',
'console',
'sync-console-path',
'contact',
'terminal',
'one-panel-mode',
'html-dialogs'
'terminal-auto-restart',
'one-file-panel',
'confirm-copy',
'confirm-move',
'show-config',
'show-dot-files',
'show-file-name',
'vim',
'keys-panel',
'color',
'export',
'import',
'import-listen',
'log',
'zip',
'dropbox',
],
default: {
server : true,
auth : config('auth'),
port : config('port'),
minify : config('minify'),
online : config('online'),
open : config('open'),
editor : choose(env('editor'), config('editor')),
packer : config('packer') || 'tar',
zip : config('zip'),
username : config('username'),
root : config('root'),
prefix : config('prefix'),
progress : config('progress'),
console : config('console'),
terminal : choose(env.bool('terminal'), config('terminal')),
'server': true,
'name': choose(env.parse('name'), config('name')),
'auth': choose(env.bool('auth'), config('auth')),
'port': config('port'),
'online': config('online'),
'open': choose(env.bool('open'), config('open')),
'editor': env.parse('editor') || config('editor'),
'menu': env.parse('menu') || config('menu'),
'packer': config('packer') || 'tar',
'zip': config('zip'),
'username': env.parse('username') || config('username'),
'root': choose(env.parse('root'), config('root')),
'prefix': choose(env.parse('prefix'), config('prefix')),
'console': choose(env.bool('console'), config('console')),
'contact': choose(env.bool('contact'), config('contact')),
'terminal': choose(env.bool('terminal'), config('terminal')),
'columns': env.parse('columns') || config('columns') || '',
'theme': env.parse('theme') || config('theme') || '',
'vim': choose(env.bool('vim'), config('vim')),
'log': choose(env.bool('log'), config('log')),
'terminal-path': env('terminal_path') || config('terminalPath'),
'import-url': env.parse('import_url') || config('importUrl'),
'import-listen': choose(env.bool('import_listen'), config('importListen')),
'import': choose(env.bool('import'), config('import')),
'export': choose(env.bool('export'), config('export')),
'prefix-socket': config('prefixSocket'),
'show-dot-files': choose(env.bool('show_dot_files'), config('showDotFiles')),
'show-file-name': choose(env.bool('show_file_name'), config('showFileName')),
'sync-console-path': choose(env.bool('sync_console_path'), config('syncConsolePath')),
'config-dialog': choose(env.bool('config_dialog'), config('configDialog')),
'one-panel-mode': config('onePanelMode'),
'html-dialogs': config('htmlDialogs')
'config-auth': choose(env.bool('config_auth'), config('configAuth')),
'config-port': choose(env.bool('config_port'), config('configPort')),
'terminal-path': env.parse('terminal_path') || config('terminalPath'),
'terminal-command': env.parse('terminal_command') || config('terminalCommand'),
'terminal-auto-restart': choose(env.bool('terminal_auto_restart'), config('terminalAutoRestart')),
'one-file-panel': choose(env.bool('one_file_panel'), config('oneFilePanel')),
'confirm-copy': choose(env.bool('confirm_copy'), config('confirmCopy')),
'confirm-move': choose(env.bool('confirm_move'), config('confirmMove')),
'keys-panel': env.bool('keys_panel') || config('keysPanel'),
'import-token': env.parse('import_token') || config('importToken'),
'export-token': env.parse('export_token') || config('exportToken'),
'dropbox': config('dropbox'),
'dropbox-token': config('dropboxToken') || '',
},
alias: {
v: 'version',
h: 'help',
p: 'password',
o: 'online',
u: 'username',
s: 'save',
a: 'auth',
c: 'config'
version: 'v',
help: 'h',
password: 'p',
online: 'o',
username: 'u',
save: 's',
auth: 'a',
config: 'c',
},
unknown: (cmd) => {
exit('\'%s\' is not a cloudcmd option. See \'cloudcmd --help\'.', cmd);
}
});
};
const {argv} = process;
const args = parse(argv.slice(2), yargsOptions);
if (args.version)
version();
@ -88,60 +164,112 @@ else if (args.help)
else
main();
function main() {
if (args.repl)
repl();
async function main() {
const {validateArgs} = await import('@putout/cli-validate-args');
checkUpdate();
const error = await validateArgs(args, [
...yargsOptions.boolean,
...yargsOptions.string,
]);
if (error)
return exit(error);
if (args.repl)
await repl();
validate.columns(args.columns);
validate.theme(args.theme);
port(args.port);
config('name', args.name);
config('auth', args.auth);
config('online', args.online);
config('open', args.open);
config('minify', args.minify);
config('username', args.username);
config('progress', args.progress);
config('console', args.console);
config('syncConsolePath', args.syncConsolePath);
config('showDotFiles', args.showDotFiles);
config('showFileName', args.showFileName);
config('contact', args.contact);
config('terminal', args.terminal);
config('terminalPath', args['terminal-path']);
config('terminalPath', args.terminalPath);
config('terminalCommand', args.terminalCommand);
config('terminalAutoRestart', args.terminalAutoRestart);
config('editor', args.editor);
config('prefix', args.prefix);
config('root', args.root);
config('htmlDialogs', args['html-dialogs']);
config('onePanelMode', args['one-panel-mode']);
config('configDialog', args['config-dialog']);
config('menu', args.menu);
config('prefix', prefixer(args.prefix));
config('prefixSocket', prefixer(args.prefixSocket));
config('root', args.root || '/');
config('vim', args.vim);
config('theme', args.theme);
config('columns', args.columns);
config('log', args.log);
config('confirmCopy', args.confirmCopy);
config('confirmMove', args.confirmMove);
config('oneFilePanel', args.oneFilePanel);
config('configDialog', args.configDialog);
config('configAuth', args.configAuth);
config('configPort', args.configPort);
config('keysPanel', args.keysPanel);
config('export', args.export);
config('exportToken', args.exportToken);
config('import', args.import);
config('importToken', args.importToken);
config('importListen', args.importListen);
config('importUrl', args.importUrl);
readConfig(args.config);
config('dropbox', args.dropbox);
config('dropboxToken', args.dropboxToken);
await readConfig(args.config);
const options = {
root: args.root || '/', /* --no-root */
editor: args.editor,
packer: args.packer,
prefix: args.prefix
root: config('root'),
editor: config('editor'),
packer: config('packer'),
prefix: config('prefix'),
prefixSocket: config('prefixSocket'),
columns: config('columns'),
theme: config('theme'),
menu: config('menu'),
};
if (args.password)
config('password', getPassword(args.password));
const password = env.parse('password') || args.password;
validateRoot(options.root);
if (password)
config('password', await getPassword(password));
if (!args.save)
return start(options);
validateRoot(options.root, config);
config.save(() => {
start(options);
});
if (args.showConfig)
await showConfig();
const {distributeImport} = await import('../server/distribute/import.js');
const importConfig = promisify(distributeImport);
await start(options, config);
if (args.save)
config.write();
await tryToCatch(checkUpdate);
await importConfig(config);
}
function validateRoot(root) {
const validate = require(DIR_SERVER + 'validate');
validate.root(root, console.log);
function validateRoot(root, config) {
validate.root(root, config);
if (root === '/')
return;
if (config('log'))
console.log(`root: ${root}`);
}
function getPassword(password) {
const criton = require('criton');
async function getPassword(password) {
const {default: criton} = await import('criton');
return criton(password, config('algo'));
}
@ -149,93 +277,86 @@ function version() {
console.log('v' + Info.version);
}
function start(config) {
const SERVER = DIR_SERVER + 'server';
async function start(options, config) {
if (!args.server)
return;
if (args.server)
require(SERVER)(config);
const {default: server} = await import('../server/server.js');
server(options, config);
}
function port(arg) {
const number = parseInt(arg, 10);
if (!isNaN(number))
config('port', number);
else
exit('cloudcmd --port: should be a number');
return config('port', number);
exit('cloudcmd --port: should be a number');
}
function readConfig(name) {
async function showConfig() {
const {showConfig} = await import('../server/show-config.js');
const data = showConfig(config('*'));
console.log(data);
}
async function readConfig(name) {
if (!name)
return;
const fs = require('fs');
const tryCatch = require('try-catch');
const jju = require('jju');
const {default: forEachKey} = await import('for-each-key');
const readjsonSync = (name) => jju.parse(fs.readFileSync(name, 'utf8'), {
mode: 'json'
const data = await import(name, {
with: {
type: 'json',
},
});
let data;
const error = tryCatch(() => {
data = readjsonSync(name);
});
if (error)
return exit(error.message);
Object.keys(data).forEach((item) => {
config(item, data[item]);
});
forEachKey(config, data);
}
function help() {
const bin = require('../json/help');
async function help() {
const {default: bin} = await import('../json/help.json', {
with: {
type: 'json',
},
});
const {default: forEachKey} = await import('for-each-key');
const {default: currify} = await import('currify');
const usage = 'Usage: cloudcmd [options]';
const url = Info.homepage;
const log = currify((a, b, c) => console.log(a, b, c));
console.log(usage);
console.log('Options:');
Object.keys(bin).forEach((name) => {
console.log(' %s %s', name, bin[name]);
});
forEachKey(log(' %s %s'), bin);
console.log('\nGeneral help using Cloud Commander: <%s>', url);
}
function repl() {
async function repl() {
console.log('REPL mode enabled (telnet localhost 1337)');
require(DIR_SERVER + 'repl');
await import('../server/repl.js');
}
function checkUpdate() {
const load = require('package-json');
const noop = () => {};
async function checkUpdate() {
const {default: load} = await import('package-json');
const {version} = await load(Info.name, 'latest');
load(Info.name, 'latest')
.then(showUpdateInfo)
.catch(noop);
await showUpdateInfo(version);
}
function showUpdateInfo(data) {
const version = data.version;
async function showUpdateInfo(version) {
if (version === Info.version)
return;
if (version !== Info.version) {
const chalk = require('chalk');
const rendy = require('rendy');
const latest = rendy('update available: {{ latest }}', {
latest: chalk.green.bold('v' + version),
});
const current = chalk.dim(rendy('(current: v{{ current }})', {
current: Info.version
}));
console.log('%s %s', latest, current);
}
const {default: chalk} = await import('chalk');
const latestVersion = chalk.green.bold(`v${version}`);
const latest = `update available: ${latestVersion}`;
const current = chalk.dim(`(current: v${Info.version})`);
console.log('%s %s', latest, current);
}

26
bin/cloudcmd.spec.js Normal file
View file

@ -0,0 +1,26 @@
import {spawnSync} from 'node:child_process';
import {test} from 'supertape';
import info from '../package.json' with {
type: 'json',
};
const cliPath = new URL('cloudcmd.js', import.meta.url).pathname;
test('cloudcmd: bin: cli: -h', (t) => {
const {stdout} = spawnSync(cliPath, ['-h'], {
encoding: 'utf8',
});
t.match(stdout, `Options`);
t.end();
});
test('cloudcmd: bin: cli: -v', (t) => {
const {version} = info;
const {stdout} = spawnSync(cliPath, ['-v'], {
encoding: 'utf8',
});
t.match(stdout, `v${version}`);
t.end();
});

View file

@ -1,29 +0,0 @@
#!/usr/bin/env node
'use strict';
const fs = require('fs');
const path = require('path');
const dir = path.join(__dirname, '../server');
const dir_ = path.join(__dirname, '../legacy/server');
const setDir = (name) => {
return path.join(dir_, name);
};
fs.readdirSync(dir)
.map(fillFile)
.map(writeFile);
function fillFile(name) {
return {
name: setDir(name),
data: `module.exports = require(\'../../server_/${name}\');`
};
}
function writeFile({name, data}) {
return fs.writeFileSync(name, data);
}

View file

@ -1,70 +1,72 @@
#!/usr/bin/env node
'use strict';
import {promisify} from 'node:util';
import process from 'node:process';
import {tryToCatch} from 'try-to-catch';
import minor from 'minor';
import _place from 'place';
import {rendy} from 'rendy';
import shortdate from 'shortdate';
import Info from '../package.json' with {
type: 'json',
};
const DIR = '../';
const Info = require(DIR + 'package');
const place = promisify(_place);
const minor = require('minor');
const place = require('place');
const rendy = require('rendy');
const shortdate = require('shortdate');
await main();
const ERROR = Error('ERROR: version is missing. release --patch|--minor|--major');
main((error) => {
async function main() {
const history = '## Version history\n\n';
const link = '//github.com/coderaiser/cloudcmd/releases/tag/';
const template = '- ' +
'*{{ date }}*, ' +
'**[v{{ version }}]' +
'(' +
link +
'v{{ version }})**\n';
const {version} = Info;
const [error, versionNew] = await tryToCatch(cl);
if (error)
console.error(error.message);
});
function main(callback) {
const history = 'Version history\n---------------\n';
const link = '//github.com/coderaiser/cloudcmd/releases/tag/';
const template = '- *{{ date }}*, ' +
'**[v{{ version }}]' +
'(' + link + 'v{{ version }})**\n';
return console.error(error);
const version = Info.version;
await replaceVersion('README.md', version, versionNew);
await replaceVersion('HELP.md', version, versionNew);
cl((error, versionNew) => {
if (error) {
callback(error);
} else {
replaceVersion('README.md', version, versionNew, callback);
replaceVersion('HELP.md', version, versionNew, function() {
const historyNew = history + rendy(template, {
date : shortdate(),
version : versionNew
});
replaceVersion('HELP.md', history, historyNew, callback);
});
}
});
const historyNew = history +
rendy(template, {
date: shortdate(),
version: versionNew,
});
await replaceVersion('HELP.md', history, historyNew);
}
function replaceVersion(name, version, versionNew, callback) {
place(name, version, versionNew, (error) => {
let msg;
if (!error)
msg = 'done: ' + name;
callback(error, msg);
});
async function replaceVersion(name, version, versionNew) {
const [error] = await tryToCatch(place, name, version, versionNew);
if (error)
return console.error(error);
console.log(`done: ${name}`);
}
function cl(callback) {
const argv = process.argv;
async function cl() {
const {argv} = process;
const length = argv.length - 1;
const last = process.argv[length];
const regExp = /^--(major|minor|patch)$/;
const [, match] = last.match(regExp) || [];
if (!regExp.test(last))
return callback(ERROR);
console.log(last);
callback(null, getVersionNew(last, match));
if (!regExp.test(last))
throw Error('ERROR: version is missing. release --patch|--minor|--major');
return getVersionNew(last, match);
}
function getVersionNew(last, match) {
@ -73,4 +75,3 @@ function getVersionNew(last, match) {
return last.substr(3);
}

View file

@ -1,40 +0,0 @@
{
"name": "cloudcmd",
"homepage": "https://github.com/coderaiser/cloudcmd",
"authors": [
"coderaiser <mnemonic.enemy@gmail.com>"
],
"description": "orthodox web file manager with console and editor",
"main": "bin/cloudcmd.js",
"keywords": [
"console",
"editor",
"file",
"file manager",
"folder",
"orthodox",
"view",
"copy",
"rename",
"move",
"delete",
"file operation"
],
"license": "MIT",
"private": true,
"ignore": [
"node_modules",
"modules",
"test"
],
"dependencies": {
"domtokenlist-shim": "~1.1.0",
"findit": "1.1.7",
"menu": "~1.0.2",
"olark": "^1.0.0",
"jquery": "3.2.1",
"fancybox": "^2.1.6",
"philip": "1.3.6",
"smalltalk": "2.3.1"
}
}

View file

@ -1,51 +1,59 @@
'use strict';
const itype = require('itype/legacy');
const rendy = require('rendy');
const exec = require('execon');
const Images = require('./dom/images');
const join = require('join-io/www/join');
const {
import process from 'node:process';
import Emitify from 'emitify';
import inherits from 'inherits';
import {rendy} from 'rendy';
import load from 'load.js';
import {tryToCatch} from 'try-to-catch';
import {addSlashToEnd} from 'format-io';
import pascalCase from 'just-pascal-case';
import currify from 'currify';
import {
apiURL,
formatMsg,
buildFromJSON,
} = require('../common/cloudfunc');
} from '#common/cloudfunc';
import * as Images from '#dom/images';
import {unregisterSW} from './sw/register.js';
import {getJsonFromFileTable} from './get-json-from-file-table.js';
import {Key} from './key/index.js';
import {loadModule} from './load-module.js';
/* global Util, DOM */
const noJS = (a) => a.replace(/.js$/, '');
module.exports = new CloudCmdProto(Util, DOM);
const isDev = process.env.NODE_ENV === 'development';
function CloudCmdProto(Util, DOM) {
let Key;
let Debug;
let Listeners;
const log = (str) => {
if (!Debug)
return;
console.log(str);
};
inherits(CloudCmdProto, Emitify);
export const createCloudCmd = ({DOM, Listeners}) => {
return new CloudCmdProto({
DOM,
Listeners,
});
};
load.addErrorListener((e, src) => {
const msg = `file ${src} could not be loaded`;
Images.show.error(msg);
});
function CloudCmdProto({DOM, Listeners}) {
Emitify.call(this);
const CloudCmd = this;
const Info = DOM.CurrentInfo;
const Storage = DOM.Storage;
const Files = DOM.Files;
this.log = log;
this.PREFIX = '';
this.PREFIX_URL = '';
this.DIRCLIENT = '/dist/';
this.DIRCLIENT_MODULES = this.DIRCLIENT + 'modules/';
const {Storage, Files} = DOM;
this.MIN_ONE_PANEL_WIDTH = 1155;
this.HOST = location.origin ||
location.protocol + '//' + location.host;
const TITLE = 'Cloud Commander';
this.TITLE = TITLE;
this.log = () => {
if (!isDev)
return;
};
this.prefix = '';
this.prefixSocket = '';
this.prefixURL = '';
this.MIN_ONE_PANEL_WIDTH = DOM.getCSSVar('min-one-panel-width');
this.HOST = location.origin || location.protocol + '//' + location.host;
this.sort = {
left: 'name',
right: 'name',
@ -56,43 +64,24 @@ function CloudCmdProto(Util, DOM) {
right: 'asc',
};
log.enable = () => {
Debug = true;
};
log.disable = () => {
Debug = false;
};
const kebabToCamelCase = Util.kebabToCamelCase;
/**
* Функция привязываеться ко всем ссылкам и
* загружает содержимое каталогов
*
* @param params - {
* paramLink - ссылка
* needRefresh - необходимость обязательной загрузки данных с сервера
* panel
* }
* @param callback
*/
this.loadDir = (params, callback) => {
var imgPosition;
var panelChanged;
var p = params;
this.changeDir = async (path, overrides = {}) => {
const {
isRefresh,
panel,
history = true,
noCurrent,
currentName,
} = overrides;
const refresh = p.isRefresh;
const panel = p.panel;
const history = p.history;
const noCurrent = p.noCurrent;
const currentName = p.currentName;
const refresh = isRefresh;
let panelChanged;
if (!noCurrent)
if (panel && panel !== Info.panel) {
DOM.changePanel();
panelChanged = true;
}
if (!noCurrent && panel && panel !== Info.panel) {
DOM.changePanel();
panelChanged = true;
}
let imgPosition;
if (panelChanged || refresh || !history)
imgPosition = 'top';
@ -100,137 +89,50 @@ function CloudCmdProto(Util, DOM) {
Images.show.load(imgPosition, panel);
/* загружаем содержимое каталога */
ajaxLoad(p.path, {
await ajaxLoad(addSlashToEnd(path), {
refresh,
history,
noCurrent,
currentName,
}, panel, callback);
showDotFiles: CloudCmd.config('showDotFiles'),
}, panel);
};
/**
* function load modules
* @params = {name, path, func, dobefore, arg}
*/
function loadModule(params) {
var name, path, func, doBefore,
funcName, isContain;
if (params) {
name = params.name,
path = params.path,
func = params.func,
funcName = params.funcName,
doBefore = params.dobefore;
if (path && !name)
name = kebabToCamelCase(path);
isContain = /\.js/.test(path);
if (!isContain)
path += '.js';
if (!CloudCmd[name]) {
CloudCmd[name] = (...args) => {
const prefix = CloudCmd.PREFIX;
const pathFull = prefix + CloudCmd.DIRCLIENT_MODULES + path;
exec(doBefore);
return DOM.load.js(pathFull, func ||
function(error) {
var Proto = CloudCmd[name];
if (!error && itype.function(Proto))
CloudCmd[name] = applyConstructor(Proto, args);
});
};
CloudCmd[name][funcName] = CloudCmd[name];
}
}
}
/*
* apply arguemnts to constructor
*
* @param constructor
* @param args
*/
function applyConstructor(constructor, args) {
var F = function () {
return constructor.apply(this, args);
};
F.prototype = constructor.prototype;
return new F();
}
/**
* Конструктор CloudClient, который
* выполняет весь функционал по
* инициализации
*/
this.init = (prefix, config) => {
const func = () => {
exec.series([
initModules,
baseInit,
loadPlugins,
() => {
CloudCmd.route(location.hash);
}
]);
};
const funcBefore = (callback) => {
const src = prefix + '/join:' + [
CloudCmd.DIRCLIENT_MODULES + 'polyfill.js',
'/modules/domtokenlist-shim/dist/domtokenlist.min.js',
].join(':');
DOM.loadJquery(() => {
DOM.load.js(src, callback);
});
};
CloudCmd.PREFIX = prefix;
CloudCmd.PREFIX_URL = prefix + apiURL;
this.init = async (prefix, config) => {
CloudCmd.prefix = prefix;
CloudCmd.prefixURL = `${prefix}${apiURL}`;
CloudCmd.prefixSocket = config.prefixSocket;
CloudCmd.DIR_DIST = `${prefix}/dist`;
CloudCmd.DIR_MODULES = `${this.DIR_DIST}/modules`;
CloudCmd.config = (key) => config[key];
CloudCmd.config.if = currify((key, fn, a) => config[key] && fn(a));
CloudCmd._config = (key, value) => {
/*
* should be called from config.js only
* after successful update on server
*/
if (key === 'password')
return;
config[key] = value;
};
if (config.onePanelMode)
if (config.oneFilePanel)
CloudCmd.MIN_ONE_PANEL_WIDTH = Infinity;
exec.if(document.body.scrollIntoViewIfNeeded, func, funcBefore);
};
function loadPlugins(callback) {
const prefix = CloudCmd.PREFIX;
const plugins = prefix + '/plugins.js';
if (!document.body.scrollIntoViewIfNeeded)
await load.js(`${CloudCmd.DIR_MODULES}/polyfill.js`);
DOM.load.js(plugins, callback);
}
this.join = (urls) => {
const prefix = CloudCmd.PREFIX;
await initModules();
await baseInit();
if (!Array.isArray(urls))
throw Error('urls should be array!');
const noPrefixUrls = urls.map((url) => {
return url.replace(prefix, '');
});
return prefix + join(noPrefixUrls);
CloudCmd.route(location.hash);
};
this.route = (path) => {
@ -240,14 +142,15 @@ function CloudCmdProto(Util, DOM) {
return;
const [kebabModule] = query;
const module = kebabToCamelCase(kebabModule.slice(1));
const module = noJS(pascalCase(kebabModule.slice(1)));
const file = query[1];
const [, file] = query;
const current = DOM.getCurrentByName(file);
if (file && !current) {
const msg = formatMsg('set current file', file, 'error');
CloudCmd.log(msg);
return;
}
@ -255,124 +158,122 @@ function CloudCmdProto(Util, DOM) {
CloudCmd.execFromModule(module, 'show');
};
this.logOut = () => {
const url = CloudCmd.PREFIX + '/logout';
this.logOut = async () => {
const url = CloudCmd.prefix + '/logout';
const error = () => document.location.reload();
const {prefix} = CloudCmd;
DOM.load.ajax({url, error});
await DOM.Storage.clear();
unregisterSW(prefix);
DOM.load.ajax({
url,
error,
});
};
function initModules(callback) {
exec.if(CloudCmd.Key, () => {
Key = new CloudCmd.Key();
CloudCmd.Key = Key;
Key.bind();
}, (func) => {
/* привязываем клавиши к функциям */
const path = 'key.js';
loadModule({
path,
func
});
});
const initModules = async () => {
CloudCmd.Key = Key;
CloudCmd.Key.bind();
Files.get('modules', (error, modules) => {
const showLoad = Images.show.load;
const doBefore = {
'edit': showLoad,
'menu': showLoad,
};
const load = (name, path, dobefore) => {
const isTmpl = path === 'template';
const funcName = isTmpl ? 'get' : 'show';
loadModule({
name,
path,
dobefore,
funcName,
});
};
if (!modules)
modules = [];
modules.local.forEach((module) => {
load(null, module, doBefore[module]);
const [, modules] = await tryToCatch(Files.get, 'modules');
const showLoad = Images.show.load;
const doBefore = {
edit: showLoad,
menu: showLoad,
};
const load = (name, path, dobefore) => {
loadModule({
name,
path,
dobefore,
});
callback();
});
};
if (!modules)
return;
for (const module of modules.local) {
load(null, module, doBefore[module]);
}
};
async function saveCurrentName(currentName) {
await Storage.set('current-name', currentName);
}
function baseInit(callback) {
async function baseInit() {
const files = DOM.getFiles();
CloudCmd.on('current-file', DOM.updateCurrentInfo);
CloudCmd.on('current-name', saveCurrentName);
const name = await Storage.get('current-name');
const currentFile = name && DOM.getCurrentByName(name) || files[0];
/* выделяем строку с первым файлом */
if (files)
DOM.setCurrentFile(files[0], {
DOM.setCurrentFile(currentFile, {
// when hash is present
// it should be handled with this.route
// overwre otherwise
history: !location.hash
history: !location.hash,
});
const dirPath = DOM.getCurrentDirPath();
Listeners = CloudCmd.Listeners;
Listeners.init();
Listeners.setOnPanel('left');
Listeners.setOnPanel('right');
const panels = getPanels();
panels.forEach(Listeners.setOnPanel);
Listeners.initKeysPanel();
Storage.get(dirPath, (error, data) => {
if (!data) {
data = getJSONfromFileTable();
Storage.set(dirPath, data);
}
});
if (!CloudCmd.config('dirStorage'))
return;
callback();
const data = await Storage.get(dirPath);
if (!data)
await Storage.setJson(dirPath, getJsonFromFileTable());
}
this.execFromModule = (moduleName, funcName, ...args) => {
const obj = CloudCmd[moduleName];
const isObj = itype.object(obj);
function getPanels() {
const panels = ['left'];
exec.if(isObj, () => {
const obj = CloudCmd[moduleName];
const func = obj[funcName];
func(...args);
}, obj);
if (CloudCmd.config('oneFilePanel'))
return panels;
return [
...panels,
'right',
];
}
this.execFromModule = async (moduleName, funcName, ...args) => {
await CloudCmd[moduleName]();
const func = CloudCmd[moduleName][funcName];
func(...args);
};
this.refresh = (options = {}, callback) => {
if (!callback && typeof options === 'function') {
callback = options;
options = {};
}
const panel = options.panel || Info.panel;
this.refresh = async (options = {}) => {
const {panel = Info.panel, currentName} = options;
const path = DOM.getCurrentDirPath(panel);
const isRefresh = true;
const history = false;
const noCurrent = options ? options.noCurrent : false;
const currentName = options.currentName;
const noCurrent = options?.noCurrent;
CloudCmd.loadDir({
path,
await CloudCmd.changeDir(path, {
isRefresh,
history,
panel,
noCurrent,
currentName,
}, callback);
});
};
/**
@ -382,177 +283,146 @@ function CloudCmdProto(Util, DOM) {
* @param options
* { refresh, history } - необходимость обновить данные о каталоге
* @param panel
* @param callback
*
*/
function ajaxLoad(path, options, panel, callback) {
const create = (error, json) => {
const RESTful = DOM.RESTful;
const name = options.currentName || Info.name;
const obj = Util.json.parse(json);
const isRefresh = options.refresh;
const noCurrent = options.noCurrent;
if (!isRefresh && json)
return createFileTable(obj, panel, options, callback);
const position = DOM.getPanelPosition(panel);
const sort = CloudCmd.sort[position];
const order = CloudCmd.order[position];
const query = rendy('?sort={{ sort }}&order={{ order }}', {
sort,
order,
});
RESTful.read(path + query, 'json', (error, obj) => {
if (error)
return;
Storage.set(path, obj);
options.sort = sort;
options.order = order;
createFileTable(obj, panel, options, () => {
if (isRefresh && !noCurrent)
DOM.setCurrentByName(name);
exec(callback);
});
});
};
async function ajaxLoad(path, options = {}, panel) {
const {RESTful} = DOM;
if (!options)
options = {};
CloudCmd.log(`reading dir: "${path}";`);
CloudCmd.log('reading dir: "' + path + '";');
const dirStorage = CloudCmd.config('dirStorage');
const json = dirStorage && await Storage.getJson(path);
const name = options.currentName || Info.name;
const {noCurrent, refresh} = options;
if (!refresh && json)
return await createFileTable(json, panel, options);
const position = DOM.getPanelPosition(panel);
const sort = CloudCmd.sort[position];
const order = CloudCmd.order[position];
const query = rendy('?sort={{ sort }}&order={{ order }}', {
sort,
order,
});
const [, newObj] = await RESTful.read(path + query, 'json');
if (!newObj)
// that's OK, error handled by RESTful
return;
options.sort = sort;
options.order = order;
await createFileTable(newObj, panel, options);
if (refresh && !noCurrent)
DOM.setCurrentByName(name);
if (!CloudCmd.config('dirStorage'))
return create();
return;
Storage.get(path, create);
Storage.setJson(path, newObj);
}
/**
* Функция строит файловую таблицу
* @param json - данные о файлах
* @param data - данные о файлах
* @param panelParam
* @param history
* @param callback
* @param options - history, noCurrent, showDotFiles
*/
function createFileTable(json, panelParam, options, callback) {
var history = options.history,
noCurrent = options.noCurrent,
names = ['file', 'path', 'link', 'pathLink'];
async function createFileTable(data, panelParam, options) {
const {
history,
noCurrent,
showDotFiles,
} = options;
Files.get(names, function(error, templFile, templPath, templLink, templPathLink) {
var childNodes, i,
Dialog = DOM.Dialog,
current,
panel = panelParam || DOM.getPanel(),
dir = Info.dir,
name = Info.name;
if (error)
return Dialog.alert(TITLE, error.responseText);
childNodes = panel.childNodes;
i = childNodes.length;
while (i--)
panel.removeChild(panel.lastChild);
panel.innerHTML = buildFromJSON({
sort : options.sort,
order : options.order,
data : json,
id : panel.id,
prefix : CloudCmd.PREFIX,
template : {
file : templFile,
path : templPath,
pathLink : templPathLink,
link : templLink
}
});
Listeners.setOnPanel(panel);
if (!noCurrent) {
if (name === '..' && dir !== '/')
current = DOM.getCurrentByName(dir);
if (!current)
current = DOM.getFiles(panel)[0];
DOM.setCurrentFile(current, {
history: history
});
}
exec(callback);
});
}
/**
* Функция генерирует JSON из html-таблицы файлов и
* используеться при первом заходе в корень
*/
function getJSONfromFileTable() {
var name, size, owner, mode, ret,
path = DOM.getCurrentDirPath(),
infoFiles = Info.files || [],
fileTable = {
path : path,
files : []
const names = [
'file',
'path',
'link',
'pathLink',
];
const [error, [
file,
path,
link,
pathLink,
]] = await tryToCatch(Files.get, names);
if (error)
return DOM.Dialog.alert(error.responseText);
const panel = panelParam || DOM.getPanel();
const {prefix} = CloudCmd;
const {dir, name} = Info;
const {childNodes} = panel;
let i = childNodes.length;
while (i--)
panel.removeChild(panel.lastChild);
panel.innerHTML = buildFromJSON({
sort: options.sort,
order: options.order,
data,
id: panel.id,
prefix,
showDotFiles,
template: {
file,
path,
pathLink,
link,
},
files = fileTable.files;
[].forEach.call(infoFiles, function(current) {
name = DOM.getCurrentName(current);
size = DOM.getCurrentSize(current);
owner = DOM.getCurrentOwner(current);
mode = DOM.getCurrentMode(current);
if (name !== '..')
files.push({
name : name,
size : size,
mode : mode,
owner : owner
});
});
ret = Util.json.stringify(fileTable);
Listeners.setOnPanel(panel);
return ret;
}
this.goToParentDir = () => {
let path = Info.dirPath;
const dir = Info.dir;
const parentPath = Info.parentDirPath;
if (path === Info.parentDirPath)
return;
path = parentPath;
CloudCmd.loadDir({path}, () => {
const panel = Info.panel;
let current = DOM.getCurrentByName(dir);
if (!noCurrent) {
let current;
if (name === '..' && dir !== '/')
current = DOM.getCurrentByName(dir);
if (!current)
current = DOM.getFiles(panel)[0];
[current] = DOM.getFiles(panel);
DOM.setCurrentFile(current, {
history
history,
});
CloudCmd.emit('active-dir', Info.dirPath);
}
}
this.goToParentDir = async () => {
const {
dir,
dirPath,
parentDirPath,
panel,
} = Info;
if (dirPath === parentDirPath)
return;
const path = parentDirPath;
await CloudCmd.changeDir(path);
const current = DOM.getCurrentByName(dir);
const [first] = DOM.getFiles(panel);
DOM.setCurrentFile(current || first, {
history,
});
};
}

View file

@ -1,44 +1,74 @@
'use strict';
import '../css/main.css';
import process from 'node:process';
import wraptile from 'wraptile';
import load from 'load.js';
import * as Util from '#common/util';
import * as CloudFunc from '#common/cloudfunc';
import DOM from '#dom';
import {registerSW, listenSW} from './sw/register.js';
import {initSortPanel, sortPanel} from './sort.js';
import {createCloudCmd} from './client.js';
import * as Listeners from './listeners/index.js';
// prevent additional loading of exec by spero, remedy, ishtar, salam, omnes
window.exec = require('execon');
const isDev = process.env.NODE_ENV === 'development';
// prevent additional loading of emitify
window.Emitify = require('emitify/legacy');
export default init;
window.CloudCmd = (config) => {
window.Promise = window.Promise || require('es6-promise');
window.Util = require('../common/util');
window.CloudFunc = require('../common/cloudfunc');
const DOM = require('./dom');
window.DOM = DOM;
window.CloudCmd = require('./client');
const Dialog = require('./dom/dialog');
const prefix = getPrefix(config.prefix);
const {htmlDialogs} = config;
DOM.Dialog = Dialog(prefix, {
htmlDialogs
globalThis.CloudCmd = init;
async function init(config) {
globalThis.CloudCmd = createCloudCmd({
DOM,
Listeners,
});
globalThis.DOM = DOM;
globalThis.Util = Util;
globalThis.CloudFunc = CloudFunc;
require('./listeners');
require('./key');
require('./sort');
await register(config);
window.CloudCmd.init(prefix, config);
};
initSortPanel();
globalThis.CloudCmd.sortPanel = sortPanel;
const prefix = getPrefix(config.prefix);
globalThis.CloudCmd.init(prefix, config);
if (globalThis.CloudCmd.config('menu') === 'aleman')
setTimeout(() => {
import('https://esm.sh/@putout/processor-html');
import('https://esm.sh/@putout/bundle@5.5');
}, 100);
}
function getPrefix(prefix) {
if (!prefix)
return '';
if (!prefix.indexOf('/'))
return prefix;
return '/' + prefix;
return `/${prefix}`;
}
const onUpdateFound = wraptile(async (config) => {
if (isDev)
return;
const {DOM} = globalThis;
const prefix = getPrefix(config.prefix);
await load.js(`${prefix}/dist/cloudcmd.common.js`);
await load.js(`${prefix}/dist/cloudcmd.js`);
console.log('cloudcmd: sw: updated');
DOM.Events.removeAll();
globalThis.CloudCmd(config);
});
async function register(config) {
const {prefix} = config;
const sw = await registerSW(prefix);
listenSW(sw, 'updatefound', onUpdateFound(config));
}

View file

@ -1,133 +1,124 @@
'use strict';
/* global CloudCmd*/
import * as Storage from '#dom/storage';
import tryToPromiseAll from '../../common/try-to-promise-all.js';
/* global CloudCmd */
const CLASS = 'cut-file';
const COPY = 'copy';
const CUT = 'cut';
const jonny = require('jonny');
const exec = require('execon');
const Storage = require('./storage');
const DOM = require('./');
module.exports = new BufferProto();
function BufferProto() {
const Info = DOM.CurrentInfo;
const CLASS = 'cut-file';
const COPY = 'copy';
const CUT = 'cut';
const TITLE = 'Buffer';
const Buffer = {
cut : callIfEnabled.bind(null, cut),
copy : callIfEnabled.bind(null, copy),
clear : callIfEnabled.bind(null, clear),
paste : callIfEnabled.bind(null, paste)
};
function showMessage(msg) {
DOM.Dialog.alert(TITLE, msg);
}
function getNames() {
const files = DOM.getActiveFiles();
const names = DOM.getFilenames(files);
return names;
}
function addCutClass() {
const files = DOM.getActiveFiles();
files.forEach((element) => {
element.classList.add(CLASS);
});
}
function rmCutClass() {
const files = DOM.getByClassAll(CLASS);
[...files].forEach((element) => {
element.classList.remove(CLASS);
});
}
function callIfEnabled(callback) {
const is = CloudCmd.config('buffer');
if (is)
return callback();
showMessage('Buffer disabled in config!');
}
function copy() {
const names = getNames();
const from = Info.dirPath;
clear();
if (!names.length)
return;
Storage.remove(CUT)
.set(COPY, {
from : from,
names: names
});
}
function cut() {
const names = getNames();
const from = Info.dirPath;
clear();
if (!names.length)
return;
addCutClass();
Storage
.set(CUT, {
from : from,
names: names
});
}
function clear() {
Storage.remove(COPY)
.remove(CUT);
rmCutClass();
}
function paste() {
const copy = Storage.get.bind(Storage, COPY);
const cut = Storage.get.bind(Storage, CUT);
exec.parallel([copy, cut], function(error, cp, ct) {
const opStr = cp ? 'copy' : 'move';
const opData = cp || ct;
const Operation = CloudCmd.Operation;
const msg = 'Path is same!';
const path = Info.dirPath;
if (!error && !cp && !ct)
error = 'Buffer is empty!';
if (error)
return showMessage(error);
const data = jonny.parse(opData);
data.to = path;
if (data.from === path)
return showMessage(msg);
Operation.show(opStr, data);
clear();
});
}
return Buffer;
function showMessage(msg) {
globalThis.DOM.Dialog.alert(msg);
}
function getNames() {
const {DOM} = globalThis;
const files = DOM.getActiveFiles();
return DOM.getFilenames(files);
}
function addCutClass() {
const {DOM} = globalThis;
const files = DOM.getActiveFiles();
for (const element of files) {
element.classList.add(CLASS);
}
}
function rmCutClass() {
const {DOM} = globalThis;
const files = DOM.getByClassAll(CLASS);
for (const element of files) {
element.classList.remove(CLASS);
}
}
const checkEnabled = (fn) => () => {
const is = CloudCmd.config('buffer');
if (is)
return fn();
showMessage('Buffer disabled in config!');
};
async function readBuffer() {
const [e, cp, ct] = await tryToPromiseAll([
Storage.getJson(COPY),
Storage.getJson(CUT),
]);
return [
e,
cp,
ct,
];
}
export const copy = checkEnabled(async () => {
const Info = globalThis.DOM.CurrentInfo;
const names = getNames();
const from = Info.dirPath;
await clear();
if (!names.length)
return;
await Storage.remove(CUT);
await Storage.setJson(COPY, {
from,
names,
});
});
export const cut = checkEnabled(async () => {
const Info = globalThis.DOM.CurrentInfo;
const names = getNames();
const from = Info.dirPath;
await clear();
if (!names.length)
return;
addCutClass();
await Storage.setJson(CUT, {
from,
names,
});
});
export const clear = checkEnabled(async () => {
await Storage.remove(COPY);
await Storage.remove(CUT);
rmCutClass();
});
export const paste = checkEnabled(async () => {
const Info = globalThis.DOM.CurrentInfo;
const [error, cp, ct] = await readBuffer();
if (error || !cp && !ct)
return showMessage(error || 'Buffer is empty!');
const opStr = cp ? 'copy' : 'move';
const data = cp || ct;
const {Operation} = CloudCmd;
const msg = 'Path is same!';
const to = Info.dirPath;
if (data.from === to)
return showMessage(msg);
Operation.show(opStr, {
...data,
to,
});
await clear();
});

83
client/dom/cmd.js Normal file
View file

@ -0,0 +1,83 @@
/* global DOM */
const SELECTED_FILE = 'selected-file';
const Cmd = {
getSelectedFiles,
isSelected,
unselectFile,
selectFile,
selectAllFiles,
toggleSelectedFile,
toggleAllSelectedFiles,
};
/**
* selected file check
*
* @param currentFile
*/
export function isSelected(currentFile) {
if (!currentFile)
return false;
return DOM.isContainClass(currentFile, SELECTED_FILE);
}
/**
* select current file
* @param currentFile
*/
export function selectFile(currentFile) {
const current = currentFile || DOM.getCurrentFile();
current.classList.add(SELECTED_FILE);
return Cmd;
}
export function unselectFile(currentFile) {
const current = currentFile || DOM.getCurrentFile();
current.classList.remove(SELECTED_FILE);
return Cmd;
}
export function toggleSelectedFile(currentFile) {
const current = currentFile || DOM.getCurrentFile();
const name = DOM.getCurrentName(current);
if (name === '..')
return Cmd;
current.classList.toggle(SELECTED_FILE);
return Cmd;
}
export function toggleAllSelectedFiles() {
DOM
.getAllFiles()
.map(DOM.toggleSelectedFile);
return Cmd;
}
export function selectAllFiles() {
DOM
.getAllFiles()
.map(DOM.selectFile);
return Cmd;
}
/**
* unified way to get selected files
*
* @currentFile
*/
export function getSelectedFiles() {
const panel = DOM.getPanel();
const selected = DOM.getByClassAll(SELECTED_FILE, panel);
return Array.from(selected);
}

311
client/dom/current-file.js Normal file
View file

@ -0,0 +1,311 @@
/* global DOM */
/* global CloudCmd */
import createElement from '@cloudcmd/create-element';
import {getTitle, FS} from '#common/cloudfunc';
import {encode, decode} from '#common/entity';
let Title;
const CURRENT_FILE = 'current-file';
const encodeNBSP = (a) => a?.replace('\xa0', '&nbsp;');
const decodeNBSP = (a) => a?.replace('&nbsp;', '\xa0');
export const _CURRENT_FILE = CURRENT_FILE;
/**
* set name from current (or param) file
*
* @param name
* @param current
*/
export const setCurrentName = (name, current) => {
const Info = DOM.CurrentInfo;
const {link} = Info;
const {prefix} = CloudCmd;
const dir = prefix + FS + Info.dirPath;
const encoded = encode(name);
link.title = encoded;
link.href = dir + encoded;
link.innerHTML = encoded;
current.setAttribute('data-name', createNameAttribute(name));
CloudCmd.emit('current-file', current);
return link;
};
/**
* get name from current (or param) file
*
* @param currentFile
*/
export const getCurrentName = (currentFile) => {
const current = currentFile || DOM.getCurrentFile();
if (!current)
return '';
return parseNameAttribute(current.getAttribute('data-name'));
};
/**
* Generate a `data-name` attribute for the given filename
* @param name The string name to encode
*/
const createNameAttribute = (name) => {
const encoded = btoa(encodeURI(name));
return `js-file-${encoded}`;
};
/**
* Parse a `data-name` attribute string back into the original filename
* @param attribute The string we wish to decode
*/
const parseNameAttribute = (attribute) => {
attribute = attribute.replace('js-file-', '');
return decodeNBSP(decodeURI(atob(attribute)));
};
export const _parseNameAttribute = parseNameAttribute;
const parseHrefAttribute = (prefix, attribute) => {
attribute = attribute.replace(RegExp('^' + prefix + FS), '');
return decode(decodeNBSP(attribute));
};
export const _parseHrefAttribute = parseHrefAttribute;
/**
* get current directory path
*/
export const getCurrentDirPath = (panel = DOM.getPanel()) => {
const path = DOM.getByDataName('js-path', panel);
return path.textContent;
};
/**
* get link from current (or param) file
*
* @param currentFile - current file by default
*/
export const getCurrentPath = (currentFile) => {
const current = currentFile || DOM.getCurrentFile();
const [element] = DOM.getByTag('a', current);
const {prefix} = CloudCmd;
return parseHrefAttribute(prefix, element.getAttribute('href'));
};
/**
* get current directory name
*/
export const getCurrentDirName = () => {
const href = DOM
.getCurrentDirPath()
.replace(/\/$/, '');
const substr = href.substr(href, href.lastIndexOf('/'));
return href.replace(`${substr}/`, '') || '/';
};
/**
* get current directory path
*/
export const getParentDirPath = (panel) => {
const path = DOM.getCurrentDirPath(panel);
const dirName = DOM.getCurrentDirName() + '/';
const index = path.lastIndexOf(dirName);
if (path === '/')
return path;
return path.slice(0, index);
};
/**
* get not current directory path
*/
export const getNotCurrentDirPath = () => {
const panel = DOM.getPanel({
active: false,
});
return DOM.getCurrentDirPath(panel);
};
/**
* unified way to get current file
*
* @currentFile
*/
export const getCurrentFile = () => {
return DOM.getByClass(CURRENT_FILE);
};
/**
* get current file by name
*/
export const getCurrentByName = (name, panel = DOM.CurrentInfo.panel) => {
const dataName = 'js-file-' + btoa(encodeURI(encodeNBSP(name)));
return DOM.getByDataName(dataName, panel);
};
/**
* private function that unset currentFile
*
* @currentFile
*/
function unsetCurrentFile(currentFile) {
const is = DOM.isCurrentFile(currentFile);
if (!is)
return;
currentFile.classList.remove(CURRENT_FILE);
}
/**
* unified way to set current file
*/
export const setCurrentFile = (currentFile, options) => {
const o = options;
const currentFileWas = DOM.getCurrentFile();
if (!currentFile)
return DOM;
let pathWas = '';
if (currentFileWas) {
pathWas = DOM.getCurrentDirPath();
unsetCurrentFile(currentFileWas);
}
currentFile.classList.add(CURRENT_FILE);
const path = DOM.getCurrentDirPath();
const name = CloudCmd.config('name');
if (path !== pathWas) {
DOM.setTitle(getTitle({
name,
path,
}));
/* history could be present
* but it should be false
* to prevent default behavior
*/
if (!o || o.history) {
const historyPath = path === '/' ? path : FS + path;
DOM.setHistory(historyPath, null, historyPath);
}
}
/* scrolling to current file */
const CENTER = true;
DOM.scrollIntoViewIfNeeded(currentFile, CENTER);
CloudCmd.emit('current-file', currentFile);
CloudCmd.emit('current-path', path);
CloudCmd.emit('current-name', DOM.getCurrentName(currentFile));
return DOM;
};
export const setCurrentByName = (name) => {
const current = DOM.getCurrentByName(name);
return DOM.setCurrentFile(current);
};
/*
* set current file by position
*
* @param layer - element
* @param - position {x, y}
*/
export const getCurrentByPosition = ({x, y}) => {
const element = document.elementFromPoint(x, y);
const getEl = (el) => {
const {tagName} = el;
const isChild = /A|SPAN|LI/.test(tagName);
if (!isChild)
return null;
if (tagName === 'A')
return el.parentElement.parentElement;
if (tagName === 'SPAN')
return el.parentElement;
return el;
};
const el = getEl(element);
if (el && el.tagName !== 'LI')
return null;
return el;
};
/**
* current file check
*
* @param currentFile
*/
export const isCurrentFile = (currentFile) => {
if (!currentFile)
return false;
return DOM.isContainClass(currentFile, CURRENT_FILE);
};
/**
* set title or create title element
*
* @param name
*/
export const setTitle = (name) => {
if (!Title)
Title = DOM.getByTag('title')[0] || createElement('title', {
innerHTML: name,
parent: document.head,
});
Title.textContent = name;
return DOM;
};
/**
* check is current file is a directory
*
* @param currentFile
*/
export const isCurrentIsDir = (currentFile) => {
const current = currentFile || DOM.getCurrentFile();
const path = DOM.getCurrentPath(current);
const fileType = DOM.getCurrentType(current);
const isZip = path.endsWith('.zip');
const isDir = /^directory(-link)?/.test(fileType);
return isDir || isZip;
};
export const getCurrentType = (currentFile) => {
const current = currentFile || DOM.getCurrentFile();
const el = DOM.getByDataName('js-type', current);
const type = el.className
.split(' ')
.pop();
return type;
};

View file

@ -0,0 +1,308 @@
import {test, stub} from 'supertape';
import {create} from 'auto-globals';
import wraptile from 'wraptile';
import * as currentFile from './current-file.js';
const id = (a) => a;
const returns = wraptile(id);
const {_CURRENT_FILE} = currentFile;
test('current-file: setCurrentName: setAttribute', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const current = create();
const {setAttribute} = current;
currentFile.setCurrentName('hello', current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.calledWith(setAttribute, [
'data-name',
'js-file-aGVsbG8=',
], 'should call setAttribute');
t.end();
});
test('current-file: setCurrentName: setAttribute: cyrillic', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const current = create();
const {setAttribute} = current;
currentFile.setCurrentName('ай', current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.calledWith(setAttribute, [
'data-name',
'js-file-JUQwJUIwJUQwJUI5',
], 'should call setAttribute');
t.end();
});
test('current-file: getCurrentName', (t) => {
const current = create();
current.getAttribute.returns('js-file-Ymlu');
const result = currentFile.getCurrentName(current);
t.equal(result, 'bin');
t.end();
});
test('current-file: emit', (t) => {
const {DOM, CloudCmd} = globalThis;
const emit = stub();
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd({
emit,
});
const current = create();
currentFile.setCurrentName('hello', current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.calledWith(emit, ['current-file', current], 'should call emit');
t.end();
});
test('current-file: setCurrentName: return', (t) => {
const {DOM, CloudCmd} = globalThis;
const link = {};
globalThis.DOM = getDOM({
link,
});
globalThis.CloudCmd = getCloudCmd();
const current = create();
const result = currentFile.setCurrentName('hello', current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.equal(result, link, 'should return link');
t.end();
});
test('current-file: getParentDirPath: result', (t) => {
const {DOM} = globalThis;
const getCurrentDirPath = returns('/D/Films/+++favorite films/');
const getCurrentDirName = returns('+++favorite films');
globalThis.DOM = getDOM({
getCurrentDirPath,
getCurrentDirName,
});
const result = currentFile.getParentDirPath();
const expected = '/D/Films/';
globalThis.DOM = DOM;
t.equal(result, expected, 'should return parent dir path');
t.end();
});
test('current-file: isCurrentFile: no', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const result = currentFile.isCurrentFile();
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.notOk(result);
t.end();
});
test('current-file: isCurrentFile', (t) => {
const {DOM, CloudCmd} = globalThis;
const isContainClass = stub();
globalThis.DOM = getDOM({
isContainClass,
});
globalThis.CloudCmd = getCloudCmd();
const current = {};
currentFile.isCurrentFile(current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.calledWith(isContainClass, [current, _CURRENT_FILE], 'should call isContainClass');
t.end();
});
test('current-file: getCurrentType', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const {getByDataName} = globalThis.DOM;
getByDataName.returns({
className: 'mini-icon directory',
});
const current = create();
currentFile.getCurrentType(current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.calledWith(getByDataName, ['js-type', current]);
t.end();
});
test('current-file: isCurrentIsDir: getCurrentType', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const {getCurrentType} = globalThis.DOM;
const current = create();
currentFile.isCurrentIsDir(current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.calledWith(getCurrentType, [current]);
t.end();
});
test('current-file: isCurrentIsDir: directory', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM({
getCurrentType: stub().returns('directory'),
});
globalThis.CloudCmd = getCloudCmd();
const current = create();
const result = currentFile.isCurrentIsDir(current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.ok(result);
t.end();
});
test('current-file: isCurrentIsDir: directory-link', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM({
getCurrentType: stub().returns('directory-link'),
});
globalThis.CloudCmd = getCloudCmd();
const current = create();
const result = currentFile.isCurrentIsDir(current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.ok(result);
t.end();
});
test('current-file: isCurrentIsDir: file', (t) => {
const {DOM, CloudCmd} = globalThis;
globalThis.DOM = getDOM({
getCurrentType: stub().returns('file'),
});
globalThis.CloudCmd = getCloudCmd();
const current = create();
const result = currentFile.isCurrentIsDir(current);
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
t.notOk(result);
t.end();
});
const getCloudCmd = ({emit} = {}) => ({
prefix: '',
emit: emit || stub(),
});
test('current-file: parseNameAttribute', (t) => {
const result = currentFile._parseNameAttribute('js-file-aGVsbG8mbmJzcDt3b3JsZA==');
const expected = 'hello\xa0world';
t.equal(result, expected);
t.end();
});
test('current-file: parseHrefAttribute', (t) => {
const prefix = '/api/v1';
const result = currentFile._parseHrefAttribute(prefix, '/api/v1/fs/hello&nbsp;world');
const expected = '/hello\xa0world';
t.equal(result, expected);
t.end();
});
function getDOM(overrides = {}) {
const {
link = {},
getCurrentDirPath = stub(),
getCurrentDirName = stub(),
getByDataName = stub(),
isContainClass = stub(),
getCurrentType = stub(),
getCurrentPath = stub().returns(''),
} = overrides;
return {
getCurrentDirPath,
getCurrentDirName,
getCurrentPath,
getByDataName,
isContainClass,
getCurrentType,
CurrentInfo: {
link,
dirPath: '/',
},
};
}

View file

@ -1,56 +1,18 @@
/* global DOM */
/* global smalltalk */
import {tryToCatch} from 'try-to-catch';
import * as smalltalk from 'smalltalk';
'use strict';
const title = 'Cloud Commander';
module.exports = Dialog;
export const alert = (...a) => smalltalk.alert(title, ...a, {
cancel: false,
});
function Dialog(prefix, config) {
if (!(this instanceof Dialog))
return new Dialog(prefix, config);
load(config.htmlDialogs);
function getJsName(htmlDialogs) {
const is = window.Promise;
const js = '.min.js';
const jsName = is ? js : '.poly' + js;
if (!htmlDialogs)
return '.native' + jsName;
return jsName;
}
function load(htmlDialogs) {
const noop = () => {};
const name = 'smalltalk';
const dir = '/modules/' + name + '/dist/';
const jsName = getJsName(htmlDialogs);
const names = [jsName, '.min.css'].map((ext) => {
return prefix + dir + name + ext;
});
DOM.load.parallel(names, noop);
}
const alert = (title, message) => {
return smalltalk.alert(title, message);
};
this.alert = alert;
this.prompt = (title, message, value, options) => {
return smalltalk.prompt(title, message, value, options);
};
this.confirm = (title, message, options) => {
return smalltalk.confirm(title, message, options);
};
this.alert.noFiles = (title) => {
return alert(title, 'No files selected!');
};
}
export const prompt = (...a) => tryToCatch(smalltalk.prompt, title, ...a);
export const confirm = (...a) => tryToCatch(smalltalk.confirm, title, ...a);
export const progress = (...a) => smalltalk.progress(title, ...a);
alert.noFiles = () => {
return smalltalk.alert(title, 'No files selected!', {
cancel: false,
});
};

View file

@ -1,90 +1,64 @@
/* global CloudCmd */
/* global DOM */
/* global DOM, CloudCmd */
import philip from 'philip';
import * as Dialog from '#dom/dialog';
import {FS} from '#common/cloudfunc';
import * as Images from '#dom/images';
'use strict';
const Images = require('./images');
const {FS} = require('../../common/cloudfunc');
module.exports = (items) => {
const Info = DOM.CurrentInfo;
const load = DOM.load;
const Dialog = DOM.Dialog;
export const uploadDirectory = (items) => {
if (items.length)
Images.show('top');
const entries = [...items].map((item) => {
return item.webkitGetAsEntry();
const entries = Array
.from(items)
.map((item) => item.webkitGetAsEntry());
const dirPath = DOM.getCurrentDirPath();
const path = dirPath.replace(/\/$/, '');
const progress = Dialog.progress('Uploading...');
progress.catch(() => {
Dialog.alert('Upload aborted');
uploader.abort();
});
const addDir = (name) => {
return `/modules/${name}/lib/${name}.js`;
};
const array = [
'findit',
'philip'
];
const url = CloudCmd.join(array.map(addDir));
load.js(url, () => {
const path = Info.dirPath
.replace(/\/$/, '');
const uploader = philip(entries, (type, name, data, i, n, callback) => {
const {prefixURL} = CloudCmd;
const full = prefixURL + FS + path + name;
const uploader = window.philip(entries, (type, name, data, i, n, callback) => {
const prefixURL = CloudCmd.PREFIX_URL;
const full = prefixURL + FS + path + name;
let upload;
switch(type) {
case 'file':
upload = uploadFile(full, data);
break;
case 'directory':
upload = uploadDir(full);
break;
}
upload.on('end', callback);
upload.on('progress', (count) => {
const current = percent(i, n);
const next = percent(i + 1, n);
const max = next - current;
const value = current + percent(count, 100, max);
let upload;
switch(type) {
case 'file':
upload = uploadFile(full, data);
break;
case 'directory':
upload = uploadDir(full);
break;
}
upload.on('end', callback);
upload.on('progress', (count) => {
const current = percent(i, n);
const next = percent(i + 1, n);
const max = next - current;
const value = current + percent(count, 100, max);
setProgress(value);
});
progress.setProgress(value);
});
uploader.on('error', (error) => {
Dialog.alert(error);
uploader.abort();
});
uploader.on('progress', setProgress);
uploader.on('end', CloudCmd.refresh);
});
uploader.on('error', (error) => {
Dialog.alert(error);
uploader.abort();
});
uploader.on('end', CloudCmd.refresh);
};
function percent(i, n, per = 100) {
return Math.round(i * per / n);
}
const percent = (i, n, per = 100) => Math.round(i * per / n);
function setProgress(count) {
DOM.Images
.setProgress(count)
.show('top');
}
function uploadFile(url, data) {
return DOM.load.put(url, data);
}
function uploadDir(url) {
return DOM.load.put(url + '?dir');
}
const uploadFile = (url, data) => DOM.load.put(url, data);
const uploadDir = (url) => DOM.load.put(`${url}?dir`);

View file

@ -1,6 +1,15 @@
'use strict';
import currify from 'currify';
const DOM = module.exports;
const DOM = {
show,
hide,
getByClass,
getByClassAll,
getByDataName,
getById,
getByTag,
isContainClass,
};
/**
* check class of element
@ -8,71 +17,76 @@ const DOM = module.exports;
* @param element
* @param className
*/
module.exports.isContainClass = (element, className) => {
export function isContainClass(element, className) {
if (!element)
throw Error('element could not be empty!');
if (!className)
throw Error('className could not be empty!');
const classList = element.classList;
const ret = classList.contains(className);
if (Array.isArray(className))
return className.some(currify(
isContainClass,
element,
));
return ret;
};
const {classList} = element;
return classList.contains(className);
}
/**
* Function search element by tag
* @param tag - className
* @param element - element
*/
module.exports.getByTag = (tag, element = document) => {
export function getByTag(tag, element = document) {
return element.getElementsByTagName(tag);
};
}
/**
* Function search element by id
* @param Id - id
* @param id
* @param element
*/
module.exports.getById = (id, element = document) => {
return element.querySelector('#' + id);
};
export function getById(id, element = document) {
return element.querySelector(`#${id}`);
}
/**
* Function search first element by class name
* @param className - className
* @param element - element
*/
module.exports.getByClass = (className, element = document) => {
export function getByClass(className, element = document) {
return DOM.getByClassAll(className, element)[0];
};
}
module.exports.getByDataName = (attribute, element = document) => {
const selector = '[' + 'data-name="' + attribute + '"]';
export function getByDataName(attribute, element = document) {
const selector = '[' + 'data-name="' + attribute + '"]';
return element.querySelector(selector);
};
}
/**
* Function search element by class name
* @param pClass - className
* @param element - element
* @param className
* @param element
*/
module.exports.getByClassAll = (className, element) => {
export function getByClassAll(className, element) {
return (element || document).getElementsByClassName(className);
};
}
/**
* add class=hidden to element
*
* @param element
*/
module.exports.hide = (element) => {
export function hide(element) {
element.classList.add('hidden');
return DOM;
};
}
module.exports.show = (element) => {
export function show(element) {
element.classList.remove('hidden');
return DOM;
};
}

152
client/dom/dom-tree.spec.js Normal file
View file

@ -0,0 +1,152 @@
import {test, stub} from 'supertape';
import {create} from 'auto-globals';
import {tryCatch} from 'try-catch';
import {
isContainClass,
getByTag,
getById,
getByClass,
getByDataName,
getByClassAll,
hide,
show,
} from './dom-tree.js';
test('dom: isContainClass: no element', (t) => {
const [e] = tryCatch(isContainClass);
t.equal(e.message, 'element could not be empty!', 'should throw when no element');
t.end();
});
test('dom: isContainClass: no className', (t) => {
const [e] = tryCatch(isContainClass, {});
t.equal(e.message, 'className could not be empty!', 'should throw when no element');
t.end();
});
test('dom: isContainClass: contains', (t) => {
const el = create();
const {contains} = el.classList;
const className = 'hello';
isContainClass(el, className);
t.calledWith(contains, [className], 'should call contains');
t.end();
});
test('dom: isContainClass: contains: array', (t) => {
const el = create();
const {contains} = el.classList;
const className = 'hello';
isContainClass(el, ['world', className, 'hello']);
t.calledWith(contains, [className], 'should call contains');
t.end();
});
test('dom: getByTag', (t) => {
const getElementsByTagName = stub();
const element = {
getElementsByTagName,
};
getByTag('div', element);
t.calledWith(getElementsByTagName, ['div'], 'should call getElementsByTagName');
t.end();
});
test('dom: getById', (t) => {
const querySelector = stub();
const element = {
querySelector,
};
getById('my-id', element);
t.calledWith(querySelector, ['#my-id'], 'should call querySelector with id selector');
t.end();
});
test('dom: getByClassAll', (t) => {
const getElementsByClassName = stub();
const element = {
getElementsByClassName,
};
getByClassAll('my-class', element);
t.calledWith(getElementsByClassName, ['my-class'], 'should call getElementsByClassName');
t.end();
});
test('dom: getByClass: calls getByClassAll', (t) => {
const element = {
getElementsByClassName: stub().returns(['first']),
};
const result = getByClass('my-class', element);
t.equal(result, 'first', 'should return first element from class list');
t.end();
});
test('dom: getByDataName', (t) => {
const querySelector = stub();
const element = {
querySelector,
};
getByDataName('hello', element);
t.calledWith(querySelector, ['[data-name="hello"]'], 'should call querySelector with data-name selector');
t.end();
});
test('dom: hide', (t) => {
const add = stub();
const element = {
classList: {
add,
},
};
hide(element);
t.calledWith(add, ['hidden'], 'should add hidden class');
t.end();
});
test('dom: show', (t) => {
const remove = stub();
const element = {
classList: {
remove,
},
};
show(element);
t.calledWith(remove, ['hidden'], 'should remove hidden class');
t.end();
});
test('dom: getByClassAll: without element uses document', (t) => {
const getElementsByClassName = stub();
const prevDocument = globalThis.document;
globalThis.document = {
getElementsByClassName,
};
getByClassAll('my-class');
globalThis.document = prevDocument;
t.calledWith(getElementsByClassName, ['my-class'], 'should fallback to document when no element');
t.end();
});

View file

@ -1,309 +0,0 @@
'use strict';
const itype = require('itype/legacy');
module.exports = new EventsProto();
function EventsProto() {
const Events = this;
function parseArgs(eventName, element, listener, callback) {
let isFunc;
const EVENT_NAME = 1;
const ELEMENT = 0;
const type = itype(eventName);
switch(type) {
default:
if (!/element$/.test(type))
throw Error('unknown eventName: ' + type);
parseArgs(
arguments[EVENT_NAME],
arguments[ELEMENT],
listener,
callback
);
break;
case 'string':
isFunc = itype.function(element);
if (isFunc) {
listener = element;
element = null;
}
if (!element)
element = window;
callback(element, [
eventName,
listener,
false
]);
break;
case 'array':
eventName.forEach((eventName) => {
parseArgs(
eventName,
element,
listener,
callback
);
});
break;
case 'object':
Object.keys(eventName).forEach((name) => {
const eventListener = eventName[name];
parseArgs(
name,
element,
eventListener,
callback
);
});
break;
}
}
/**
* safe add event listener
*
* @param type
* @param element {document by default}
* @param listener
*/
this.add = (type, element, listener) => {
checkType(type);
parseArgs(type, element, listener, function(element, args) {
element.addEventListener.apply(element, args);
});
return Events;
};
/**
* safe add event listener
*
* @param type
* @param listener
* @param element {document by default}
*/
this.addOnce = (type, element, listener) => {
var once = (event) => {
Events.remove(type, element, once);
listener(event);
};
if (!listener) {
listener = element;
element = null;
}
this.add(type, element, once);
return Events;
};
/**
* safe remove event listener
*
* @param type
* @param listener
* @param element {document by default}
*/
this.remove = (type, element, listener) => {
checkType(type);
parseArgs(type, element, listener, (element, args) => {
element.removeEventListener.apply(element, args);
});
return Events;
};
/**
* safe add event keydown listener
*
* @param listener
*/
this.addKey = function(...argsArr) {
const name = 'keydown';
const args = [name].concat(argsArr);
return this.add(...args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmKey = function(...argsArr) {
const name = 'keydown';
const args = [name].concat(argsArr);
return this.remove(...args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addClick = function(...argsArr) {
const name = 'click';
const args = [name].concat(argsArr);
return this.add(...args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmClick = function(...argsArr) {
const name = 'click';
const args = [name].concat(argsArr);
return this.remove(...args);
};
this.addContextMenu = function(...argsArr) {
const name = 'contextmenu';
const args = [name].concat(argsArr);
return this.add(...args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addError = function(...argsArr) {
const name = 'error';
const args = [name].concat(argsArr);
return this.add(...args);
};
/**
* safe add load click listener
*
* @param listener
*/
this.addLoad = function(...argsArr) {
const name = 'load';
const args = [name].concat(argsArr);
return this.add(...args);
};
/**
* crossbrowser create event
*
* @param eventName
* @param keyCode - not necessarily
*/
this.create = function(eventName, keyCode) {
const event = document.createEvent('Event');
event.initEvent(eventName, true, true);
if (keyCode)
event.keyCode = keyCode;
event.isDefaultPrevented = function() {
return this.defaultPrevented;
};
return event;
};
/**
* create keydown event
*
* @param keyCode
*/
this.createKey = function(keyCode) {
return this.create('keydown', keyCode);
};
/**
* create click event
*/
this.createClick = function() {
return this.create('click');
};
/**
* create click event
*/
this.createDblClick = function() {
return this.create('dblclick');
};
/**
* dispatch event
*
* @param event
*/
this.dispatch = (event, element) => {
let customEvent;
const isStr = itype.string(event);
if (isStr)
customEvent = Events.create(event);
else
customEvent = event;
return (element || window).dispatchEvent(customEvent);
};
/**
* dispatch keydown event
*
* @param keyCode
* @param element
*/
this.dispatchKey = function(keyCode, element) {
const event = this.createKey(keyCode);
return this.dispatch(event, element);
};
/**
* dispatch click event
*
* @param element
*/
this.dispatchClick = function(element) {
const event = this.createClick();
return this.dispatch(event, element);
};
/**
* dispatch dblclick event
*
* @param element
*/
this.dispatchDblClick = function(element) {
const event = this.createDblClick();
return this.dispatch(event, element);
};
function checkType(type) {
if (!type)
throw Error('type could not be empty!');
}
}

View file

@ -0,0 +1,15 @@
let list = [];
export const add = (el, name, fn) => {
list.push([
el,
name,
fn,
]);
};
export const clear = () => {
list = [];
};
export const get = () => list;

View file

@ -0,0 +1,37 @@
import {test} from 'supertape';
import * as eventStore from './event-store.js';
test('event-store: get', (t) => {
const el = {};
const name = 'click';
const fn = () => {};
eventStore.add(el, name, fn);
const result = eventStore.get();
const expected = [
[
el,
name,
fn,
],
];
t.deepEqual(result, expected);
t.end();
});
test('event-store: clear', (t) => {
const el = {};
const name = 'click';
const fn = () => {};
eventStore.add(el, name, fn);
eventStore.clear();
const result = eventStore.get();
const expected = [];
t.deepEqual(result, expected);
t.end();
});

203
client/dom/events/index.js Normal file
View file

@ -0,0 +1,203 @@
import itype from 'itype';
import * as EventStore from './event-store.js';
/**
* safe add event listener
*
* @param type
* @param element - document by default
* @param listener
*/
export const add = (type, element, listener) => {
checkType(type);
parseArgs(type, element, listener, (element, args) => {
const [name, fn, options] = args;
element.addEventListener(name, fn, options);
EventStore.add(element, name, fn);
});
return Events;
};
/**
* safe add event listener
*
* @param type
* @param listener
* @param element - document by default
*/
export const addOnce = (type, element, listener) => {
const once = (event) => {
Events.remove(type, element, once);
listener(event);
};
if (!listener) {
listener = element;
element = null;
}
add(type, element, once);
return Events;
};
/**
* safe remove event listener
*
* @param type
* @param listener
* @param element - document by default
*/
export const remove = (type, element, listener) => {
checkType(type);
parseArgs(type, element, listener, (element, args) => {
element.removeEventListener(...args);
});
return Events;
};
/**
* remove all added event listeners
*/
export const removeAll = () => {
const events = EventStore.get();
for (const [el, name, fn] of events)
el.removeEventListener(name, fn);
EventStore.clear();
};
/**
* safe add event keydown listener
*
* @param args
*/
export const addKey = function(...args) {
return add('keydown', ...args);
};
/**
* safe remove event click listener
*
* @param args
*/
export const rmKey = function(...args) {
return Events.remove('keydown', ...args);
};
/**
* safe add event click listener
*/
export const addClick = function(...args) {
return Events.add('click', ...args);
};
/**
* safe remove event click listener
*/
export const rmClick = function(...args) {
return remove('click', ...args);
};
export const addContextMenu = function(...args) {
return add('contextmenu', ...args);
};
/**
* safe add load listener
*/
export const addLoad = function(...args) {
return add('load', ...args);
};
function checkType(type) {
if (!type)
throw Error('type could not be empty!');
}
const getEventOptions = (eventName) => {
if (eventName !== 'touchstart')
return false;
return {
passive: true,
};
};
function parseArgs(eventName, element, listener, callback) {
let isFunc;
const args = [
eventName,
element,
listener,
callback,
];
const EVENT_NAME = 1;
const ELEMENT = 0;
const type = itype(eventName);
switch(type) {
default:
if (!type.endsWith('element'))
throw Error(`unknown eventName: ${type}`);
parseArgs(args[EVENT_NAME], args[ELEMENT], listener, callback);
break;
case 'string':
isFunc = itype.function(element);
if (isFunc) {
listener = element;
element = null;
}
if (!element)
element = window;
callback(element, [
eventName,
listener,
getEventOptions(eventName),
]);
break;
case 'array':
for (const name of eventName) {
parseArgs(name, element, listener, callback);
}
break;
case 'object':
for (const name of Object.keys(eventName)) {
const eventListener = eventName[name];
parseArgs(name, element, eventListener, callback);
}
break;
}
}
const Events = {
add,
addClick,
addContextMenu,
addKey,
addLoad,
addOnce,
remove,
removeAll,
rmClick,
rmKey,
};

View file

@ -1,105 +1,82 @@
/* global CloudCmd */
'use strict';
const itype = require('itype/legacy');
const currify = require('currify/legacy');
const exec = require('execon');
const Storage = require('./storage');
const load = require('./load');
const RESTful = require('./rest');
import itype from 'itype';
import {promisify} from 'es6-promisify';
import * as load from '#dom/load';
import * as RESTful from '#dom/rest';
const Promises = {};
const FILES_JSON = 'config|modules';
const FILES_HTML = 'file|path|link|pathLink|media';
const FILES_HTML_ROOT = 'view/media-tmpl|config-tmpl|upload';
const DIR_HTML = '/tmpl/';
const DIR_HTML_FS = DIR_HTML + 'fs/';
const DIR_HTML_FS = `${DIR_HTML}fs/`;
const DIR_JSON = '/json/';
const timeout = getTimeoutOnce(2000);
const get = currify(getFile);
const unaryMap = (array, fn) => array.map((a) => fn(a));
export const get = getFile;
module.exports.get = get;
function getFile(name, callback) {
function getFile(name) {
const type = itype(name);
let array;
check(name);
check(name, callback);
if (type === 'string')
return getModule(name);
switch(type) {
case 'string':
getModule(name, callback);
break;
case 'array':
array = unaryMap(name, get);
exec.parallel(array, callback);
break;
}
if (type === 'array')
return Promise.all(name.map(getFile));
}
function check(name, callback) {
function check(name) {
if (!name)
throw Error('name could not be empty!');
if (typeof callback !== 'function')
throw Error('callback should be a function');
}
function getModule(name, callback) {
let path;
const regExpHTML = new RegExp(FILES_HTML + '|' + FILES_HTML_ROOT);
const regExpJSON = new RegExp(FILES_JSON);
function getModule(name) {
const regExpHTML = RegExp(FILES_HTML + '|' + FILES_HTML_ROOT);
const regExpJSON = RegExp(FILES_JSON);
const isHTML = regExpHTML.test(name);
const isJSON = regExpJSON.test(name);
if (!isHTML && !isJSON) {
showError(name);
} else if (name === 'config') {
getConfig(callback);
} else {
path = getPath(name, isHTML, isJSON);
getSystemFile(path, callback);
}
if (!isHTML && !isJSON)
return showError(name);
if (name === 'config')
return getConfig();
const path = getPath(name, isHTML, isJSON);
return getSystemFile(path);
}
function getPath(name, isHTML, isJSON) {
let path;
const regExp = new RegExp(FILES_HTML_ROOT);
const regExp = RegExp(FILES_HTML_ROOT);
const isRoot = regExp.test(name);
if (isHTML) {
if (isRoot)
path = DIR_HTML + name.replace('-tmpl', '');
else
path = DIR_HTML_FS + name;
path = DIR_HTML_FS + name;
path += '.hbs';
} else if (isJSON) {
path = DIR_JSON + name + '.json';
path = DIR_JSON + name + '.json';
}
return path;
}
function showError(name) {
const str = 'Wrong file name: ' + name;
const error = new Error(str);
const str = `Wrong file name: ${name}`;
const error = Error(str);
throw(error);
throw error;
}
function getSystemFile(file, callback) {
const prefix = CloudCmd.PREFIX;
const getSystemFile = promisify((file, callback) => {
const {prefix} = CloudCmd;
if (!Promises[file])
Promises[file] = new Promise((success, error) => {
@ -108,7 +85,7 @@ function getSystemFile(file, callback) {
load.ajax({
url,
success,
error
error,
});
});
@ -118,37 +95,29 @@ function getSystemFile(file, callback) {
Promises[file] = null;
callback(error);
});
}
});
function getConfig(callback) {
const getConfig = async () => {
let is;
if (!Promises.config)
Promises.config = new Promise((resolve, reject) => {
Promises.config = () => {
is = true;
RESTful.Config.read((error, data) => {
if (error)
return reject(error);
resolve(data);
});
});
return RESTful.Config.read();
};
Promises.config.then(function(data) {
const [, data] = await Promises.config();
if (data)
is = false;
Storage.setAllowed(data.localStorage);
callback(null, data);
timeout(() => {
if (!is)
Promises.config = null;
});
}, function() {
timeout(() => {
if (!is)
Promises.config = null;
});
}
return data;
};
function getTimeoutOnce(time) {
let is;
@ -165,4 +134,3 @@ function getTimeoutOnce(time) {
}, time);
};
}

View file

@ -1,22 +1,13 @@
/* global CloudCmd */
'use strict';
const DOM = require('./');
const Images = module.exports;
/* global DOM */
import createElement from '@cloudcmd/create-element';
const LOADING = 'loading';
const HIDDEN = 'hidden';
const ERROR = 'error';
const LoadingImage = LOADING + getLoadingType();
const getLoadingType = () => isSVG() ? '-svg' : '-gif';
function getLoadingType() {
return isSVG() ? '-svg' : '-gif';
}
module.exports.get = getElement;
export const get = getElement;
/**
* check SVG SMIL animation support
@ -35,54 +26,60 @@ function isSVG() {
return /SVGAnimate/.test(name);
}
function getElement() {
return DOM.load({
name : 'span',
id : 'js-status-image',
className : 'icon',
attribute : 'data-progress',
notAppend : true
return createElement('span', {
id: 'js-status-image',
className: 'icon',
dataName: 'progress',
notAppend: true,
});
}
/* Функция создаёт картинку загрузки */
module.exports.loading = () => {
export const loading = () => {
const element = getElement();
const classList = element.classList;
const {classList} = element;
const loadingImage = LOADING + getLoadingType();
classList.add(LOADING, LoadingImage);
classList.add(LOADING, loadingImage);
classList.remove(ERROR, HIDDEN);
return element;
};
/* Функция создаёт картинку ошибки загрузки */
module.exports.error = () => {
export const error = () => {
const element = getElement();
const classList = element.classList;
const {classList} = element;
const loadingImage = LOADING + getLoadingType();
classList.add(ERROR);
classList.remove(HIDDEN, LOADING, LoadingImage);
classList.remove(HIDDEN, LOADING, loadingImage);
return element;
};
module.exports.show = show;
module.exports.show.load = show;
module.exports.show.error = error;
show.load = show;
show.error = (text) => {
const image = Images.error();
DOM.show(image);
image.title = text;
return image;
};
/**
* Function shows loading spinner
* position = {top: true};
*/
function show(position, panel) {
export function show(position, panel) {
const image = Images.loading();
const parent = image.parentElement;
const refreshButton = DOM.getRefreshButton(panel);
let current;
if (position === 'top') {
current = refreshButton.parentElement;
} else {
@ -94,7 +91,7 @@ function show(position, panel) {
current = refreshButton.parentElement;
}
if (!parent || (parent && parent !== current))
if (!parent || parent && parent !== current)
current.appendChild(image);
DOM.show(image);
@ -102,36 +99,25 @@ function show(position, panel) {
return image;
}
function error(text) {
const image = Images.error();
DOM.show(image);
image.title = text;
CloudCmd.log(text);
return image;
}
/**
* hide load image
*/
module.exports.hide = () => {
export function hide() {
const element = Images.get();
DOM.hide(element);
return Images;
};
}
module.exports.setProgress = (value, title) => {
export const setProgress = (value, title) => {
const DATA = 'data-progress';
const element = Images.get();
if (!element)
return Images;
element.setAttribute(DATA, value + '%');
element.setAttribute(DATA, `${value}%`);
if (title)
element.title = title;
@ -139,7 +125,7 @@ module.exports.setProgress = (value, title) => {
return Images;
};
module.exports.clearProgress = () => {
export const clearProgress = () => {
const DATA = 'data-progress';
const element = Images.get();
@ -152,3 +138,12 @@ module.exports.clearProgress = () => {
return Images;
};
const Images = {
clearProgress,
setProgress,
show,
hide,
get,
error,
loading,
};

File diff suppressed because it is too large Load diff

52
client/dom/index.spec.js Normal file
View file

@ -0,0 +1,52 @@
import {test, stub} from 'supertape';
import {getCSSVar, goToDirectory} from '#dom';
globalThis.CloudCmd = {};
test('cloudcmd: client: dom: goToDirectory', async (t) => {
const path = '';
const changeDir = stub();
const prompt = stub().returns([null, path]);
await goToDirectory({
prompt,
changeDir,
});
t.calledWith(changeDir, [path]);
t.end();
});
test('cloudcmd: client: dom: getCSSVar', (t) => {
const body = {};
const getPropertyValue = stub().returns(0);
globalThis.getComputedStyle = stub().returns({
getPropertyValue,
});
const result = getCSSVar('hello', {
body,
});
delete globalThis.getComputedStyle;
t.notOk(result);
t.end();
});
test('cloudcmd: client: dom: getCSSVar: 1', (t) => {
const body = {};
const getPropertyValue = stub().returns(1);
globalThis.getComputedStyle = stub().returns({
getPropertyValue,
});
const result = getCSSVar('hello', {
body,
});
delete globalThis.getComputedStyle;
t.ok(result);
t.end();
});

166
client/dom/io/index.js Normal file
View file

@ -0,0 +1,166 @@
import {FS} from '#common/cloudfunc';
import {sendRequest as _sendRequest} from './send-request.js';
const {assign} = Object;
const imgPosition = {
top: true,
};
export const remove = async (url, data, overrides = {}) => {
const {
sendRequest = _sendRequest,
} = overrides;
const request = {
method: 'DELETE',
url: FS + url,
imgPosition: {
top: Boolean(data),
},
};
if (data)
assign(request, {
data,
url: `${request.url}?files`,
});
return await sendRequest(request);
};
export const patch = async (url, data) => {
return await _sendRequest({
method: 'PATCH',
url: FS + url,
data,
imgPosition,
});
};
export const write = async (url, data) => {
return await _sendRequest({
method: 'PUT',
url: FS + url,
data,
imgPosition,
});
};
export const createDirectory = async (url, overrides = {}) => {
const {
sendRequest = _sendRequest,
} = overrides;
return await sendRequest({
method: 'PUT',
url: `${FS}${url}?dir`,
imgPosition,
});
};
export const read = async (url, dataType = 'text') => {
const notLog = !url.includes('?');
return await _sendRequest({
method: 'GET',
url: FS + url,
notLog,
dataType,
});
};
export const copy = async (from, to, names) => {
return await _sendRequest({
method: 'PUT',
url: '/copy',
data: {
from,
to,
names,
},
imgPosition,
});
};
export const pack = async (data) => {
return await _sendRequest({
method: 'PUT',
url: '/pack',
data,
});
};
export const extract = async (data) => {
return await _sendRequest({
method: 'PUT',
url: '/extract',
data,
});
};
export const move = async (from, to, names) => {
return await _sendRequest({
method: 'PUT',
url: '/move',
data: {
from,
to,
names,
},
imgPosition,
});
};
export const rename = async (from, to) => {
return await _sendRequest({
method: 'PUT',
url: '/rename',
data: {
from,
to,
},
imgPosition,
});
};
export const Config = {
read: async () => {
return await _sendRequest({
method: 'GET',
url: '/config',
imgPosition,
notLog: true,
});
},
write: async (data) => {
return await _sendRequest({
method: 'PATCH',
url: '/config',
data,
imgPosition,
});
},
};
export const Markdown = {
read: async (url) => {
return await _sendRequest({
method: 'GET',
url: `/markdown${url}`,
imgPosition,
notLog: true,
});
},
render: async (data) => {
return await _sendRequest({
method: 'PUT',
url: '/markdown',
data,
imgPosition,
notLog: true,
});
},
};

View file

@ -0,0 +1,61 @@
import {test, stub} from 'supertape';
import * as io from './index.js';
test('client: dom: io', (t) => {
const sendRequest = stub();
io.createDirectory('/hello', {
sendRequest,
});
const expected = {
imgPosition: {
top: true,
},
method: 'PUT',
url: '/fs/hello?dir',
};
t.calledWith(sendRequest, [expected]);
t.end();
});
test('client: dom: io: remove: no files', async (t) => {
const sendRequest = stub();
await io.remove('/hello', null, {
sendRequest,
});
const expected = {
imgPosition: {
top: false,
},
method: 'DELETE',
url: '/fs/hello',
};
t.calledWith(sendRequest, [expected]);
t.end();
});
test('client: dom: io: remove: files', async (t) => {
const sendRequest = stub();
const files = ['world'];
await io.remove('/hello', files, {
sendRequest,
});
const expected = {
imgPosition: {
top: true,
},
data: ['world'],
method: 'DELETE',
url: '/fs/hello?files',
};
t.calledWith(sendRequest, [expected]);
t.end();
});

View file

@ -0,0 +1,48 @@
/* global CloudCmd */
import {promisify} from 'es6-promisify';
import * as Images from '#dom/images';
import * as load from '#dom/load';
export const sendRequest = promisify((params, callback) => {
const p = params;
const {prefixURL} = CloudCmd;
p.url = prefixURL + p.url;
p.url = encodeURI(p.url);
p.url = replaceHash(p.url);
load.ajax({
method: p.method,
url: p.url,
data: p.data,
dataType: p.dataType,
error: (jqXHR) => {
const response = jqXHR.responseText;
const {statusText, status} = jqXHR;
const text = status === 404 ? response : statusText;
callback(Error(text));
},
success: (data) => {
Images.hide();
if (!p.notLog)
CloudCmd.log(data);
callback(null, data);
},
});
});
export const _replaceHash = replaceHash;
function replaceHash(url) {
/*
* if we send ajax request -
* no need in hash so we escape #
*/
return url.replace(/#/g, '%23');
}

View file

@ -0,0 +1,11 @@
import {test} from 'supertape';
import {_replaceHash} from './send-request.js';
test('cloudcmd: client: io: replaceHash', (t) => {
const url = '/hello/####world';
const result = _replaceHash(url);
const expected = '/hello/%23%23%23%23world';
t.equal(result, expected);
t.end();
});

View file

@ -1,69 +1,58 @@
'use strict';
/* global CloudCmd */
import {callbackify} from 'node:util';
import {rendy} from 'rendy';
import itype from 'itype';
import * as load from 'load.js';
import {tryToCatch} from 'try-to-catch';
import {findObjByNameInArr} from '#common/util';
import * as Files from '#dom/files';
const exec = require('execon');
const rendy = require('rendy');
const itype = require('itype/legacy');
const {findObjByNameInArr} = require('../../common/util');
const load = require('./load');
const Files = require('./files');
module.exports = (name, options, callback = options) => {
const {PREFIX, config} = CloudCmd;
export const loadRemote = callbackify(async (name, options) => {
const {prefix, config} = CloudCmd;
const o = options;
if (o.name && window[o.name])
return callback();
return;
Files.get('modules', (error, modules) => {
const online = config('online') && navigator.onLine;
const module = findObjByNameInArr(modules.remote, name);
const modules = await Files.get('modules');
const online = config('online') && navigator.onLine;
const module = findObjByNameInArr(modules.remote, name);
const isArray = itype.array(module.local);
const {version} = module;
let remoteTmpls;
let local;
if (isArray) {
remoteTmpls = module.remote;
({local} = module);
} else {
remoteTmpls = [module.remote];
local = [module.local];
}
const localURL = [];
for (const url of local) {
localURL.push(prefix + url);
}
const remoteURL = [];
for (const tmpl of remoteTmpls) {
remoteURL.push(rendy(tmpl, {
version,
}));
}
if (online) {
const [e] = await tryToCatch(load.parallel, remoteURL);
const isArray = itype.array(module.local);
const version = module.version;
let remoteTmpls, local;
if (isArray) {
remoteTmpls = module.remote;
local = module.local;
} else {
remoteTmpls = [module.remote];
local = [module.local];
}
const localURL = local.map((url) => {
return PREFIX + url;
});
const remoteURL = remoteTmpls.map((tmpl) => {
return rendy(tmpl, {
version: version
});
});
const on = funcON(localURL, remoteURL, callback);
const off = funcOFF(localURL, callback);
exec.if(online, on, off);
});
};
function funcOFF(local, callback) {
return () => {
load.parallel(local, callback);
};
}
function funcON (local, remote,callback) {
return () => {
load.parallel(remote, (error) => {
if (error)
return funcOFF();
callback();
});
};
}
if (!e)
return;
}
await load.parallel(localURL);
});

View file

@ -1,130 +1,8 @@
'use strict';
const itype = require('itype/legacy');
const jonny = require('jonny');
const Emitify = require('emitify/legacy');
const exec = require('execon');
const Images = require('./images');
const Events = require('./events');
const {getExt} = require('../../common/util');
module.exports = load;
module.exports.getIdBySrc = getIdBySrc;
module.exports.ext = ext;
/**
* Функция создаёт элемент и загружает файл с src.
*
* @param params = {
* name, - название тэга
* src', - путь к файлу
* func, - обьект, содержаий одну из функций
* или сразу две onload и onerror
* {onload: function() {}, onerror: function();}
* style,
* id,
* element,
* async, - true by default
* inner: 'id{color:red, },
* class,
* notAppend - false by default
*
*/
function load(params) {
const {
src,
id = getIdBySrc(params.src),
func,
name,
async,
inner,
style,
parent = document.body,
className,
attribute,
notAppend,
} = params;
let element = document.getElementById(id);
if (element) {
exec(func);
return element;
}
element = document.createElement(name);
const funcError = () => {
const msg = `file ${src} could not be loaded`;
const error = new Error(msg);
parent.removeChild(element);
Images.show.error(msg);
const callback = func && func.onerror || func.onload || func;
exec(callback, error);
};
const funcLoad = () => {
const callback = func && func.onload || func;
Events.remove('error', element, funcError);
exec(callback);
};
if (/^(script|link)$/.test(name))
Events.addOnce('load', element, funcLoad)
.addError(element, funcError);
if (id)
element.id = id;
if (className)
element.className = className;
if (src) {
if (name !== 'link') {
element.src = src;
} else {
element.href = src;
element.rel = 'stylesheet';
}
}
if (attribute) {
const type = itype(attribute);
switch(type) {
case 'string':
element.setAttribute(attribute, '');
break;
case 'object':
Object.keys(attribute).forEach((name) => {
element.setAttribute(name, attribute[name]);
});
break;
}
}
if (style)
element.style.cssText = style;
if (async && name === 'script' || async === undefined)
element.async = true;
if (!notAppend)
parent.appendChild(element);
if (inner)
element.innerHTML = inner;
return element;
}
import itype from 'itype';
import jonny from 'jonny';
import Emitify from 'emitify';
import exec from 'execon';
import * as Images from '#dom/images';
/**
* Function gets id by src
@ -132,17 +10,18 @@ function load(params) {
*
* Example: http://domain.com/1.js -> 1_js
*/
function getIdBySrc(src) {
export function getIdBySrc(src) {
const isStr = itype.string(src);
if (!isStr)
return;
if (~src.indexOf(':'))
if (src.includes(':'))
src += '-join';
const num = src.lastIndexOf('/') + 1;
const sub = src.substr(src, num);
const id = src
.replace(sub, '')
.replace(/\./g, '-');
@ -155,34 +34,37 @@ function getIdBySrc(src) {
*
* @param params
*/
module.exports.ajax = (params) => {
export const ajax = (params) => {
const p = params;
const isObject = itype.object(p.data);
const isArray = itype.array(p.data);
const isArrayBuf = itype(p.data) === 'arraybuffer';
const type = p.type || p.method || 'GET';
const headers = p.headers || {};
const {headers = {}} = p;
const xhr = new XMLHttpRequest();
xhr.open(type, p.url, true);
Object.keys(headers).forEach((name) => {
for (const name of Object.keys(headers)) {
const value = headers[name];
xhr.setRequestHeader(name, value);
});
}
if (p.responseType)
xhr.responseType = p.responseType;
let data;
if (!isArrayBuf && isObject || isArray)
data = jonny.stringify(p.data);
else
data = p.data;
({data} = p);
xhr.onreadystatechange = (event) => {
const xhr = event.target;
const OK = 200;
const OK = 200;
if (xhr.readyState !== xhr.DONE)
return;
@ -190,43 +72,41 @@ module.exports.ajax = (params) => {
Images.clearProgress();
const TYPE_JSON = 'application/json';
const type = xhr.getResponseHeader('content-type');
const type = xhr.getResponseHeader('content-type');
if (xhr.status !== OK)
return exec(p.error, xhr);
const notText = p.dataType !== 'text';
const isContain = ~type.indexOf(TYPE_JSON);
const isContain = type.includes(TYPE_JSON);
let data = xhr.response;
if (type && isContain && notText)
data = jonny.parse(xhr.response) || xhr.response;
exec(p.success, data, xhr.statusText, xhr);
};
xhr.send(data);
};
module.exports.put = (url, body) => {
export const put = (url, body) => {
const emitter = Emitify();
const xhr = new XMLHttpRequest();
url = encodeURI(url)
.replace('#', '%23');
url = encodeURI(url).replace(/#/g, '#');
xhr.open('put', url, true);
xhr.upload.onprogress = (event) => {
var percent, count;
if (!event.lengthComputable)
return;
if (event.lengthComputable) {
percent = (event.loaded / event.total) * 100;
count = Math.round(percent);
emitter.emit('progress', count);
}
const percent = event.loaded / event.total * 100;
const count = Math.round(percent);
emitter.emit('progress', count);
};
xhr.onreadystatechange = () => {
@ -236,8 +116,10 @@ module.exports.put = (url, body) => {
if (!over)
return;
if (xhr.status === OK)
if (xhr.status === OK) {
emitter.emit('progress', 100);
return emitter.emit('end');
}
const error = Error(xhr.responseText);
emitter.emit('error', error);
@ -247,116 +129,3 @@ module.exports.put = (url, body) => {
return emitter;
};
function ext(src, func) {
switch (getExt(src)) {
case '.js':
return load.js(src, func);
case '.css':
return load.css(src, func);
default:
return load({
src,
func,
});
}
}
/**
* create elements and load them to DOM-tree
* one-by-one
*
* @param params
* @param callback
*/
load.series = (params, callback) => {
if (!params)
return load;
const funcs = params
.map((url) => ext.bind(null, url))
.concat(callback);
exec.series(funcs);
return load;
};
/**
* improve callback of funcs so
* we pop number of function and
* if it's last we call pCallBack
*
* @param params
* @param callback - onload function
*/
load.parallel = (params, callback) => {
if (!params)
return load;
const funcs = params.map((url) => {
return ext.bind(null, url);
});
exec.parallel(funcs, callback);
return load;
};
/**
* Функция загружает js-файл
*
* @param src
* @param func
*/
load.js = (src, func) => {
const name = 'script';
return load({
name,
src,
func,
});
},
load.css = (src, func) => {
const name = 'link';
const {head:parent} = document;
return load({
name,
src,
parent,
func
});
};
/**
* Функция создаёт елемент style и записывает туда стили
* @param params - структура параметров, заполняеться таким
* образом: {src: ' ',func: '', id: '', element: '', inner: ''}
* все параметры опциональны
*/
load.style = (params) => {
const {
id,
src,
name = 'style',
func,
inner,
parent = document.head,
element,
} = params;
return load({
id,
src,
func,
name,
inner,
parent,
element,
});
};

View file

@ -0,0 +1,66 @@
/* global CloudCmd */
import capitalize from 'just-capitalize';
import * as _Dialog from '#dom/dialog';
import * as Storage from '#dom/storage';
import * as RESTful from '#dom/rest';
import * as _currentFile from '../current-file.js';
export default async (current, overrides = {}) => {
const {
refresh = CloudCmd.refresh,
Dialog = _Dialog,
currentFile = _currentFile,
} = overrides;
const {
isCurrentFile,
getCurrentName,
getCurrentFile,
getCurrentByName,
getCurrentType,
getCurrentDirPath,
setCurrentName,
} = currentFile;
if (!isCurrentFile(current))
current = getCurrentFile();
const from = getCurrentName(current);
if (from === '..')
return Dialog.alert.noFiles();
const [cancel, to] = await Dialog.prompt('Rename', from);
if (cancel)
return;
const nextFile = getCurrentByName(to);
if (nextFile) {
const type = getCurrentType(nextFile);
const msg = `${capitalize(type)} "${to}" already exists. Proceed?`;
const [cancel] = await Dialog.confirm(msg);
if (cancel)
return;
}
if (from === to)
return;
const dirPath = getCurrentDirPath();
const fromFull = `${dirPath}${from}`;
const toFull = `${dirPath}${to}`;
const [e] = await RESTful.rename(fromFull, toFull);
if (e)
return;
setCurrentName(to, current);
Storage.remove(dirPath);
refresh();
};

View file

@ -0,0 +1,86 @@
import {test, stub} from 'supertape';
import renameCurrent from './rename-current.js';
test('cloudcmd: client: dom: renameCurrent: isCurrentFile', async (t) => {
const current = {};
const isCurrentFile = stub();
const currentFile = stubCurrentFile({
isCurrentFile,
});
await renameCurrent(current, {
Dialog: stubDialog(),
currentFile,
});
t.calledWith(isCurrentFile, [current], 'should call isCurrentFile');
t.end();
});
test('cloudcmd: client: dom: renameCurrent: file exist', async (t) => {
const current = {};
const name = 'hello';
const prompt = stub().returns([null, name]);
const confirm = stub().returns([true]);
const getCurrentByName = stub().returns(current);
const getCurrentType = stub().returns('directory');
const Dialog = stubDialog({
confirm,
prompt,
});
const currentFile = stubCurrentFile({
getCurrentByName,
getCurrentType,
});
await renameCurrent(null, {
Dialog,
currentFile,
});
const expected = 'Directory "hello" already exists. Proceed?';
t.calledWith(confirm, [expected], 'should call confirm');
t.end();
});
const stubDialog = (fns = {}) => {
const {
alert = stub().returns([]),
confirm = stub().returns([]),
prompt = stub().returns([]),
} = fns;
return {
alert,
confirm,
prompt,
};
};
const stubCurrentFile = (fns = {}) => {
const {
isCurrentFile = stub(),
getCurrentName = stub(),
getCurrentFile = stub(),
getCurrentByName = stub(),
getCurrentType = stub(),
getCurrentDirPath = stub(),
setCurrentName = stub(),
} = fns;
return {
isCurrentFile,
getCurrentName,
getCurrentFile,
getCurrentByName,
getCurrentType,
getCurrentDirPath,
setCurrentName,
};
};

View file

@ -1,211 +1,40 @@
'use strict';
import {tryToCatch} from 'try-to-catch';
import * as Dialog from '#dom/dialog';
import * as Images from '#dom/images';
import {encode} from '#common/entity';
import * as IO from './io/index.js';
/* global CloudCmd, DOM */
const handleError = (promise) => async (...args) => {
const [e, data] = await tryToCatch(promise, ...args);
if (!e)
return [e, data];
const encoded = encode(e.message);
Images.show.error(encoded);
Dialog.alert(encoded);
return [e, data];
};
const itype = require('itype/legacy');
export const remove = handleError(IO.remove);
export const patch = handleError(IO.patch);
export const write = handleError(IO.write);
export const createDirectory = handleError(IO.createDirectory);
export const read = handleError(IO.read);
export const copy = handleError(IO.copy);
export const pack = handleError(IO.pack);
export const extract = handleError(IO.extract);
export const move = handleError(IO.move);
export const rename = handleError(IO.rename);
const {FS} = require('../../common/cloudfunc');
export const Config = {
read: handleError(IO.Config.read),
write: handleError(IO.Config.write),
};
module.exports = new RESTful();
const Images = require('./images');
const load = require('./load');
function RESTful() {
this.delete = (url, data, callback) => {
const isFunc = itype.function(data);
if (!callback && isFunc) {
callback = data;
data = null;
}
sendRequest({
method : 'DELETE',
url : FS + url,
data,
callback,
imgPosition : { top: !!data }
});
};
this.patch = function(url, data, callback) {
var isFunc = itype.function(data);
if (!callback && isFunc) {
callback = data;
data = null;
}
sendRequest({
method : 'PATCH',
url : FS + url,
data : data,
callback : callback,
imgPosition : { top: true }
});
};
this.write = function(url, data, callback) {
var isFunc = itype.function(data);
if (!callback && isFunc) {
callback = data;
data = null;
}
sendRequest({
method : 'PUT',
url : FS + url,
data : data,
callback : callback,
imgPosition : { top: true }
});
};
this.read = function(url, dataType, callback) {
var isQuery = /\?/.test(url);
var isBeautify = /\?beautify$/.test(url);
var isMinify = /\?minify$/.test(url);
var notLog = !isQuery || isBeautify || isMinify;
var isFunc = itype.function(dataType);
if (!callback && isFunc) {
callback = dataType;
dataType = 'text';
}
sendRequest({
method: 'GET',
url: FS + url,
callback: callback,
notLog: notLog,
dataType: dataType
});
};
this.cp = function(data, callback) {
sendRequest({
method : 'PUT',
url : '/cp',
data : data,
callback : callback,
imgPosition : { top: true }
});
};
this.pack = function(data, callback) {
sendRequest({
method : 'PUT',
url : '/pack',
data : data,
callback : callback
});
};
this.extract = function(data, callback) {
sendRequest({
method : 'PUT',
url : '/extract',
data : data,
callback : callback
});
};
this.mv = function(data, callback) {
sendRequest({
method : 'PUT',
url : '/mv',
data : data,
callback : callback,
imgPosition : { top: true }
});
};
this.Config = {
read: function(callback) {
sendRequest({
method : 'GET',
url : '/config',
callback : callback,
imgPosition : { top: true },
notLog : true
});
},
write: function(data, callback) {
sendRequest({
method : 'PATCH',
url : '/config',
data : data,
callback : callback,
imgPosition : { top: true }
});
}
};
this.Markdown = {
read : function(url, callback) {
sendRequest({
method : 'GET',
url : '/markdown' + url,
callback : callback,
imgPosition : { top: true },
notLog : true
});
},
render : function(data, callback) {
sendRequest({
method : 'PUT',
url : '/markdown',
data : data,
callback : callback,
imgPosition : { top: true },
notLog : true
});
}
};
function sendRequest(params) {
var p = params,
prefixUrl = CloudCmd.PREFIX_URL;
p.url = prefixUrl + p.url;
p.url = encodeURI(p.url);
/*
* if we send ajax request -
* no need in hash so we escape #
*/
p.url = p.url.replace('#', '%23');
load.ajax({
method : p.method,
url : p.url,
data : p.data,
dataType : p.dataType,
error : (jqXHR) => {
const response = jqXHR.responseText;
const statusText = jqXHR.statusText;
const status = jqXHR.status;
const text = status === 404 ? response : statusText;
Images.show.error(text);
setTimeout(() => {
DOM.Dialog.alert(CloudCmd.TITLE, text);
}, 100);
p.callback(Error(text));
},
success: (data) => {
Images.hide();
if (!p.notLog)
CloudCmd.log(data);
p.callback(null, data);
}
});
}
}
export const Markdown = {
read: handleError(IO.Markdown.read),
render: handleError(IO.Markdown.render),
};

View file

@ -1,52 +1,46 @@
'use strict';
/* global DOM */
import {alert, prompt} from '#dom/dialog';
import {getRegExp} from '#common/util';
import {getCurrentName} from './current-file.js';
import {
isSelected,
toggleSelectedFile,
} from './cmd.js';
let SelectType = '*.*';
const TITLE = 'Cloud Commander';
const {getRegExp} = require('../../common/util');
module.exports = (msg, files) => {
const allMsg = `Specify file type for ${msg} selection`;
const cancel = false;
const {Dialog} = DOM;
export const selectByPattern = async (msg, files) => {
if (!files)
return;
Dialog.prompt(TITLE, allMsg, SelectType, {cancel}).then((type) => {
SelectType = type;
const allMsg = `Specify file type for ${msg} selection`;
const [cancel, type] = await prompt(allMsg, SelectType);
if (cancel)
return;
SelectType = type;
const regExp = getRegExp(type);
let matches = 0;
for (const current of files) {
const name = getCurrentName(current);
const regExp = getRegExp(type);
if (name === '..' || !regExp.test(name))
continue;
if (!files)
return;
++matches;
let matches = 0;
let selected = isSelected(current);
const shouldSel = msg === 'expand';
files.forEach((current) => {
const name = DOM.getCurrentName(current);
if (name === '..')
return;
const isMatch = regExp.test(name);
if (!isMatch)
return;
++matches;
let isSelected = DOM.isSelected(current);
const shouldSel = msg === 'expand';
if (shouldSel)
isSelected = !isSelected;
if (isSelected)
DOM.toggleSelectedFile(current);
});
if (shouldSel)
selected = !selected;
if (!matches)
Dialog.alert('Select Files', 'No matches found!');
});
if (selected)
toggleSelectedFile(current);
}
if (!matches)
alert('No matches found!');
};

View file

@ -1,84 +1,26 @@
'use strict';
const {parse, stringify} = JSON;
const itype = require('itype/legacy');
const jonny = require('jonny');
const exec = require('execon');
/* приватный переключатель возможности работы с кэшем */
let Allowed;
/**
* allow Storage usage
*/
module.exports.setAllowed = (isAllowed) => {
Allowed = isAllowed;
export const set = (name, data) => {
localStorage.setItem(name, data);
};
/** remove element */
module.exports.remove = (item, callback) => {
if (Allowed)
localStorage.removeItem(item);
exec(callback, null, Allowed);
return module.exports;
export const setJson = (name, data) => {
localStorage.setItem(name, stringify(data));
};
module.exports.removeMatch = (string, callback) => {
const reg = RegExp('^' + string + '.*$');
const test = (a) => reg.test(a);
const remove = (a) => localStorage.removeItem(a);
Object.keys(localStorage)
.filter(test)
.forEach(remove);
exec(callback);
return module.exports;
export const get = (name) => {
return localStorage.getItem(name);
};
/** если доступен localStorage и
* в нём есть нужная нам директория -
* записываем данные в него
*/
module.exports.set = (name, data, callback) => {
let str, error;
if (itype.object(data))
str = jonny.stringify(data);
if (Allowed && name)
error = exec.try(() => {
localStorage.setItem(name, str || data);
});
exec(callback, error);
return module.exports;
},
/** Если доступен Storage принимаем из него данные*/
module.exports.get = (name, callback) => {
let ret;
if (Allowed)
ret = localStorage.getItem(name);
exec(callback, null, ret);
return module.exports;
},
/** функция чистит весь кэш для всех каталогов*/
module.exports.clear = (callback) => {
const ret = Allowed;
if (ret)
localStorage.clear();
exec(callback, null, ret);
return module.exports;
export const getJson = (name) => {
const data = localStorage.getItem(name);
return parse(data);
};
export const clear = () => {
localStorage.clear();
};
export const remove = (item) => {
localStorage.removeItem(item);
};

105
client/dom/storage.spec.js Normal file
View file

@ -0,0 +1,105 @@
import {test, stub} from 'supertape';
import * as storage from '#dom/storage';
const {stringify} = JSON;
test('cloudcmd: client: storage: set', async (t) => {
const {localStorage} = globalThis;
const setItem = stub();
globalThis.localStorage = {
setItem,
};
await storage.set('hello', 'world');
globalThis.localStorage = localStorage;
t.calledWith(setItem, ['hello', 'world'], 'should call setItem');
t.end();
});
test('cloudcmd: client: storage: get', async (t) => {
const {localStorage} = globalThis;
const getItem = stub().returns('world');
globalThis.localStorage = {
getItem,
};
const result = await storage.get('hello');
globalThis.localStorage = localStorage;
t.equal(result, 'world');
t.end();
});
test('cloudcmd: client: storage: getJson', async (t) => {
const {localStorage} = globalThis;
const expected = {
hello: 'world',
};
const getItem = stub().returns(stringify(expected));
globalThis.localStorage = {
getItem,
};
const result = await storage.getJson('hello');
globalThis.localStorage = localStorage;
t.deepEqual(result, expected);
t.end();
});
test('cloudcmd: client: storage: setJson', async (t) => {
const {localStorage} = globalThis;
const data = {
hello: 'world',
};
const expected = stringify(data);
const setItem = stub();
globalThis.localStorage = {
setItem,
};
await storage.setJson('hello', data);
globalThis.localStorage = localStorage;
t.calledWith(setItem, ['hello', expected]);
t.end();
});
test('cloudcmd: client: storage: remove', async (t) => {
const {localStorage} = globalThis;
const removeItem = stub();
globalThis.localStorage = {
removeItem,
};
await storage.remove('hello');
globalThis.localStorage = localStorage;
t.calledWith(removeItem, ['hello'], 'should call removeItem');
t.end();
});
test('cloudcmd: client: storage: clear', async (t) => {
const {localStorage} = globalThis;
const clear = stub();
globalThis.localStorage = {
clear,
};
await storage.clear();
globalThis.localStorage = localStorage;
t.calledWithNoArgs(clear, 'should call clear');
t.end();
});

View file

@ -1,27 +1,19 @@
'use strict';
/* global CloudCmd */
import {eachSeries} from 'execon';
import wraptile from 'wraptile';
import * as load from '#dom/load';
import {alert} from '#dom/dialog';
import {FS} from '#common/cloudfunc';
import * as Images from '#dom/images';
import {getCurrentDirPath} from './current-file.js';
const {eachSeries} = require('execon');
const wraptile = require('wraptile/legacy');
const DOM = require('.');
const load = require('./load');
const Images = require('./images');
const {FS} = require('../../common/cloudfunc');
const onEnd = wraptile(_onEnd);
const loadFile = wraptile(_loadFile);
const onEnd = wraptile(_onEnd);
const {
getCurrentDirPath: getPathWhenRootEmpty
} = DOM;
module.exports = (dir, files) => {
export const uploadFiles = (dir, files) => {
if (!files) {
files = dir;
dir = getPathWhenRootEmpty();
dir = getCurrentDirPath();
}
const n = files.length;
@ -29,7 +21,7 @@ module.exports = (dir, files) => {
if (!n)
return;
const array = [...files];
const array = Array.from(files);
const {name} = files[0];
eachSeries(array, loadFile(dir, n), onEnd(name));
@ -37,17 +29,17 @@ module.exports = (dir, files) => {
function _onEnd(currentName) {
CloudCmd.refresh({
currentName
currentName,
});
}
function _loadFile(dir, n, file, callback) {
let i = 0;
const name = file.name;
const {name} = file;
const path = dir + name;
const {PREFIX_URL} = CloudCmd;
const api = PREFIX_URL + FS;
const {prefixURL} = CloudCmd;
const api = prefixURL + FS;
const percent = (i, n, per = 100) => {
return Math.round(i * per / n);
@ -57,7 +49,9 @@ function _loadFile(dir, n, file, callback) {
++i;
load.put(api + path, file)
load
.put(api + path, file)
.on('error', showError)
.on('end', callback)
.on('progress', (count) => {
const max = step(n);
@ -68,3 +62,6 @@ function _loadFile(dir, n, file, callback) {
});
}
function showError({message}) {
alert(message);
}

View file

@ -0,0 +1,44 @@
/* global DOM */
/**
* Функция генерирует JSON из html-таблицы файлов и
* используеться при первом заходе в корень
*/
export const getJsonFromFileTable = () => {
const Info = DOM.CurrentInfo;
const path = DOM.getCurrentDirPath();
const infoFiles = Info.files || [];
const files = infoFiles
.filter(notParent)
.map(parse);
const fileTable = {
path,
files,
};
return fileTable;
};
const notParent = (current) => {
const name = DOM.getCurrentName(current);
return name !== '..';
};
const parse = (current) => {
const name = DOM.getCurrentName(current);
const size = DOM.getCurrentSize(current);
const owner = DOM.getCurrentOwner(current);
const mode = DOM.getCurrentMode(current);
const date = DOM.getCurrentDate(current);
const type = DOM.getCurrentType(current);
return {
name,
size,
mode,
owner,
date,
type,
};
};

View file

@ -1,78 +0,0 @@
'use strict';
const currify = require('currify/legacy');
const isType = currify((type, object, name) => {
return typeof object[name] === type;
});
const isBool = isType('boolean');
module.exports.getElementByName = getElementByName;
function getElementByName(selector, element) {
const str = `[data-name="js-${selector}"]`;
return element
.querySelector(str);
}
module.exports.getName = (element) => {
const name = element
.getAttribute('data-name')
.replace(/^js-/, '');
return name;
};
module.exports.convert = (config) => {
const result = Object.assign({}, config);
const array = Object.keys(result);
array
.filter(isBool(result))
.forEach((name) => {
const item = result[name];
result[name] = setState(item);
});
return result;
};
function setState(state) {
if (state)
return ' checked';
return '';
}
module.exports.getValue = (name, element) => {
const el = getElementByName(name, element);
const type = el.type;
switch(type) {
case 'checkbox':
return el.checked;
case 'number':
return Number(el.value);
default:
return el.value;
}
};
module.exports.setValue = (name, value, element) => {
const el = getElementByName(name, element);
const type = el.type;
switch(type) {
case 'checkbox':
el.checked = value;
break;
default:
el.value = value;
break;
}
};

View file

@ -1,573 +0,0 @@
/* global CloudCmd, DOM */
'use strict';
const Info = DOM.CurrentInfo;
const exec = require('execon');
const Events = require('./dom/events');
const Buffer = require('./dom/buffer');
const {escapeRegExp} = require('../common/util');
let Chars = [];
const KEY = {
BACKSPACE : 8,
TAB : 9,
ENTER : 13,
ESC : 27,
SPACE : 32,
PAGE_UP : 33,
PAGE_DOWN : 34,
END : 35,
HOME : 36,
LEFT : 37,
UP : 38,
RIGHT : 39,
DOWN : 40,
INSERT : 45,
DELETE : 46,
ZERO : 48,
A : 65,
C : 67,
D : 68,
G : 71,
M : 77,
O : 79,
Q : 81,
R : 82,
S : 83,
T : 84,
U : 85,
V : 86,
X : 88,
Z : 90,
INSERT_MAC : 96,
ASTERISK : 106,
PLUS : 107,
MINUS : 109,
F1 : 112,
F2 : 113,
F3 : 114,
F4 : 115,
F5 : 116,
F6 : 117,
F7 : 118,
F8 : 119,
F9 : 120,
F10 : 121,
EQUAL : 187,
HYPHEN : 189,
DOT : 190,
SLASH : 191,
TRA : 192, /* Typewritten Reverse Apostrophe (`) */
BACKSLASH : 220,
BRACKET_CLOSE: 221
};
KeyProto.prototype = KEY;
CloudCmd.Key = KeyProto;
function KeyProto() {
const Key = this;
let Binded;
this.isBind = () => {
return Binded;
};
this.setBind = () => {
Binded = true;
};
this.unsetBind = () => {
Binded = false;
};
this.bind = () => {
Events.addKey(listener);
Binded = true;
};
function getChar(event) {
/*
* event.keyIdentifier deprecated in chrome v51
* but event.key is absent in chrome <= v51
*/
if (event.key)
return event.key;
return fromCharCode(event.keyIdentifier);
}
function listener(event) {
const keyCode = event.keyCode;
const alt = event.altKey;
const ctrl = event.ctrlKey;
const shift = event.shiftKey;
const meta = event.metaKey;
const isBetween = keyCode >= KEY.ZERO && keyCode <= KEY.Z;
const isNumpad = /Numpad/.test(event.code);
let char = getChar(event);
let isSymbol = ~['.', '_', '-', '+', '='].indexOf(char);
if (!isSymbol) {
isSymbol = getSymbol(shift, keyCode);
if (isSymbol)
char = isSymbol;
}
/* in case buttons can be processed */
if (Key.isBind())
if (!isNumpad && !alt && !ctrl && !meta && (isBetween || isSymbol))
setCurrentByChar(char);
else {
Chars = [];
switchKey(event);
}
}
function getSymbol(shift, keyCode) {
switch (keyCode) {
case KEY.DOT:
return '.';
case KEY.HYPHEN:
return shift ? '_' : '-';
case KEY.EQUAL:
return shift ? '+' : '=';
}
}
function fromCharCode(keyIdentifier) {
const code = keyIdentifier.substring(2);
const hex = parseInt(code, 16);
const char = String.fromCharCode(hex);
return char;
}
function setCurrentByChar(char) {
let firstByName;
let skipCount = 0;
let setted = false;
let i = 0;
const escapeChar = escapeRegExp(char);
const regExp = new RegExp('^' + escapeChar + '.*$', 'i');
const {files} = Info;
const n = Chars.length;
while(i < n && char === Chars[i]) {
i++;
}
if (!i)
Chars = [];
const skipN = skipCount = i;
Chars.push(char);
const names = DOM.getFilenames(files);
const isTest = (a) => regExp.test(a);
const isRoot = (a) => a === '..';
const not = (f) => (a) => !f(a);
const setCurrent = (name) => {
const byName = DOM.getCurrentByName(name);
if (!skipCount) {
setted = true;
DOM.setCurrentFile(byName);
return true;
} else {
if (skipN === skipCount)
firstByName = byName;
--skipCount;
}
};
names
.filter(isTest)
.filter(not(isRoot))
.some(setCurrent);
if (!setted) {
DOM.setCurrentFile(firstByName);
Chars = [char];
}
}
function switchKey(event) {
let i, isSelected, prev, next;
let current = Info.element;
let name = Info.name;
const {Operation} = CloudCmd;
const panel = Info.panel;
const path = Info.path;
const isDir = Info.isDir;
const keyCode = event.keyCode;
const alt = event.altKey;
const shift = event.shiftKey;
const ctrl = event.ctrlKey;
const meta = event.metaKey;
const ctrlMeta = ctrl || meta;
if (current) {
prev = current.previousSibling;
next = current.nextSibling;
}
switch (keyCode) {
case Key.TAB:
DOM.changePanel();
event.preventDefault();
break;
case Key.INSERT:
DOM .toggleSelectedFile(current)
.setCurrentFile(next);
break;
case Key.INSERT_MAC:
DOM .toggleSelectedFile(current)
.setCurrentFile(next);
break;
case Key.DELETE:
if (shift)
Operation.show('delete:silent');
else
Operation.show('delete');
break;
case Key.ASTERISK:
DOM.toggleAllSelectedFiles(current);
break;
case Key.PLUS:
DOM.expandSelection();
event.preventDefault();
break;
case Key.MINUS:
DOM.shrinkSelection();
event.preventDefault();
break;
case Key.F1:
CloudCmd.Help.show();
event.preventDefault();
break;
case Key.F2:
DOM.renameCurrent(current);
break;
case Key.F3:
if (shift)
CloudCmd.Markdown.show(path);
else if (ctrlMeta)
CloudCmd.sortPanel('name');
else
CloudCmd.View.show();
event.preventDefault();
break;
case Key.F4:
if (shift)
CloudCmd.EditFileVim.show();
else
CloudCmd.EditFile.show();
event.preventDefault();
break;
case Key.F5:
if (ctrlMeta)
CloudCmd.sortPanel('date');
else
Operation.show('copy');
event.preventDefault();
break;
case Key.F6:
if (ctrlMeta)
CloudCmd.sortPanel('size');
else
Operation.show('move');
event.preventDefault();
break;
case Key.F7:
if (shift)
DOM.promptNewFile();
else
DOM.promptNewDir();
event.preventDefault();
break;
case Key.F8:
Operation.show('delete');
event.preventDefault();
break;
case Key.F9:
CloudCmd.Menu.show();
event.preventDefault();
break;
case Key.F10:
CloudCmd.Config.show();
event.preventDefault();
break;
case Key.TRA:
event.preventDefault();
if (shift)
return CloudCmd.Terminal.show();
CloudCmd.Konsole.show();
break;
case KEY.BRACKET_CLOSE:
CloudCmd.Konsole.show();
event.preventDefault();
break;
case Key.SPACE:
if (!isDir || name === '..')
isSelected = true;
else
isSelected = DOM.isSelected(current);
exec.if(isSelected, () => {
DOM.toggleSelectedFile(current);
}, (callback) => {
DOM.loadCurrentSize(callback, current);
});
event.preventDefault();
break;
case Key.U:
if (ctrlMeta) {
DOM.swapPanels();
event.preventDefault();
}
break;
/* navigation on file table: *
* in case of pressing button 'up', *
* select previous row */
case Key.UP:
if (shift)
DOM.toggleSelectedFile(current);
DOM.setCurrentFile(prev);
event.preventDefault();
break;
/* in case of pressing button 'down', *
* select next row */
case Key.DOWN:
if (shift)
DOM.toggleSelectedFile(current);
DOM.setCurrentFile(next);
event.preventDefault();
break;
case Key.LEFT:
if (!alt)
return;
event.preventDefault();
name = Info.panel.getAttribute('data-name');
if (name === 'js-right')
DOM.duplicatePanel();
break;
case Key.RIGHT:
if (!alt)
return;
event.preventDefault();
name = Info.panel.getAttribute('data-name');
if (name === 'js-left')
DOM.duplicatePanel();
break;
/* in case of pressing button 'Home', *
* go to top element */
case Key.HOME:
DOM.setCurrentFile(Info.first);
event.preventDefault();
break;
/* in case of pressing button 'End', select last element */
case Key.END:
DOM.setCurrentFile(Info.last);
event.preventDefault();
break;
/* если нажали клавишу page down проматываем экран */
case Key.PAGE_DOWN:
DOM.scrollByPages(panel, 1);
for (i = 0; i < 30; i++) {
if (!current.nextSibling)
break;
current = current.nextSibling;
}
DOM.setCurrentFile(current);
event.preventDefault();
break;
/* если нажали клавишу page up проматываем экран */
case Key.PAGE_UP:
DOM.scrollByPages(panel, -1);
for (i = 0; i < 30; i++) {
if (!current.previousSibling)
break;
current = current.previousSibling;
}
DOM.setCurrentFile(current);
event.preventDefault();
break;
/* open directory */
case Key.ENTER:
if (Info.isDir)
CloudCmd.loadDir({
path: path === '/' ? '/' : path + '/'
});
break;
case Key.BACKSPACE:
CloudCmd.goToParentDir();
event.preventDefault();
break;
case Key.BACKSLASH:
if (ctrlMeta)
CloudCmd.loadDir({
path: '/'
});
break;
case Key.A:
if (ctrlMeta) {
DOM.selectAllFiles();
event.preventDefault();
}
break;
case Key.G:
if (alt) {
DOM.goToDirectory();
event.preventDefault();
}
break;
case Key.M:
if (ctrlMeta) {
CloudCmd.EditNames.show();
event.preventDefault();
}
break;
/**
* обновляем страницу,
* загружаем содержимое каталога
* при этом данные берём всегда с
* сервера, а не из кэша
* (обновляем кэш)
*/
case Key.R:
if (ctrlMeta) {
CloudCmd.log('reloading page...\n');
CloudCmd.refresh();
event.preventDefault();
}
break;
case Key.C:
if (ctrlMeta)
Buffer.copy();
break;
case Key.X:
if (ctrlMeta)
Buffer.cut();
break;
case Key.V:
if (ctrlMeta)
Buffer.paste();
break;
case Key.Z:
if (ctrlMeta)
Buffer.clear();
break;
/* чистим хранилище */
case Key.D:
if (ctrlMeta) {
CloudCmd.log('clearing storage...');
DOM.Storage.clear(() => {
CloudCmd.log('storage cleared');
});
event.preventDefault();
}
break;
}
}
}

15
client/key/binder.js Normal file
View file

@ -0,0 +1,15 @@
export const createBinder = () => {
let binded = false;
return {
isBind() {
return binded;
},
setBind() {
binded = true;
},
unsetBind() {
binded = false;
},
};
};

28
client/key/binder.spec.js Normal file
View file

@ -0,0 +1,28 @@
import {test} from 'supertape';
import {createBinder} from './binder.js';
test('client: key: binder: isBind: default', (t) => {
const binder = createBinder();
t.notOk(binder.isBind(), 'should not be bind by default');
t.end();
});
test('client: key: binder: setBind', (t) => {
const binder = createBinder();
binder.setBind();
t.ok(binder.isBind(), 'should be bind');
t.end();
});
test('client: key: binder: unsetBind', (t) => {
const binder = createBinder();
binder.setBind();
binder.unsetBind();
t.notOk(binder.isBind(), 'should not be bind');
t.end();
});

544
client/key/index.js Normal file
View file

@ -0,0 +1,544 @@
/* global CloudCmd, DOM */
import clipboard from '@cloudcmd/clipboard';
import {fullstore} from 'fullstore';
import * as Events from '#dom/events';
import * as Buffer from '../dom/buffer.js';
import * as KEY from './key.js';
import _vim from './vim/index.js';
import setCurrentByChar from './set-current-by-char.js';
import {createBinder} from './binder.js';
const Chars = fullstore();
const toggleVim = (keyCode, overrides = {}) => {
const {_config, config} = overrides;
if (!config('vim') && keyCode === KEY.ESC)
_config('vim', true);
};
const isUndefined = (a) => typeof a === 'undefined';
Chars([]);
const {assign} = Object;
const binder = createBinder();
const bind = () => {
Events.addKey(listener, true);
binder.setBind();
};
export const Key = assign(binder, KEY, {
bind,
});
export const _listener = listener;
function getChar(event) {
/*
* event.keyIdentifier deprecated in chrome v51
* but event.key is absent in chrome <= v51
*/
const {
key,
shift,
keyCode,
keyIdentifier,
} = event;
const char = key || fromCharCode(keyIdentifier);
const symbol = getSymbol(shift, keyCode);
return [symbol, char];
}
async function listener(event, overrides = {}) {
const {
config = CloudCmd.config,
_config = CloudCmd._config,
switchKey = _switchKey,
vim = _vim,
} = overrides;
const {keyCode} = event;
// strange chrome bug calls listener twice
// in second time event misses a lot fields
if (isUndefined(event.altKey))
return;
const alt = event.altKey;
const ctrl = event.ctrlKey;
const meta = event.metaKey;
const isBetween = keyCode >= KEY.ZERO && keyCode <= KEY.Z;
const isNumpad = /Numpad/.test(event.code);
const [symbol, char] = getChar(event);
if (!binder.isBind())
return;
toggleVim(keyCode, {
config,
_config,
});
const isVim = config('vim');
if (!isVim && !isNumpad && !alt && !ctrl && !meta && (isBetween || symbol))
return setCurrentByChar(char, Chars);
Chars([]);
await switchKey(event);
if (keyCode >= KEY.F1 && keyCode <= KEY.F10)
return;
if (isVim)
vim(char, event);
}
function getSymbol(shift, keyCode) {
switch(keyCode) {
case KEY.DOT:
return '.';
case KEY.HYPHEN:
return shift ? '_' : '-';
case KEY.EQUAL:
return shift ? '+' : '=';
}
return '';
}
function fromCharCode(keyIdentifier) {
const code = keyIdentifier.substring(2);
const hex = parseInt(code, 16);
return String.fromCharCode(hex);
}
async function _switchKey(event) {
const Info = DOM.CurrentInfo;
let i;
let isSelected;
let prev;
let next;
let current = Info.element;
let dataName;
const {
name,
panel,
path,
isDir,
} = Info;
const {
Operation,
changeDir,
config,
} = CloudCmd;
const {keyCode} = event;
const alt = event.altKey;
const shift = event.shiftKey;
const ctrl = event.ctrlKey;
const meta = event.metaKey;
const ctrlMeta = ctrl || meta;
if (current) {
prev = current.previousSibling;
next = current.nextSibling;
}
switch(keyCode) {
case KEY.TAB:
DOM.changePanel();
event.preventDefault();
break;
case KEY.INSERT:
DOM
.toggleSelectedFile(current)
.setCurrentFile(next);
break;
case KEY.INSERT_MAC:
DOM
.toggleSelectedFile(current)
.setCurrentFile(next);
break;
case KEY.DELETE:
if (shift)
Operation.show('delete:silent');
else
Operation.show('delete');
break;
case KEY.ASTERISK:
DOM.toggleAllSelectedFiles(current);
break;
case KEY.PLUS:
DOM.expandSelection();
event.preventDefault();
break;
case KEY.MINUS:
DOM.shrinkSelection();
event.preventDefault();
break;
case KEY.F1:
CloudCmd.Help.show();
event.preventDefault();
break;
case KEY.F2:
CloudCmd.UserMenu.show();
break;
case KEY.F3:
event.preventDefault();
if (Info.isDir)
await changeDir(path);
else if (shift)
CloudCmd.View.show(null, {
raw: true,
});
else if (ctrlMeta)
CloudCmd.sortPanel('name');
else
CloudCmd.View.show();
break;
case KEY.F4:
if (config('vim'))
CloudCmd.EditFileVim.show();
else
CloudCmd.EditFile.show();
event.preventDefault();
break;
case KEY.F5:
if (ctrlMeta)
CloudCmd.sortPanel('date');
else if (alt)
Operation.show('pack');
else
Operation.show('copy');
event.preventDefault();
break;
case KEY.F6:
if (ctrlMeta)
CloudCmd.sortPanel('size');
else if (shift)
DOM.renameCurrent(current);
else
Operation.show('move');
event.preventDefault();
break;
case KEY.F7:
if (shift)
DOM.promptNewFile();
else
DOM.promptNewDir();
event.preventDefault();
break;
case KEY.F8:
Operation.show('delete');
event.preventDefault();
break;
case KEY.F9:
if (alt)
Operation.show('extract');
else
CloudCmd.Menu.show();
event.preventDefault();
break;
case KEY.F10:
CloudCmd.Config.show();
event.preventDefault();
break;
case KEY.TRA:
event.preventDefault();
if (shift)
return CloudCmd.Terminal.show();
CloudCmd.Konsole.show();
break;
case KEY.BRACKET_CLOSE:
CloudCmd.Konsole.show();
event.preventDefault();
break;
case KEY.SPACE:
event.preventDefault();
if (!isDir || name === '..')
isSelected = true;
else
isSelected = DOM.isSelected(current);
if (!isSelected)
await DOM.loadCurrentSize(current);
DOM.toggleSelectedFile(current);
break;
case KEY.U:
if (ctrlMeta) {
DOM.swapPanels();
event.preventDefault();
}
break;
/* navigation on file table: *
* in case of pressing button 'up', *
* select previous row */
case KEY.UP:
if (shift)
DOM.toggleSelectedFile(current);
DOM.setCurrentFile(prev);
event.preventDefault();
break;
/* in case of pressing button 'down', *
* select next row */
case KEY.DOWN:
if (shift)
DOM.toggleSelectedFile(current);
DOM.setCurrentFile(next);
event.preventDefault();
break;
case KEY.LEFT:
if (!alt)
return;
event.preventDefault();
dataName = Info.panel.getAttribute('data-name');
if (dataName === 'js-right')
DOM.duplicatePanel();
break;
case KEY.RIGHT:
if (!alt)
return;
event.preventDefault();
dataName = Info.panel.getAttribute('data-name');
if (dataName === 'js-left')
DOM.duplicatePanel();
break;
/* in case of pressing button 'Home', *
* go to top element */
case KEY.HOME:
DOM.setCurrentFile(Info.first);
event.preventDefault();
break;
/* in case of pressing button 'End', select last element */
case KEY.END:
DOM.setCurrentFile(Info.last);
event.preventDefault();
break;
/* если нажали клавишу page down проматываем экран */
case KEY.PAGE_DOWN:
DOM.scrollByPages(panel, 1);
for (i = 0; i < 30; i++) {
if (!current.nextSibling)
break;
current = current.nextSibling;
}
DOM.setCurrentFile(current);
event.preventDefault();
break;
/* если нажали клавишу page up проматываем экран */
case KEY.PAGE_UP:
DOM.scrollByPages(panel, -1);
for (i = 0; i < 30; i++) {
if (!current.previousSibling)
break;
current = current.previousSibling;
}
DOM.setCurrentFile(current);
event.preventDefault();
break;
case KEY.ENTER:
if (Info.isDir)
await changeDir(path);
else
CloudCmd.View.show();
break;
case KEY.BACKSPACE:
CloudCmd.goToParentDir();
event.preventDefault();
break;
case KEY.BACKSLASH:
if (ctrlMeta)
await changeDir('/');
break;
case KEY.A:
if (ctrlMeta) {
DOM.selectAllFiles();
event.preventDefault();
}
break;
case KEY.G:
if (alt) {
DOM.goToDirectory();
event.preventDefault();
}
break;
case KEY.L:
if (ctrlMeta && shift) {
CloudCmd.logOut();
event.preventDefault();
}
break;
case KEY.M:
if (ctrlMeta) {
if (config('vim'))
CloudCmd.EditNamesVim.show();
else
CloudCmd.EditNames.show();
event.preventDefault();
}
break;
case KEY.P:
if (!ctrlMeta)
return;
event.preventDefault();
clipboard
.writeText(Info.dirPath)
.catch(CloudCmd.log);
break;
/**
* обновляем страницу,
* загружаем содержимое каталога
* при этом данные берём всегда с
* сервера, а не из кэша
* (обновляем кэш)
*/
case KEY.R:
if (ctrlMeta) {
CloudCmd.log('reloading page...\n');
CloudCmd.refresh();
event.preventDefault();
}
break;
case KEY.C:
if (ctrlMeta)
Buffer.copy();
break;
case KEY.X:
if (ctrlMeta)
Buffer.cut();
break;
case KEY.V:
if (ctrlMeta)
Buffer.paste();
break;
case KEY.Z:
if (ctrlMeta)
Buffer.clear();
break;
case KEY.COLON:
CloudCmd.CommandLine.show();
event.preventDefault();
break;
/* чистим хранилище */
case KEY.D:
if (ctrlMeta) {
CloudCmd.log('clearing storage...');
await DOM.Storage.clear();
CloudCmd.log('storage cleared');
event.preventDefault();
}
break;
case KEY.DOT:
if (meta && shift) {
const showDotFiles = !CloudCmd.config('showDotFiles');
CloudCmd._config('showDotFiles', showDotFiles);
CloudCmd.refresh();
await DOM.RESTful.Config.write({
showDotFiles,
});
}
break;
}
}

56
client/key/index.spec.js Normal file
View file

@ -0,0 +1,56 @@
import autoGlobals from 'auto-globals';
import supertape from 'supertape';
import {ESC} from './key.js';
import {Key, _listener} from './index.js';
import {getDOM, getCloudCmd} from './vim/globals.fixture.js';
const test = autoGlobals(supertape);
const {stub} = supertape;
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
test('cloudcmd: client: key: enable vim', async (t) => {
const vim = stub();
const config = stub().returns(true);
const _config = stub();
const event = {
keyCode: ESC,
key: 'Escape',
altKey: false,
};
Key.setBind();
await _listener(event, {
vim,
config,
_config,
switchKey: stub(),
});
t.calledWith(vim, ['Escape', event]);
t.end();
});
test('cloudcmd: client: key: disable vim', async (t) => {
const _config = stub();
const config = stub();
const event = {
keyCode: ESC,
key: 'Escape',
altKey: false,
};
Key.setBind();
await _listener(event, {
config,
_config,
switchKey: stub(),
});
t.calledWith(_config, ['vim', true]);
t.end();
});

58
client/key/key.js Normal file
View file

@ -0,0 +1,58 @@
export const BACKSPACE = 8;
export const TAB = 9;
export const ENTER = 13;
export const CAPSLOCK = 20;
export const ESC = 27;
export const SPACE = 32;
export const PAGE_UP = 33;
export const PAGE_DOWN = 34;
export const END = 35;
export const HOME = 36;
export const LEFT = 37;
export const UP = 38;
export const RIGHT = 39;
export const DOWN = 40;
export const INSERT = 45;
export const DELETE = 46;
export const ZERO = 48;
export const SEMICOLON = 52;
export const A = 65;
export const C = 67;
export const D = 68;
export const G = 71;
export const J = 74;
export const K = 75;
export const L = 76;
export const M = 77;
export const O = 79;
export const P = 80;
export const Q = 81;
export const R = 82;
export const S = 83;
export const T = 84;
export const U = 85;
export const V = 86;
export const X = 88;
export const Z = 90;
export const INSERT_MAC = 96;
export const ASTERISK = 106;
export const PLUS = 107;
export const MINUS = 109;
export const F1 = 112;
export const F2 = 113;
export const F3 = 114;
export const F4 = 115;
export const F5 = 116;
export const F6 = 117;
export const F7 = 118;
export const F8 = 119;
export const F9 = 120;
export const F10 = 121;
export const COLON = 186;
export const EQUAL = 187;
export const HYPHEN = 189;
export const DOT = 190;
export const SLASH = 191;
export const TRA = 192;
export const BACKSLASH = 220;
export const BRACKET_CLOSE = 221;

View file

@ -0,0 +1,57 @@
/* global DOM */
import {escapeRegExp} from '#common/util';
export default function setCurrentByChar(char, charStore) {
const Info = DOM.CurrentInfo;
let firstByName;
let skipCount = 0;
let set = false;
let i = 0;
const escapeChar = escapeRegExp(char);
const regExp = new RegExp(`^${escapeChar}.*$`, 'i');
const {files} = Info;
const chars = charStore();
const n = chars.length;
while (i < n && char === chars[i])
i++;
if (!i)
charStore([]);
const skipN = skipCount = i;
charStore(charStore().concat(char));
const names = DOM.getFilenames(files);
const isTest = (a) => regExp.test(a);
const isRoot = (a) => a === '..';
const not = (f) => (a) => !f(a);
const setCurrent = (name) => {
const byName = DOM.getCurrentByName(name);
if (!skipCount) {
set = true;
DOM.setCurrentFile(byName);
return true;
}
if (skipN === skipCount)
firstByName = byName;
--skipCount;
};
names
.filter(isTest)
.filter(not(isRoot))
.some(setCurrent);
if (!set) {
DOM.setCurrentFile(firstByName);
charStore([char]);
}
}

47
client/key/vim/find.js Normal file
View file

@ -0,0 +1,47 @@
import {fullstore} from 'fullstore';
import limier from 'limier';
const searchStore = fullstore([]);
const searchIndex = fullstore(0);
export const find = (value, names) => {
const result = limier(value, names);
searchStore(result);
searchIndex(0);
return result;
};
export const findNext = () => {
const names = searchStore();
const index = next(searchIndex(), names.length);
searchIndex(index);
return names[searchIndex()];
};
export const findPrevious = () => {
const names = searchStore();
const index = previous(searchIndex(), names.length);
searchIndex(index);
return names[index];
};
export const _next = next;
export const _previous = previous;
function next(index, length) {
if (index === length - 1)
return 0;
return ++index;
}
function previous(index, length) {
if (!index)
return length - 1;
return --index;
}

View file

@ -0,0 +1,55 @@
import test from 'supertape';
import {getDOM} from './globals.fixture.js';
import {
_next,
_previous,
find,
findNext,
findPrevious,
} from './find.js';
globalThis.DOM = getDOM();
test('cloudcmd: client: vim: _next', (t) => {
const result = _next(1, 2);
t.notOk(result, 'should return 0');
t.end();
});
test('cloudcmd: client: vim: _next: increment', (t) => {
const result = _next(0, 2);
t.equal(result, 1, 'should return 1');
t.end();
});
test('cloudcmd: client: vim: _previous', (t) => {
const result = _previous(0, 2);
t.equal(result, 1, 'should return 1');
t.end();
});
test('cloudcmd: client: vim: _previous: decrement', (t) => {
const result = _previous(1, 2);
t.equal(result, 0, 'should return 0');
t.end();
});
test('cloudcmd: client: vim: findNext: after find', (t) => {
find('a', ['alpha', 'beta', 'apple']);
const result = findNext();
t.equal(result, 'beta', 'should return next found name');
t.end();
});
test('cloudcmd: client: vim: findPrevious: after find', (t) => {
find('a', ['alpha', 'beta', 'apple']);
const result = findPrevious();
t.equal(result, 'apple', 'should return previous found name');
t.end();
});

View file

@ -0,0 +1,46 @@
const noop = () => {};
export const getDOM = () => {
const prompt = Promise.resolve.bind(Promise);
const CurrentInfo = {
element: {},
files: [],
};
const Buffer = {
copy: noop,
paste: noop,
};
const Dialog = {
prompt,
};
return {
Buffer,
CurrentInfo,
Dialog,
selectFile: noop,
unselectFile: noop,
unselectFiles: noop,
setCurrentFile: noop,
getCurrentName: noop,
setCurrentByName: noop,
toggleSelectedFile: noop,
prompNewDirectory: noop,
promptNewFile: noop,
};
};
export const getCloudCmd = () => {
const show = () => {};
return {
Operation: {
show,
},
config: noop,
_config: noop,
};
};

167
client/key/vim/index.js Normal file
View file

@ -0,0 +1,167 @@
import vim from './vim.js';
import * as finder from './find.js';
import {
setCurrent,
selectFileNotParent,
} from './set-current.js';
export default (key, event, overrides = {}) => {
const defaults = {
...globalThis.DOM,
...globalThis.CloudCmd,
};
const deps = {
...defaults,
...overrides,
};
const operations = getOperations(event, deps);
vim(key, operations, deps);
};
const getOperations = (event, deps) => {
const {
Info = globalThis.DOM.CurrentInfo,
CloudCmd = globalThis.CloudCmd,
Operation,
unselectFiles,
setCurrentFile,
setCurrentByName,
getCurrentName,
prompt = globalThis.DOM.Dialog.prompt,
preventDefault = event?.preventDefault?.bind(event),
stopImmediatePropagation = event?.preventDefault?.bind(event),
promptNewFile = globalThis.DOM.promptNewFile,
toggleSelectedFile,
Buffer = {},
createFindNext = _createFindNext,
createFindPrevious = _createFindPrevious,
createMakeFile = _createMakeFile,
renameCurrent,
} = deps;
return {
makeFile: createMakeFile({
promptNewFile,
preventDefault,
stopImmediatePropagation,
}),
findNext: createFindNext({
setCurrentByName,
}),
findPrevious: createFindPrevious({
setCurrentByName,
}),
escape: unselectFiles,
rename: () => {
event.preventDefault();
renameCurrent();
},
remove: () => {
Operation.show('delete');
},
operationCopy: () => {
event.preventDefault();
Operation.show('copy');
},
operationMove: () => {
event.preventDefault();
Operation.show('move');
},
makeDirectory: () => {
event.stopImmediatePropagation();
event.preventDefault();
globalThis.DOM.promptNewDir();
},
terminal: () => {
CloudCmd.Terminal.show();
},
edit: () => {
CloudCmd.EditFileVim.show();
},
copy: () => {
Buffer.copy();
unselectFiles();
},
select: () => {
const current = Info.element;
toggleSelectedFile(current);
},
paste: Buffer.paste,
moveNext: ({count, isVisual, isDelete}) => {
setCurrent('next', {
count,
isVisual,
isDelete,
}, {
Info,
setCurrentFile,
unselectFiles,
Operation,
});
},
movePrevious: ({count, isVisual, isDelete}) => {
setCurrent('previous', {
count,
isVisual,
isDelete,
}, {
Info,
setCurrentFile,
unselectFiles,
Operation,
});
},
find: async () => {
preventDefault();
const [, value] = await prompt('Find', '');
if (!value)
return;
const names = Info.files.map(getCurrentName);
const [result] = finder.find(value, names);
setCurrentByName(result);
},
};
};
export const selectFile = selectFileNotParent;
const _createFindPrevious = (overrides = {}) => () => {
const {setCurrentByName} = overrides;
const name = finder.findPrevious();
setCurrentByName(name);
};
const _createFindNext = (overrides = {}) => () => {
const {setCurrentByName} = overrides;
const name = finder.findNext();
setCurrentByName(name);
};
const _createMakeFile = (overrides = {}) => () => {
const {
promptNewFile,
stopImmediatePropagation,
preventDefault,
} = overrides;
stopImmediatePropagation();
preventDefault();
promptNewFile();
};

View file

@ -0,0 +1,756 @@
import {test, stub} from 'supertape';
import {getDOM, getCloudCmd} from './globals.fixture.js';
import vim, {selectFile as vimSelectFile} from './index.js';
import * as finder from './find.js';
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const {assign} = Object;
const {DOM} = globalThis;
const {Buffer} = DOM;
test('cloudcmd: client: key: set next file: no', (t) => {
const element = {};
const setCurrentFile = stub();
const unselectFiles = stub();
const Info = {
element,
};
vim('j', {}, {
Info,
setCurrentFile,
unselectFiles,
});
t.calledWith(setCurrentFile, [element], 'should set next file');
t.end();
});
test('cloudcmd: client: key: set next file current: j', async (t) => {
const nextSibling = 'hello';
const element = {
nextSibling,
};
const setCurrentFile = stub();
const Info = {
element,
};
await vim('j', {}, {
Info,
setCurrentFile,
unselectFiles: stub(),
});
t.calledWith(setCurrentFile, [nextSibling], 'should set next file');
t.end();
});
test('cloudcmd: client: key: set next file current: mjj', (t) => {
const nextSibling = 'hello';
const element = {
nextSibling,
};
const setCurrentFile = stub();
const Info = {
element,
};
const deps = {
Info,
setCurrentFile,
unselectFiles: stub(),
};
vim('m', {}, deps);
vim('j', {}, deps);
vim('j', {}, deps);
t.calledWith(setCurrentFile, [nextSibling], 'should set next file');
t.end();
});
test('cloudcmd: client: key: set next file current: g', (t) => {
const nextSibling = 'hello';
const element = {
nextSibling,
};
const setCurrentFile = stub();
const Info = {
element,
};
const deps = {
Info,
setCurrentFile,
unselectFiles: stub(),
};
vim('g', {}, deps);
vim('j', {}, deps);
t.calledWith(setCurrentFile, [nextSibling], 'should ignore g');
t.end();
});
test('cloudcmd: client: key: set +2 file current', (t) => {
const last = {};
const setCurrentFile = stub();
const element = {};
const Info = {
element,
};
const deps = {
setCurrentFile,
Info,
unselectFiles: stub(),
};
const event = {};
vim('2', event, deps);
vim('j', event, deps);
t.calledWith(setCurrentFile, [last], 'should set next file');
t.end();
});
test('cloudcmd: client: key: select +2 files from current before delete', (t) => {
const last = {};
const nextSibling = {
nextSibling: last,
};
const element = {
nextSibling,
};
const setCurrentFile = stub();
const Info = {
element,
};
const Operation = {
show: stub(),
};
const selectFile = stub();
const getCurrentName = stub().returns('x');
const event = {};
const deps = {
Info,
setCurrentFile,
selectFile,
getCurrentName,
Operation,
};
vim('d', event, deps);
vim('2', event, deps);
vim('j', event, deps);
t.calledWith(setCurrentFile, [last], 'should set next file');
t.end();
});
test('cloudcmd: client: key: delete +2 files from current', (t) => {
const last = {};
const nextSibling = {
nextSibling: last,
};
const element = {
nextSibling,
};
const setCurrentFile = stub();
const show = stub();
const deps = {
Info: {
element,
},
Operation: {
show,
},
setCurrentFile,
selectFile: stub(),
getCurrentName: stub().returns('x'),
unselectFiles: stub(),
};
const event = {};
vim('d', event, deps);
vim('2', event, deps);
vim('j', event, deps);
t.calledWith(show, ['delete'], 'should call delete');
t.end();
});
test('cloudcmd: client: key: set previous file current', (t) => {
const previousSibling = 'hello';
const element = {
previousSibling,
};
const setCurrentFile = stub();
const unselectFiles = stub();
const Info = {
element,
};
const deps = {
Info,
setCurrentFile,
unselectFiles,
};
vim('k', {}, deps);
t.calledWith(setCurrentFile, [previousSibling], 'should set previous file');
t.end();
});
test('cloudcmd: client: key: copy: no', (t) => {
const copy = stub();
vim('y', {}, {
unselectFiles: stub(),
Buffer: {
copy,
},
});
t.notCalled(copy, 'should not copy files');
t.end();
});
test('cloudcmd: client: key: copy', (t) => {
const copy = stub();
const Info = {
element: {},
};
const toggleSelectedFile = stub();
const unselectFiles = stub();
const deps = {
Info,
unselectFiles,
toggleSelectedFile,
Buffer: {
copy,
},
};
vim('v', {}, deps);
vim('y', {}, deps);
t.calledWithNoArgs(copy, 'should copy files');
t.end();
});
test('cloudcmd: client: key: copy: unselectFiles', (t) => {
const unselectFiles = stub();
const Info = {
element: {},
};
const toggleSelectedFile = stub();
const deps = {
Info,
unselectFiles,
toggleSelectedFile,
Buffer: {
copy: stub(),
},
};
vim('v', {}, deps);
vim('y', {}, deps);
t.calledWithNoArgs(unselectFiles, 'should unselect files');
t.end();
});
test('cloudcmd: client: key: paste', (t) => {
const paste = stub();
Buffer.paste = paste;
vim('p', {}, {
Buffer,
});
t.calledWithNoArgs(paste, 'should paste files');
t.end();
});
test('cloudcmd: client: key: selectFile: ..', (t) => {
const getCurrentName = stub().returns('..');
const selectFile = stub();
const current = {};
vimSelectFile(current, {
selectFile,
getCurrentName,
});
t.notCalled(selectFile, 'should not call selectFile');
t.end();
});
test('cloudcmd: client: key: selectFile', (t) => {
const selectFile = stub();
const getCurrentName = stub().returns('x');
const current = {};
vimSelectFile(current, {
selectFile,
getCurrentName,
});
t.calledWith(selectFile, [current], 'should call selectFile');
t.end();
});
test('cloudcmd: client: key: set last file current: shift + g', async (t) => {
const last = 'last';
const nextSibling = {
nextSibling: last,
};
const element = {
nextSibling,
};
const setCurrentFile = stub();
await vim('G', {}, {
Info: {
element,
},
setCurrentFile,
unselectFiles: stub(),
});
t.calledWith(setCurrentFile, [last], 'should set last file');
t.end();
});
test('cloudcmd: client: key: set last file current: $', (t) => {
const last = 'last';
const nextSibling = {
nextSibling: last,
};
const element = {
nextSibling,
};
const setCurrentFile = stub();
vim('$', {}, {
Info: {
element,
},
setCurrentFile,
unselectFiles: stub(),
});
t.calledWith(setCurrentFile, [last], 'should set last file');
t.end();
});
test('cloudcmd: client: key: set first file current: gg', (t) => {
const first = 'first';
const previousSibling = {
previousSibling: first,
};
const element = {
previousSibling,
};
const Operation = {
show: stub(),
};
const unselectFiles = stub();
const setCurrentFile = stub();
const deps = {
Operation,
unselectFiles,
setCurrentFile,
Info: {
element,
},
};
vim('g', {}, deps);
vim('g', {}, deps);
t.calledWith(setCurrentFile, [first], 'should set first file');
t.end();
});
test('cloudcmd: client: key: set first file current: ^', async (t) => {
const first = 'first';
const previousSibling = {
previousSibling: first,
};
const element = {
previousSibling,
};
const Operation = {
show: stub(),
};
const unselectFiles = stub();
const setCurrentFile = stub();
const deps = {
setCurrentFile,
Info: {
element,
},
unselectFiles,
Operation,
};
await vim('^', {}, deps);
t.calledWith(setCurrentFile, [first], 'should set first file');
t.end();
});
test('cloudcmd: client: key: visual', (t) => {
const element = {};
const toggleSelectedFile = stub();
const Info = {
element,
};
vim('v', {}, {
Info,
toggleSelectedFile,
});
t.calledWith(toggleSelectedFile, [element], 'should toggle selection');
t.end();
});
test('cloudcmd: client: key: ESC', (t) => {
const element = {};
const unselectFiles = stub();
const Info = {
element,
};
vim('Escape', null, {
Info,
unselectFiles,
});
t.calledWithNoArgs(unselectFiles, 'should toggle selection');
t.end();
});
test('cloudcmd: client: key: Enter', async (t) => {
const nextSibling = 'hello';
const element = {
nextSibling,
};
const unselectFiles = stub();
const setCurrentFile = stub();
const Info = {
element,
};
await vim('Enter', null, {
Info,
setCurrentFile,
unselectFiles,
});
await vim('j', null, {
Info,
setCurrentFile,
unselectFiles,
});
t.calledWith(setCurrentFile, [nextSibling], 'should set next file');
t.end();
});
test('cloudcmd: client: key: /', (t) => {
const preventDefault = stub();
const element = {};
const Info = {
element,
files: [],
};
const getCurrentName = stub().returns('');
const event = {
preventDefault,
};
const prompt = stub().returns([]);
vim('/', event, {
getCurrentName,
Info,
prompt,
});
t.calledWithNoArgs(preventDefault);
t.end();
});
test('cloudcmd: client: find', (t) => {
assign(DOM.Dialog, {
prompt: stub().returns([]),
});
const setCurrentByName = stub();
assign(DOM, {
setCurrentByName,
});
const event = {
preventDefault: stub(),
};
vim('/', event);
t.notCalled(setCurrentByName);
t.end();
});
test('cloudcmd: client: key: n', (t) => {
const findNext = stub();
const createFindNext = stub().returns(findNext);
const event = {};
vim('n', event, {
createFindNext,
});
t.calledWithNoArgs(findNext, 'should call findNext');
t.end();
});
test('cloudcmd: client: key: N', (t) => {
const findPrevious = stub();
const createFindPrevious = stub().returns(findPrevious);
const event = {};
vim('N', event, {
createFindPrevious,
});
t.calledWithNoArgs(findPrevious);
t.end();
});
test('cloudcmd: client: key: make directory', async (t) => {
const {DOM} = globalThis;
assign(DOM, {
promptNewDir: stub(),
});
const event = {
stopImmediatePropagation: stub(),
preventDefault: stub(),
};
await vim('m', event);
await vim('d', event);
t.calledWithNoArgs(DOM.promptNewDir);
t.end();
});
test('cloudcmd: client: key: make file', (t) => {
const promptNewFile = stub();
const event = {
stopImmediatePropagation: stub(),
preventDefault: stub(),
};
vim('m', event);
vim('f', event, {
promptNewFile,
});
t.calledWithNoArgs(promptNewFile);
t.end();
});
test('cloudcmd: client: vim: terminal', (t) => {
const CloudCmd = {
Terminal: {
show: stub(),
},
};
const event = {};
vim('t', event, {
CloudCmd,
});
vim('t', event, {
CloudCmd,
});
t.calledWithNoArgs(CloudCmd.Terminal.show);
t.end();
});
test('cloudcmd: client: vim: edit', async (t) => {
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const {CloudCmd} = globalThis;
assign(CloudCmd, {
EditFileVim: {
show: stub(),
},
});
const event = {};
await vim('e', event);
t.calledWithNoArgs(CloudCmd.EditFileVim.show);
t.end();
});
test('cloudcmd: client: vim: rename', async (t) => {
const DOM = getDOM();
const renameCurrent = stub();
assign(DOM, {
renameCurrent,
});
const event = {
preventDefault: stub(),
};
await vim('rr', event, DOM);
t.calledWithNoArgs(renameCurrent);
t.end();
});
test('cloudcmd: client: key: cc: operationCopy', (t) => {
const show = stub();
const preventDefault = stub();
const Operation = {
show,
};
const event = {
preventDefault,
};
vim('c', event, {
Operation,
});
vim('c', event, {
Operation,
});
t.calledWith(show, ['copy'], 'should show copy operation');
t.end();
});
test('cloudcmd: client: key: mm: operationMove', (t) => {
const show = stub();
const preventDefault = stub();
const Operation = {
show,
};
const event = {
preventDefault,
};
vim('m', event, {
Operation,
});
vim('m', event, {
Operation,
});
t.calledWith(show, ['move'], 'should show move operation');
t.end();
});
test('cloudcmd: client: key: n: findNext: real', (t) => {
const setCurrentByName = stub();
finder.find('a', ['alpha', 'beta', 'apple']);
const event = {};
vim('n', event, {
setCurrentByName,
});
t.calledWith(setCurrentByName, ['beta'], 'should set current by next found name');
t.end();
});
test('cloudcmd: client: key: N: findPrevious: real', (t) => {
const setCurrentByName = stub();
finder.find('a', ['alpha', 'beta', 'apple']);
const event = {};
vim('N', event, {
setCurrentByName,
});
t.calledWith(setCurrentByName, ['apple'], 'should set current by previous found name');
t.end();
});

View file

@ -0,0 +1,33 @@
/* global DOM */
export function selectFileNotParent(current, {getCurrentName, selectFile} = DOM) {
const name = getCurrentName(current);
if (name === '..')
return;
selectFile(current);
}
export const setCurrent = (sibling, {count, isVisual, isDelete}, {Info, setCurrentFile, unselectFiles, Operation}) => {
let current = Info.element;
const select = isVisual ? selectFileNotParent : unselectFiles;
select(current);
const position = `${sibling}Sibling`;
for (let i = 0; i < count; i++) {
const next = current[position];
if (!next)
break;
current = next;
select(current);
}
setCurrentFile(current);
if (isDelete)
Operation.show('delete');
};

220
client/key/vim/vim.js Normal file
View file

@ -0,0 +1,220 @@
import {fullstore} from 'fullstore';
const store = fullstore('');
const visual = fullstore(false);
const stopVisual = () => {
visual(false);
};
const end = () => {
store('');
};
const rmFirst = (a) => {
return a
.split('')
.slice(1)
.join('');
};
const noop = () => {};
export default (key, operations = {}) => {
const prevStore = store();
const isVisual = visual();
const value = store(prevStore.concat(key));
const {
escape = noop,
moveNext = noop,
movePrevious = noop,
remove = noop,
copy = noop,
paste = noop,
select = noop,
find = noop,
findNext = noop,
findPrevious = noop,
makeFile = noop,
makeDirectory = noop,
terminal = noop,
edit = noop,
operationCopy = noop,
operationMove = noop,
rename = noop,
} = operations;
if (key === 'Enter')
return end();
if (key === 'Escape') {
visual(false);
escape();
return end();
}
if (key === 'j' || key === 'w') {
const {
count,
isDelete,
isVisual,
} = handleDelete(prevStore);
!isNaN(count) && moveNext({
count,
isVisual,
isDelete,
});
return end();
}
if (key === 'k' || key === 'b') {
const {
count,
isDelete,
isVisual,
} = handleDelete(prevStore);
!isNaN(count) && movePrevious({
count,
isVisual,
isDelete,
});
return end();
}
if (value === 'gg' || key === '^') {
const {isDelete, isVisual} = handleDelete(prevStore);
movePrevious({
count: Infinity,
isVisual,
isDelete,
});
return end();
}
if (value === 'md') {
makeDirectory();
return end();
}
if (value === 'tt') {
terminal();
return end();
}
if (value === 'e') {
edit();
return end();
}
if (value === 'cc') {
operationCopy();
return end();
}
if (value === 'mm') {
operationMove();
return end();
}
if (value === 'mf') {
makeFile();
return end();
}
if (value === 'rr') {
rename();
return end();
}
if (key === 'd' && (visual() || prevStore === 'd')) {
stopVisual();
remove();
return end();
}
if (key === 'G' || key === '$') {
moveNext({
count: Infinity,
isVisual,
});
return end();
}
if (key === 'y') {
if (!visual())
return end();
stopVisual();
copy();
return end();
}
if (/^p$/i.test(key)) {
paste();
return end();
}
if (/^v$/i.test(key)) {
visual(!visual());
select();
return end();
}
if (key === '/') {
find();
return end();
}
if (key === 'n') {
findNext();
return end();
}
if (key === 'N') {
findPrevious();
return end();
}
if (key === ' ')
return end();
};
function handleDelete(prevStore) {
const isDelete = prevStore[0] === 'd';
if (isDelete) {
visual(true);
prevStore = rmFirst(prevStore);
}
const count = getNumber(prevStore);
const isVisual = visual();
return {
count,
isDelete,
isVisual,
};
}
function getNumber(value) {
if (!value)
return 1;
if (value === 'g')
return 1;
return parseInt(value);
}

100
client/key/vim/vim.spec.js Normal file
View file

@ -0,0 +1,100 @@
import {test, stub} from 'supertape';
import vim from './vim.js';
test('vim: no operations', (t) => {
const result = vim('hello', {});
t.notOk(result);
t.end();
});
test('vim: space', (t) => {
const moveNext = stub();
vim(' ');
vim('j', {
moveNext,
});
const args = [{
count: 1,
isDelete: false,
isVisual: false,
}];
t.calledWith(moveNext, args);
t.end();
});
test('vim: ^', (t) => {
const movePrevious = stub();
vim('^', {
movePrevious,
});
const expected = {
count: Infinity,
isVisual: false,
isDelete: false,
};
t.calledWith(movePrevious, [expected], 'should call movePrevious');
t.end();
});
test('vim: cc', (t) => {
const operationCopy = stub();
vim('cc', {
operationCopy,
});
t.calledWithNoArgs(operationCopy);
t.end();
});
test('vim: mm', (t) => {
const operationMove = stub();
vim('mm', {
operationMove,
});
t.calledWithNoArgs(operationMove);
t.end();
});
test('vim: w', (t) => {
const moveNext = stub();
vim('w', {
moveNext,
});
const expected = {
count: 1,
isVisual: false,
isDelete: false,
};
t.calledWith(moveNext, [expected], 'should call moveNext');
t.end();
});
test('vim: b', (t) => {
const movePrevious = stub();
vim('b', {
movePrevious,
});
const expected = {
count: 1,
isVisual: false,
isDelete: false,
};
t.calledWith(movePrevious, [expected], 'should call movePrevious');
t.end();
});

View file

@ -1,11 +1,10 @@
'use strict';
import currify from 'currify';
module.exports = (array, item) => {
export const getIndex = currify((array, item) => {
const index = array.indexOf(item);
if (!~index)
return 0;
return index;
};
});

View file

@ -1,9 +1,5 @@
'use strict';
const test = require('tape');
const dir = '../../../client/listeners';
const getIndex = require(`${dir}/get-index`);
import test from 'supertape';
import {getIndex} from './get-index.js';
test('cloudcmd: client: listeners: getIndex: not found', (t) => {
const array = ['hello'];
@ -13,9 +9,11 @@ test('cloudcmd: client: listeners: getIndex: not found', (t) => {
});
test('cloudcmd: client: listeners: getIndex: found', (t) => {
const array = ['hello', 'world'];
const array = [
'hello',
'world',
];
t.equal(getIndex(array, 'world'), 1, 'should return index');
t.end();
});

View file

@ -1,6 +1,4 @@
'use strict';
module.exports = (indexFrom, indexTo, files) => {
export const getRange = (indexFrom, indexTo, files) => {
if (indexFrom < indexTo)
return files.slice(indexFrom, indexTo + 1);
@ -9,4 +7,3 @@ module.exports = (indexFrom, indexTo, files) => {
return [files[indexFrom]];
};

View file

@ -0,0 +1,52 @@
import test from 'supertape';
import {getRange} from './get-range.js';
test('cloudcmd: client: listeners: getRange: direct', (t) => {
const expected = [
'hello',
'world',
];
const files = [
...expected,
'how',
'come',
];
const result = getRange(0, 1, files);
t.deepEqual(result, expected, 'should return range');
t.end();
});
test('cloudcmd: client: listeners: getRange: reverse', (t) => {
const expected = [
'hello',
'world',
];
const files = [
...expected,
'how',
'come',
];
const result = getRange(1, 0, files);
t.deepEqual(result, expected, 'should return range');
t.end();
});
test('cloudcmd: client: listeners: getRange: one', (t) => {
const expected = ['hello'];
const files = [
...expected,
'how',
'come',
];
const result = getRange(0, 0, files);
t.deepEqual(result, expected, 'should return range');
t.end();
});

View file

@ -1,35 +1,30 @@
/* global DOM, CloudCmd */
import exec from 'execon';
import itype from 'itype';
import currify from 'currify';
import {tryToCatch} from 'try-to-catch';
import clipboard from '@cloudcmd/clipboard';
import * as Events from '#dom/events';
import {uploadFiles} from '#dom/upload-files';
import {FS} from '#common/cloudfunc';
import {getRange} from './get-range.js';
import {getIndex} from './get-index.js';
'use strict';
const NBSP_REG = RegExp(String.fromCharCode(160), 'g');
const SPACE = ' ';
const exec = require('execon');
const itype = require('itype/legacy');
const currify = require('currify/legacy');
const getRange = require('./get-range');
const getIndex = currify(require('./get-index'));
const uploadFiles = require('../dom/upload-files');
const {
FS,
apiURL
} = require('../../common/cloudfunc');
module.exports.init = () => {
export async function init() {
contextMenu();
dragndrop();
unload();
pop();
resize();
config();
header();
};
CloudCmd.Listeners = module.exports;
await config();
}
const unselect = (event) => {
const isMac = /Mac/.test(window.navigator.platform);
const isMac = /Mac/.test(globalThis.navigator.platform);
const {
shiftKey,
metaKey,
@ -43,31 +38,25 @@ const unselect = (event) => {
};
const execAll = currify((funcs, event) => {
funcs.forEach((fn) => {
for (const fn of funcs)
fn(event);
});
});
const Info = DOM.CurrentInfo;
const Storage = DOM.Storage;
const Events = DOM.Events;
const EventsFiles = {
mousedown: exec.with(execIfNotUL, setCurrentFileByEvent),
click: execAll([onClick, unselect]),
click: execAll([onClick, exec.with(execIfNotMobile, unselect)]),
dragstart: exec.with(execIfNotUL, onDragStart),
dblclick: exec.with(execIfNotUL, onDblClick),
touchstart: exec.with(execIfNotUL, onTouch)
touchstart: exec.with(execIfNotUL, onTouch),
};
let EXT;
function header() {
const fm = DOM.getFM();
const isDataset = (el) => el.dataset;
var isPanel = (el) => {
const isPanel = (el) => {
return /^js-(left|right)$/.test(el.dataset.name);
};
@ -78,8 +67,7 @@ function header() {
if (parent.dataset.name !== 'js-fm-header')
return;
const name = (el.dataset.name || '')
.replace('js-', '');
const name = (el.dataset.name || '').replace('js-', '');
if (!/^(name|size|date)$/.test(name))
return;
@ -100,44 +88,48 @@ function getPath(el, path = []) {
return getPath(el.parentElement, path.concat(el));
}
function config() {
DOM.Files.get('config', (e, config) => {
const type = config && config.packer;
EXT = DOM.getPackerExt(type);
});
async function config() {
const [, config] = await tryToCatch(DOM.Files.get, 'config');
const type = config?.packer;
EXT = DOM.getPackerExt(type);
}
module.exports.initKeysPanel = () => {
export const initKeysPanel = () => {
const keysElement = DOM.getById('js-keyspanel');
if (!keysElement)
return;
Events.addClick(keysElement, ({target}) => {
const id = target.id;
Events.addClick(keysElement, (event) => {
const {target} = event;
const {id} = target;
const operation = (name) => {
const Operation = CloudCmd.Operation;
const fn = Operation.show.bind(null, name);
const {Operation} = CloudCmd;
return fn;
return Operation.show.bind(null, name);
};
const clickFuncs = {
'f1' : CloudCmd.Help.show,
'f2' : DOM.renameCurrent,
'f3' : CloudCmd.View.show,
'f4' : CloudCmd.EditFile.show,
'f5' : operation('copy'),
'f6' : operation('move'),
'f7' : DOM.promptNewDir,
'f8' : operation('delete'),
'f9' : CloudCmd.Menu.show,
'f10' : CloudCmd.Config.show,
'~' : CloudCmd.Konsole.show,
'shift~' : CloudCmd.Terminal.show,
'contact' : CloudCmd.Contact.show,
'f1': CloudCmd.Help.show,
'f2': CloudCmd.UserMenu.show,
'f3': CloudCmd.View.show,
'f4': CloudCmd.EditFile.show,
'f5': operation('copy'),
'f6': operation('move'),
'f7': DOM.promptNewDir,
'f8': operation('delete'),
'f9': () => {
event.stopPropagation();
CloudCmd.Menu.show();
},
'f10': CloudCmd.Config.show,
'~': CloudCmd.Konsole.show,
'shift~': CloudCmd.Terminal.show,
'contact': CloudCmd.Contact.show,
};
exec(clickFuncs[id]);
});
};
@ -146,10 +138,10 @@ const getPanel = (side) => {
if (!itype.string(side))
return side;
return DOM.getByDataName('js-' + side);
return DOM.getByDataName(`js-${side}`);
};
module.exports.setOnPanel = (side) => {
export const setOnPanel = (side) => {
const panel = getPanel(side);
const filesElement = DOM.getByDataName('js-files', panel);
@ -165,61 +157,71 @@ function getPathListener(panel) {
}
function isNoCurrent(panel) {
const Info = DOM.CurrentInfo;
const infoPanel = Info.panel;
const namePanel = panel.getAttribute('data-name');
const nameInfoPanel = infoPanel.getAttribute('data-name');
if (namePanel !== nameInfoPanel)
if (!infoPanel)
return true;
return false;
const namePanel = panel.getAttribute('data-name');
const nameInfoPanel = infoPanel.getAttribute('data-name');
return namePanel !== nameInfoPanel;
}
function onPathElementClick(panel, event) {
let link, href, url, noCurrent;
function decodePath(path) {
const url = CloudCmd.HOST;
const {prefix} = CloudCmd;
const prefixReg = RegExp('^' + prefix + FS);
return decodeURI(path)
.replace(url, '')
.replace(prefixReg, '') // browser doesn't replace % -> %25% do it for him
.replace('%%', '%25%')
.replace(NBSP_REG, SPACE) || '/';
}
async function onPathElementClick(panel, event) {
const Info = DOM.CurrentInfo;
event.preventDefault();
const prefix = CloudCmd.PREFIX;
const element = event.target;
const attr = element.getAttribute('data-name');
const noCurrent = isNoCurrent(panel);
switch (attr) {
case 'js-clear-storage':
Storage.clear();
break;
if (attr === 'js-copy-path')
return copyPath(element);
case 'js-refresh':
noCurrent = isNoCurrent(panel);
CloudCmd.refresh({
if (attr === 'js-refresh')
return CloudCmd.refresh({
panel,
noCurrent
noCurrent,
});
event.preventDefault();
break;
case 'js-path-link':
url = CloudCmd.HOST;
href = element.href;
link = href.replace(url, '');
/**
* browser doesn't replace % -> %25%
* do it for him
*/
link = link.replace('%%', '%25%');
link = decodeURI(link);
link = link.replace(RegExp('^' + prefix + FS), '') || '/';
noCurrent = isNoCurrent(panel);
CloudCmd.loadDir({
path : link,
isRefresh : false,
panel : noCurrent ? panel : Info.panel
});
event.preventDefault();
}
if (attr !== 'js-path-link')
return;
const {href} = element;
const path = decodePath(href);
await CloudCmd.changeDir(path, {
isRefresh: false,
panel: noCurrent ? panel : Info.panel,
});
}
function copyPath(el) {
clipboard
.writeText(el.parentElement.title)
.then(CloudCmd.log)
.catch(CloudCmd.log);
}
function execIfNotMobile(callback, event) {
const isMobile = DOM.getCSSVar('is-mobile');
if (!isMobile)
callback(event);
}
function execIfNotUL(callback, event) {
@ -231,30 +233,27 @@ function execIfNotUL(callback, event) {
}
function onClick(event) {
const ctrl = event.ctrlKey;
if (!ctrl)
event.preventDefault();
event.preventDefault();
changePanel(event.target);
}
function toggleSelect(key, files) {
const isMac = /Mac/.test(window.navigator.platform);
const isMac = /Mac/.test(globalThis.navigator.platform);
if (!key)
throw Error('key should not be undefined!');
const [file] = files;
if (isMac && key.meta || key.ctrl)
if (isMac && key.meta)
return DOM.toggleSelectedFile(file);
if (key.shift)
return files.forEach(DOM.selectFile);
return files.map(DOM.selectFile);
}
function changePanel(element) {
const Info = DOM.CurrentInfo;
const {panel} = Info;
const files = DOM.getByDataName('js-files', panel);
const ul = getULElement(element);
@ -263,21 +262,20 @@ function changePanel(element) {
DOM.changePanel();
}
function onDblClick(event) {
async function onDblClick(event) {
event.preventDefault();
const current = getLIElement(event.target);
const isDir = DOM.isCurrentIsDir(current);
const path = DOM.getCurrentPath(current);
if (isDir) {
CloudCmd.loadDir({
path: path === '/' ? '/' : path + '/'
});
event.preventDefault();
}
if (!isDir)
return CloudCmd.View.show();
await CloudCmd.changeDir(path);
}
function onTouch(event) {
async function onTouch(event) {
const current = getLIElement(event.target);
const isDir = DOM.isCurrentIsDir(current);
@ -289,20 +287,18 @@ function onTouch(event) {
if (!isCurrent)
return;
CloudCmd.loadDir({
path: DOM.getCurrentPath(current)
});
event.preventDefault();
await CloudCmd.changeDir(DOM.getCurrentPath(current));
}
/*
/*
* download file from browser to desktop
* in Chrome (HTML5)
*/
function onDragStart(event) {
const Info = DOM.CurrentInfo;
const {prefixURL} = CloudCmd;
const element = getLIElement(event.target);
const isDir = Info.isDir;
const {isDir} = Info;
let link = DOM.getCurrentLink(element);
let name = DOM.getCurrentName(element);
@ -311,13 +307,15 @@ function onDragStart(event) {
name += EXT;
link = document.createElement('a');
link.textContent = name;
link.href = apiURL + '/pack' + Info.path + EXT;
link.href = prefixURL + '/pack' + Info.path + EXT;
}
event.dataTransfer.setData('DownloadURL',
'application/octet-stream' + ':' +
name + ':' +
link);
event.dataTransfer.setData(
'DownloadURL',
'application/octet-stream' + ':' + name +
':' +
link,
);
}
function getLIElement(element) {
@ -338,13 +336,14 @@ function getULElement(element) {
}
function setCurrentFileByEvent(event) {
const Info = DOM.CurrentInfo;
const BUTTON_LEFT = 0;
const key = {
alt: event.altKey,
ctrl: event.ctrlKey,
meta: event.metaKey,
shift: event.shiftKey
shift: event.shiftKey,
};
const element = getLIElement(event.target);
@ -381,7 +380,7 @@ function contextMenu() {
Events.addOnce('contextmenu', fm, (event) => {
CloudCmd.Menu.show({
x: event.clientX,
y: event.clientY
y: event.clientY,
});
});
@ -392,21 +391,17 @@ function contextMenu() {
function dragndrop() {
const panels = DOM.getByClassAll('panel');
const select = () => {
[...panels].forEach((panel) => {
panel.classList.add('selected-panel');
});
const select = ({target}) => {
target.classList.add('selected-panel');
};
const unselect = () => {
[...panels].forEach((panel) => {
panel.classList.remove('selected-panel');
});
const unselect = ({target}) => {
target.classList.remove('selected-panel');
};
const onDrop = (event) => {
const files = event.dataTransfer.files;
const items = event.dataTransfer.items;
const {files, items} = event.dataTransfer;
const {length: filesCount} = files;
event.preventDefault();
@ -415,22 +410,28 @@ function dragndrop() {
return uploadFiles(files);
const isFile = (item) => item.kind === 'file';
const dirFiles = [...items].filter(isFile);
const dirFiles = Array
.from(items)
.filter(isFile);
if (dirFiles.length)
return DOM.uploadDirectory(dirFiles);
return CloudCmd.Operation.show('copy');
const {Operation} = CloudCmd;
const operation = event.shiftKey ? 'move' : 'copy';
return Operation.show(operation);
};
/**
* In Mac OS Chrome dropEffect = 'none'
* In macOS Chrome dropEffect = 'none'
* so drop do not firing up when try
* to upload file from download bar
*/
const onDragOver = (event) => {
const dataTransfer = event.dataTransfer;
const effectAllowed = dataTransfer.effectAllowed;
const {dataTransfer} = event;
const {effectAllowed} = dataTransfer;
if (/move|linkMove/.test(effectAllowed))
dataTransfer.dropEffect = 'move';
@ -440,19 +441,18 @@ function dragndrop() {
event.preventDefault();
};
Events.add('dragenter', select);
Events.add(['dragleave', 'drop'], unselect);
[...panels].forEach((panel) => {
Events.add('dragover', panel, onDragOver)
.add('drop', panel, onDrop);
});
for (const panel of panels)
Events
.add('dragover', panel, onDragOver)
.add('drop', panel, onDrop)
.add('dragenter', select)
.add(['dragleave', 'drop'], unselect);
}
function unload() {
DOM.Events.add(['unload', 'beforeunload'], (event) => {
const Key = CloudCmd.Key;
const isBind = Key && Key.isBind();
Events.add(['unload', 'beforeunload'], (event) => {
const {Key} = CloudCmd;
const isBind = Key?.isBind();
if (isBind)
return;
@ -463,15 +463,15 @@ function unload() {
}
function pop() {
Events.add('popstate', (event) => {
const path = event.state.replace(FS, '');
Events.add('popstate', async ({state}) => {
const path = (state || '').replace(FS, '');
if (!path)
return CloudCmd.route(location.hash);
const history = false;
CloudCmd.loadDir({
path,
await CloudCmd.changeDir(path, {
history,
});
});
@ -479,7 +479,8 @@ function pop() {
function resize() {
Events.add('resize', () => {
const is = window.innerWidth < CloudCmd.MIN_ONE_PANEL_WIDTH;
const Info = DOM.CurrentInfo;
const is = globalThis.innerWidth < CloudCmd.MIN_ONE_PANEL_WIDTH;
if (!is)
return;
@ -499,4 +500,3 @@ function resize() {
DOM.changePanel();
});
}

56
client/load-module.js Normal file
View file

@ -0,0 +1,56 @@
/* global CloudCmd */
import exec from 'execon';
import {tryToCatch} from 'try-to-catch';
import {js as loadJS} from 'load.js';
import pascalCase from 'just-pascal-case';
const noJS = (a) => a.replace(/.js$/, '');
/**
* function load modules
* @params = {name, path, func, dobefore, arg}
*/
export const loadModule = (params) => {
if (!params)
return;
const {path} = params;
const name = path && noJS(pascalCase(path));
const doBefore = params.dobefore;
if (CloudCmd[name])
return;
CloudCmd[name] = async () => {
exec(doBefore);
const {DIR_MODULES} = CloudCmd;
const pathFull = `${DIR_MODULES}/${path}.js`;
await loadJS(pathFull);
const newModule = async (f) => f && f();
const module = CloudCmd[name];
Object.assign(newModule, module);
CloudCmd[name] = newModule;
CloudCmd.log('init', name);
await module.init();
return newModule;
};
CloudCmd[name].show = async (...args) => {
CloudCmd.log('show', name, args);
const m = CloudCmd[name];
const [e, a] = await tryToCatch(m);
if (e)
return;
return await a.show(...args);
};
};

Some files were not shown because too many files have changed in this diff Show more