Compare commits

...

2163 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
357 changed files with 21996 additions and 32161 deletions

View file

@ -1,17 +0,0 @@
platform: x64
install:
- ps: Install-Product node $env:nodejs_version $env:platform
build: off
build_script:
- node --version
- npm --version
- npm i now nupdate -g
- nupdate -a gritty
- now rm cloudcmd -y -t %NOW_TOKEN%
- now --public -t %NOW_TOKEN%
- now alias -t %NOW_TOKEN%

View file

@ -1,10 +0,0 @@
{
"presets": [
"env"
],
"plugins": [
"transform-object-assign",
"transform-object-rest-spread"
]
}

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

@ -11,27 +11,13 @@ yarn-error.log
yarn.lock
now.json
Dockerfile
Dockerfile.alpine
docker
webpack.config.js
cssnano.config.js
bin/release.js
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
client
legacy
server_

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,22 +0,0 @@
{
"env": {
"es6": true,
"node": true,
},
"parserOptions": {
"ecmaVersion": 2017,
"sourceType": "module",
"ecmaFeatures": {
"experimentalObjectRestSpread": true
}
},
"rules": {
"indent": ["error", 4],
"semi": "error",
"no-console": 0,
"no-use-before-define": ["error", "nofunc"]
},
"extends": [
"eslint:recommended"
]
}

View file

@ -1,15 +0,0 @@
{
"env": {
"node": true
},
"rules": {
"no-process-exit": 0
},
"extends": [
".eslintrc",
"plugin:node/recommended"
],
"plugins": [
"node"
]
}

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 @@
package-lock.json
yarn.lock
yarn-error.log
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
*.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

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,33 +1,29 @@
*.spec.*
*.config.*
*.fixture.js*
*.ai
*.cdr
*.eps
*.log
*.lock
.*
*.spec.js
manifest.yml
Dockerfile*
docker-compose.yml
test
now.json
app.json
bower.json
deno.json
bin/release.*
img/logo/cloudcmd-hq.png
webpack.config.js
docker
test*
fixture
fixture-*
coverage
css
html
yarn-error.log
yarn.lock
now.json
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
app.json
bower.json
manifest.yml
bin/release.js
client
webpack.config.js

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,16 +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
font-family-no-missing-generic-family-keyword: null
rule-empty-line-before: null

View file

@ -1,27 +0,0 @@
language: node_js
node_js:
- 10
- 8
script:
- npm run lint && npm run build && npm run coverage && npm run report
notifications:
email:
on_success: never
on_failure: change
sudo: required
services:
- docker
deploy:
provider: script
script: npm run docker-ci
skip_cleanup: true
on:
node: '8'
tags: true
all_branches: false

2
.typos.toml Normal file
View file

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

View file

@ -1,72 +0,0 @@
'use strict';
const fs = require('fs');
const {
basename,
extname,
join,
} = require('path');
const {env} = process;
const isDev = env.NODE_ENV === 'development';
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const extractCSS = (a) => new ExtractTextPlugin(`${a}.css`);
const extractMain = extractCSS('[name]');
const cssNames = [
'nojs',
'view',
'config',
...getCSSList('columns'),
];
const cssPlugins = cssNames.map(extractCSS);
const plugins = [
...cssPlugins,
extractMain,
];
const rules = [{
test: /\.css$/,
exclude: /css\/(nojs|view|config|columns.*)\.css/,
use: extractMain.extract([
'css-loader?minimize',
]),
},
...cssPlugins.map(extract), {
test: /\.(png|gif|svg|woff|woff2|eot|ttf)$/,
loader: 'url-loader?limit=50000',
}];
module.exports = {
plugins,
module: {
rules,
},
};
function getCSSList(dir) {
const base = (a) => basename(a, extname(a));
const addDir = (name) => `${dir}/${name}`;
const rootDir = join(__dirname, '..');
return fs.readdirSync(`${rootDir}/css/${dir}`)
.map(base)
.map(addDir);
}
function extract(extractPlugin) {
const {filename} = extractPlugin;
const loader = isDev ? 'css-loader' : 'css-loader?minimize';
return {
test: RegExp(`css/${filename}`),
use: extractPlugin.extract([
loader
])
};
}

View file

@ -1,43 +0,0 @@
'use strict';
const {env} = process;
const isDev = env.NODE_ENV === 'development';
const HtmlWebpackPlugin = require('html-webpack-plugin');
const plugins = [
new HtmlWebpackPlugin({
inject: false,
template: 'html/index.html',
minify: !isDev && getMinifyHtmlOptions(),
}),
];
module.exports = {
plugins,
};
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,
};
}

View file

@ -1,93 +0,0 @@
'use strict';
const {
resolve,
sep,
join,
} = require('path');
const dir = './client';
const dirModules = './client/modules';
const modules = './modules';
const {env} = process;
const isDev = env.NODE_ENV === 'development';
const rootDir = join(__dirname, '..');
const dist = resolve(rootDir, 'dist');
const distDev = resolve(rootDir, 'dist-dev');
const devtool = isDev ? 'eval' : 'source-map';
const notEmpty = (a) => a;
const clean = (array) => array.filter(notEmpty);
const rules = clean([
!isDev && {
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
}]);
const splitChunks = {
chunks: 'all',
name: 'cloudcmd.common',
};
module.exports = {
devtool,
optimization: {
splitChunks,
},
entry: {
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 + '/menu']: `${dirModules}/menu.js`,
[modules + '/view']: `${dirModules}/view.js`,
[modules + '/help']: `${dirModules}/help.js`,
[modules + '/markdown']: `${dirModules}/markdown.js`,
[modules + '/config']: `${dirModules}/config.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 + '/cloud']: `${dirModules}/cloud.js`,
[modules + '/polyfill']: `${dirModules}/polyfill.js`,
},
output: {
filename: '[name].js',
path: isDev ? distDev : dist,
pathinfo: isDev,
devtoolModuleFilenameTemplate,
publicPath: '/dist/',
},
externals: [
externals
],
module: {
rules,
},
};
function externals(context, request, fn) {
if (!isDev)
return fn();
const list = [
'es6-promise',
];
if (list.includes(request))
return fn(null, request);
fn();
}
function devtoolModuleFilenameTemplate(info) {
const resource = info.absoluteResourcePath.replace(rootDir + sep, '');
return `file://cloudcmd/${resource}`;
}

View file

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

View file

@ -8,19 +8,19 @@ In the interest of fostering an open and welcoming environment, we as contributo
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
- 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
- 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

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)

2937
ChangeLog

File diff suppressed because it is too large Load diff

View file

@ -1,24 +0,0 @@
FROM node:10.1
MAINTAINER Coderaiser
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm config set package-lock false && \
npm install --production && \
npm i gritty && \
npm cache clean --force
COPY . /usr/src/app
WORKDIR /root
ENV cloudcmd_terminal true
ENV cloudcmd_terminal_path gritty
EXPOSE 8000
ENTRYPOINT ["/usr/src/app/bin/cloudcmd.js"]

View file

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

1449
HELP.md

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
(The MIT License)
Copyright (c) 2012-2018 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

193
README.md
View file

@ -1,45 +1,33 @@
# Cloud Commander v9.6.0 [![License][LicenseIMGURL]][LicenseURL] [![NPM version][NPMIMGURL]][NPMURL] [![Dependency Status][DependencyStatusIMGURL]][DependencyStatusURL] [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Now status][BuildAppveyorIMGURL]][BuildAppveyorURL] [![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], [Now][NowURL])
### [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"
[NowURL]: https://cloudcmd.now.sh/ "Now"
[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://david-dm.org/coderaiser/cloudcmd
[DependencyStatusIMGURL]: https://img.shields.io/david/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
[BuildAppveyorURL]: https://ci.appveyor.com/project/coderaiser/cloudcmd
[BuildAppveyorIMGURL]: https://ci.appveyor.com/api/projects/status/tse6sc8dxrqxqehi?svg=true
**Cloud Commander** a file manager for the web with console and editor.
[PackageQualityURL]: http://packagequality.com/#?package=cloudcmd "Package Quality"
[PackageQualityIMGURL]: http://packagequality.com/shield/cloudcmd.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
**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:
@ -52,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]
@ -76,33 +70,31 @@ 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
@ -110,22 +102,40 @@ const modules = {
filePicker,
};
app.use(cloudcmd({
socket, // used by Config, Edit (optional) and Console (required)
config, // config data (optional)
plugins, // 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 -t --rm -v ~:/root -v /:/mnt/fs -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`,
@ -151,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:
- 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

View file

@ -11,6 +11,7 @@
"folder",
"orthodox"
],
"stack": "heroku-18",
"env": {
"NPM_CONFIG_PRODUCTION": {
"description": "Keep false to install devDependencies and build frontend",
@ -32,6 +33,11 @@
"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",
@ -52,9 +58,9 @@
"value": "gritty",
"required": false
},
"CLOUDCMD_CONFIG_DIALOG": {
"description": "show config dialog",
"value": "false",
"CLOUDCMD_TERMINAL_COMMAND": {
"description": "set command to run in terminal (shell by default)",
"value": "",
"required": false
},
"CLOUDCMD_ONE_FILE_PANEL": {
@ -92,16 +98,6 @@
"value": "",
"required": false
},
"CLOUDCMD_ONE_PANEL_MODE": {
"description": "set one panel mode (deprecated use CLOUDCMD_ONE_FILE_PANEL)",
"value": "false",
"required": false
},
"CLOUDCMD_ONE_FILE_PANEL": {
"description": "set one panel mode",
"value": "false",
"required": false
},
"CLOUDCMD_VIM": {
"description": "enable vim hot keys",
"value": "false",
@ -112,6 +108,11 @@
"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",
@ -122,9 +123,39 @@
"value": "true",
"required": false
},
"CLOUDCMD_CACHE": {
"description": "enable cache",
"value": "true",
"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,26 +1,48 @@
#!/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 util = require('util');
const noop = () => {};
process.on('unhandledRejection', exit);
const Info = require('../package');
const DIR_SERVER = '../server/';
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)
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',
@ -31,77 +53,109 @@ 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',
'cache',
'repl',
'save',
'server',
'online',
'open',
'progress',
'config-dialog',
'config-auth',
'config-port',
'console',
'sync-console-path',
'contact',
'terminal',
'terminal-auto-restart',
'one-file-panel',
'one-panel-mode',
'confirm-copy',
'confirm-move',
'html-dialogs',
'show-config',
'show-dot-files',
'show-file-name',
'vim',
'keys-panel',
'color',
'export',
'import',
'import-listen',
'log',
'zip',
'dropbox',
],
default: {
server : true,
name : choose(env('name'), config('name')),
auth : choose(env('auth'), config('auth')),
cache : choose(env.bool('cache'), config('cache')),
port : config('port'),
online : config('online'),
open : config('open'),
editor : env('editor') || config('editor'),
packer : config('packer') || 'tar',
zip : config('zip'),
username : env('username') || config('username'),
root : choose(env('root'), config('root')),
prefix : config('prefix'),
progress : config('progress'),
console : choose(env.bool('console'), config('console')),
contact : choose(env.bool('contact'), config('contact')),
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')),
'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')),
'terminal-path': env('terminal_path') || config('terminalPath'),
'one-file-panel': choose(env.bool('one_file_panel'), config('onePanelMode')),
'one-panel-mode': '',
'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')),
'html-dialogs': config('htmlDialogs'),
'vim': choose(env.bool('vim'), config('vim')),
'columns': env('columns') || config('columns') || '',
'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();
@ -110,91 +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('cache', args.cache);
config('online', args.online);
config('open', args.open);
config('username', args.username);
config('progress', args.progress);
config('console', args.console);
config('syncConsolePath', args['sync-console-path']);
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('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('htmlDialogs', args['html-dialogs']);
config('confirmCopy', args['confirm-copy']);
config('confirmMove', args['confirm-move']);
config('onePanelMode', args['one-file-panel']);
config('oneFilePanel', args['one-file-panel']);
config('configDialog', args['config-dialog']);
config('keysPanel', args['keys-panel']);
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);
if (args['one-panel-mode']) {
util.deprecate(noop, `cloudcmd --one-panel-mode: deprecated, use --one-file-panel instead`, 'DP0001')();
config('oneFilePanel', true);
config('onePanelMode', true);
} else if (typeof args['one-panel-mode'] === 'boolean') {
util.deprecate(noop, `cloudcmd --no-one-panel-mode: deprecated, use --no-one-file-panel instead`, 'DP0001')();
config('oneFilePanel', false);
config('onePanelMode', false);
}
config('dropbox', args.dropbox);
config('dropboxToken', args.dropboxToken);
if (env('one_panel_mode')) {
util.deprecate(noop, `CLOUDCMD_ONE_PANEL_MODE deprecated, use CLOUDCMD_ONE_FILE_PANEL instead`, 'DP0001')();
config('oneFilePanel', env.bool('one_panel_mode'));
config('onePanelMode', env.bool('one_panel_mode'));
}
readConfig(args.config);
await readConfig(args.config);
const options = {
root: args.root || '/', /* --no-root */
editor: args.editor,
packer: args.packer,
prefix: args.prefix || '', /* --no-prefix */
columns: args.columns,
root: config('root'),
editor: config('editor'),
packer: config('packer'),
prefix: config('prefix'),
prefixSocket: config('prefixSocket'),
columns: config('columns'),
theme: config('theme'),
menu: config('menu'),
};
const password = env('password') || args.password;
const password = env.parse('password') || args.password;
if (password)
config('password', getPassword(password));
config('password', await getPassword(password));
validateRoot(options.root);
validateRoot(options.root, config);
if (args['show-config'])
showConfig();
if (args.showConfig)
await showConfig();
if (!args.save)
return start(options);
const {distributeImport} = await import('../server/distribute/import.js');
const importConfig = promisify(distributeImport);
config.save(() => {
start(options);
});
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'));
}
@ -202,11 +277,12 @@ 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) {
@ -218,40 +294,38 @@ function port(arg) {
exit('cloudcmd --port: should be a number');
}
function showConfig() {
const show = require('../server/show-config');
const data = show(config('*'));
async function showConfig() {
const {showConfig} = await import('../server/show-config.js');
const data = showConfig(config('*'));
console.log(data);
}
function readConfig(name) {
async function readConfig(name) {
if (!name)
return;
const fs = require('fs');
const tryCatch = require('try-catch');
const jju = require('jju');
const forEachKey = require('for-each-key');
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',
},
});
const result = tryCatch(readjsonSync, name);
const error = result[0];
const data = result[1];
if (error)
return exit(error.message);
forEachKey(config, data);
}
function help() {
const bin = require('../json/help');
const forEachKey = require('for-each-key');
const currify = require('currify/legacy');
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));
@ -262,36 +336,27 @@ function help() {
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,67 +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)
return callback(error);
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) => {
if (error)
return callback(error);
callback(null, 'done: ' + name);
});
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) {
@ -70,4 +75,3 @@ function getVersionNew(last, match) {
return last.substr(3);
}

View file

@ -1,36 +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",
"olark": "^1.0.0",
"jquery": "3.3.1",
"fancybox": "^2.1.6"
}
}

View file

@ -1,64 +1,59 @@
'use strict';
/* global Util, DOM */
const itype = require('itype/legacy');
const Emitify = require('emitify/legacy');
const inherits = require('inherits');
const rendy = require('rendy/legacy');
const exec = require('execon');
const Images = require('./dom/images');
const join = require('join-io/www/join');
const jonny = require('jonny/legacy');
const currify = require('currify/legacy');
const bind = (f, ...a) => () => f(...a);
const noop = () => {};
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$/, '');
const isDev = process.env.NODE_ENV === 'development';
inherits(CloudCmdProto, Emitify);
module.exports = new CloudCmdProto(Util, DOM);
export const createCloudCmd = ({DOM, Listeners}) => {
return new CloudCmdProto({
DOM,
Listeners,
});
};
function CloudCmdProto(Util, DOM) {
let Key;
let Debug;
let Listeners;
const log = (str) => {
if (!Debug)
return;
console.log(str);
};
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',
@ -69,143 +64,51 @@ 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) => {
const p = params;
const refresh = p.isRefresh;
const panel = p.panel;
const history = p.history;
const noCurrent = p.noCurrent;
const currentName = p.currentName;
this.changeDir = async (path, overrides = {}) => {
const {
isRefresh,
panel,
history = true,
noCurrent,
currentName,
} = overrides;
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';
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) {
if (!params)
return;
let path = params.path;
const name = params.name || path && kebabToCamelCase(path);
const func = params.func;
const funcName = params.funcName;
const doBefore = params.dobefore;
const isContain = /\.js/.test(path);
if (!isContain)
path += '.js';
if (CloudCmd[name])
return;
CloudCmd[name] = (...args) => {
const prefix = CloudCmd.PREFIX;
const pathFull = prefix + CloudCmd.DIRCLIENT_MODULES + path;
exec(doBefore);
const done = (error) => {
const Proto = CloudCmd[name];
if (error || !itype.function(Proto))
return;
CloudCmd[name] = applyConstructor(Proto, args);
};
return DOM.load.js(pathFull, func || done);
};
CloudCmd[name][funcName] = CloudCmd[name];
}
/*
* apply arguemnts to constructor
*
* @param constructor
* @param args
*/
function applyConstructor(constructor, args) {
const F = function () {
return constructor.apply(this, args);
};
F.prototype = constructor.prototype;
return new F();
}
/**
* Конструктор CloudClient, который
* выполняет весь функционал по
* инициализации
*/
this.init = (prefix, config) => {
const func = bind(exec.parallel, [
initModules,
baseInit,
loadPlugins,
loadStyle,
exec.with(CloudCmd.route, location.hash),
], noop);
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));
@ -214,46 +117,22 @@ function CloudCmdProto(Util, DOM) {
* should be called from config.js only
* after successful update on server
*/
if (key === 'password')
return;
config[key] = value;
};
DOM.Storage.setAllowed(CloudCmd.config('localStorage'));
if (config.onePanelMode)
if (config.oneFilePanel)
CloudCmd.MIN_ONE_PANEL_WIDTH = Infinity;
exec.if(document.body.scrollIntoViewIfNeeded, func, funcBefore);
};
function loadStyle(callback) {
const prefix = CloudCmd.PREFIX;
const plugins = prefix + '/dist/cloudcmd.common.css';
if (!document.body.scrollIntoViewIfNeeded)
await load.js(`${CloudCmd.DIR_MODULES}/polyfill.js`);
DOM.load.css(plugins, callback);
}
function loadPlugins(callback) {
const prefix = CloudCmd.PREFIX;
const plugins = prefix + '/plugins.js';
await initModules();
await baseInit();
DOM.load.js(plugins, callback);
}
this.join = (urls) => {
const prefix = CloudCmd.PREFIX;
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) => {
@ -263,91 +142,87 @@ 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;
}
DOM.setCurrentFile(current);
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();
const panels = getPanels();
@ -356,21 +231,18 @@ function CloudCmdProto(Util, DOM) {
Listeners.initKeysPanel();
if (!CloudCmd.config('dirStorage'))
return callback();
return;
Storage.get(dirPath, (error, data) => {
if (!data) {
data = getJSONfromFileTable();
Storage.set(dirPath, data);
}
callback();
});
const data = await Storage.get(dirPath);
if (!data)
await Storage.setJson(dirPath, getJsonFromFileTable());
}
function getPanels() {
const panels = ['left'];
if (CloudCmd.config('onePanelMode'))
if (CloudCmd.config('oneFilePanel'))
return panels;
return [
@ -379,40 +251,29 @@ function CloudCmdProto(Util, DOM) {
];
}
this.execFromModule = (moduleName, funcName, ...args) => {
const obj = CloudCmd[moduleName];
const isObj = itype.object(obj);
this.execFromModule = async (moduleName, funcName, ...args) => {
await CloudCmd[moduleName]();
exec.if(isObj, () => {
const obj = CloudCmd[moduleName];
const func = obj[funcName];
func(...args);
}, obj);
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);
});
};
/**
@ -422,176 +283,132 @@ 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 = jonny.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;
options.sort = sort;
options.order = order;
createFileTable(obj, panel, options, () => {
if (isRefresh && !noCurrent)
DOM.setCurrentByName(name);
exec(callback);
});
if (!CloudCmd.config('dirStorage'))
return;
Storage.set(path, obj);
});
};
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) {
async function createFileTable(data, panelParam, options) {
const {
history,
noCurrent,
showDotFiles,
} = options;
const names = ['file', 'path', 'link', 'pathLink'];
const names = [
'file',
'path',
'link',
'pathLink',
];
Files.get(names, (error, templFile, templPath, templLink, templPathLink) => {
const Dialog = DOM.Dialog;
const panel = panelParam || DOM.getPanel();
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,
},
});
Listeners.setOnPanel(panel);
if (!noCurrent) {
let current;
const {
dir,
name,
} = Info;
if (name === '..' && dir !== '/')
current = DOM.getCurrentByName(dir);
if (error)
return Dialog.alert(TITLE, error.responseText);
if (!current)
[current] = DOM.getFiles(panel);
const childNodes = panel.childNodes;
let 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
}
DOM.setCurrentFile(current, {
history,
});
Listeners.setOnPanel(panel);
if (!noCurrent) {
let current;
if (name === '..' && dir !== '/')
current = DOM.getCurrentByName(dir);
if (!current)
current = DOM.getFiles(panel)[0];
DOM.setCurrentFile(current, {
history: history
});
CloudCmd.emit('active-dir', Info.dirPath);
}
exec(callback);
});
CloudCmd.emit('active-dir', Info.dirPath);
}
}
/**
* Функция генерирует JSON из html-таблицы файлов и
* используеться при первом заходе в корень
*/
function getJSONfromFileTable() {
const path = DOM.getCurrentDirPath();
const infoFiles = Info.files || [];
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);
return {
name,
size,
mode,
owner,
date,
};
};
const files = infoFiles
.filter(notParent)
.map(parse);
const fileTable = {
path,
files,
};
return fileTable;
}
this.goToParentDir = () => {
const dir = Info.dir;
this.goToParentDir = async () => {
const {
dir,
dirPath,
parentDirPath,
panel,
} = Info;
if (dirPath === parentDirPath)
@ -599,15 +416,13 @@ function CloudCmdProto(Util, DOM) {
const path = parentDirPath;
CloudCmd.loadDir({path}, () => {
const {panel} = Info;
const current = DOM.getCurrentByName(dir);
const first = DOM.getFiles(panel)[0];
DOM.setCurrentFile(current || first, {
history
});
await CloudCmd.changeDir(path);
const current = DOM.getCurrentByName(dir);
const [first] = DOM.getFiles(panel);
DOM.setCurrentFile(current || first, {
history,
});
};
}

View file

@ -1,46 +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';
require('../css/main.css');
require('../css/nojs.css');
require('../css/columns/name-size-date.css');
require('../css/columns/name-size.css');
const isDev = process.env.NODE_ENV === 'development';
// prevent additional loading of emitify
window.Emitify = require('emitify/legacy');
export default init;
module.exports = 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/legacy');
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,
names,
});
}
function cut() {
const names = getNames();
const from = Info.dirPath;
clear();
if (!names.length)
return;
addCutClass();
Storage
.set(CUT, {
from,
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], (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);
}

View file

@ -1,25 +1,16 @@
'use strict';
/* global DOM */
/* global CloudCmd */
const btoa = require('../../common/btoa');
const {
encode,
decode,
} = require('../../common/entity');
const {
getTitle,
FS,
} = require('../../common/cloudfunc');
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 NBSP_REG = RegExp(String.fromCharCode(160), 'g');
const SPACE = ' ';
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
@ -27,18 +18,18 @@ const SPACE = ' ';
* @param name
* @param current
*/
module.exports.setCurrentName = (name, current) => {
export const setCurrentName = (name, current) => {
const Info = DOM.CurrentInfo;
const {link} = Info;
const {PREFIX} = CloudCmd;
const dir = PREFIX + FS + Info.dirPath;
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', 'js-file-' + btoa(encodeURI(name)));
current.setAttribute('data-name', createNameAttribute(name));
CloudCmd.emit('current-file', current);
return link;
@ -49,28 +40,48 @@ module.exports.setCurrentName = (name, current) => {
*
* @param currentFile
*/
module.exports.getCurrentName = (currentFile) => {
export const getCurrentName = (currentFile) => {
const current = currentFile || DOM.getCurrentFile();
if (!current)
return '';
const link = DOM.getCurrentLink(current);
if (!link)
return '';
return decode(link.title)
.replace(NBSP_REG, SPACE);
return parseNameAttribute(current.getAttribute('data-name'));
};
/**
* get current direcotory path
* Generate a `data-name` attribute for the given filename
* @param name The string name to encode
*/
module.exports.getCurrentDirPath = (panel = DOM.getPanel()) => {
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
.replace(NBSP_REG, SPACE);
return path.textContent;
};
/**
@ -78,36 +89,31 @@ module.exports.getCurrentDirPath = (panel = DOM.getPanel()) => {
*
* @param currentFile - current file by default
*/
module.exports.getCurrentPath = (currentFile) => {
export const getCurrentPath = (currentFile) => {
const current = currentFile || DOM.getCurrentFile();
const element = DOM.getByTag('a', current)[0];
const prefix = CloudCmd.PREFIX;
const [element] = DOM.getByTag('a', current);
const {prefix} = CloudCmd;
const path = element
.getAttribute('href')
.replace(RegExp('^' + prefix + FS), '')
.replace(NBSP_REG, SPACE);
return decode(path);
return parseHrefAttribute(prefix, element.getAttribute('href'));
};
/**
* get current direcotory name
* get current directory name
*/
module.exports.getCurrentDirName = () => {
const href = DOM.getCurrentDirPath()
export const getCurrentDirName = () => {
const href = DOM
.getCurrentDirPath()
.replace(/\/$/, '');
const substr = href.substr(href, href.lastIndexOf('/'));
const ret = href.replace(substr + '/', '') || '/';
const substr = href.substr(href, href.lastIndexOf('/'));
return ret;
return href.replace(`${substr}/`, '') || '/';
};
/**
* get current direcotory path
* get current directory path
*/
module.exports.getParentDirPath = (panel) => {
export const getParentDirPath = (panel) => {
const path = DOM.getCurrentDirPath(panel);
const dirName = DOM.getCurrentDirName() + '/';
const index = path.lastIndexOf(dirName);
@ -119,11 +125,11 @@ module.exports.getParentDirPath = (panel) => {
};
/**
* get not current direcotory path
* get not current directory path
*/
module.exports.getNotCurrentDirPath = () => {
export const getNotCurrentDirPath = () => {
const panel = DOM.getPanel({
active: false
active: false,
});
return DOM.getCurrentDirPath(panel);
@ -134,20 +140,20 @@ module.exports.getNotCurrentDirPath = () => {
*
* @currentFile
*/
module.exports.getCurrentFile = () => {
export const getCurrentFile = () => {
return DOM.getByClass(CURRENT_FILE);
};
/**
* get current file by name
*/
module.exports.getCurrentByName = (name, panel = DOM.CurrentInfo.panel) => {
const dataName = 'js-file-' + btoa(encodeURI(name));
export const getCurrentByName = (name, panel = DOM.CurrentInfo.panel) => {
const dataName = 'js-file-' + btoa(encodeURI(encodeNBSP(name)));
return DOM.getByDataName(dataName, panel);
};
/**
* private function thet unset currentfile
* private function that unset currentFile
*
* @currentFile
*/
@ -163,9 +169,8 @@ function unsetCurrentFile(currentFile) {
/**
* unified way to set current file
*/
module.exports.setCurrentFile = (currentFile, options) => {
export const setCurrentFile = (currentFile, options) => {
const o = options;
const CENTER = true;
const currentFileWas = DOM.getCurrentFile();
if (!currentFile)
@ -193,13 +198,15 @@ module.exports.setCurrentFile = (currentFile, options) => {
* but it should be false
* to prevent default behavior
*/
if (!o || o.history !== false) {
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);
@ -209,13 +216,18 @@ module.exports.setCurrentFile = (currentFile, options) => {
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}
*/
module.exports.getCurrentByPosition = ({x, y}) => {
export const getCurrentByPosition = ({x, y}) => {
const element = document.elementFromPoint(x, y);
const getEl = (el) => {
@ -247,7 +259,7 @@ module.exports.getCurrentByPosition = ({x, y}) => {
*
* @param currentFile
*/
module.exports.isCurrentFile = (currentFile) => {
export const isCurrentFile = (currentFile) => {
if (!currentFile)
return false;
@ -259,18 +271,41 @@ module.exports.isCurrentFile = (currentFile) => {
*
* @param name
*/
module.exports.setTitle = (name) => {
export const setTitle = (name) => {
if (!Title)
Title = DOM.getByTag('title')[0] ||
DOM.load({
name : 'title',
innerHTML : name,
parentElement : document.head
});
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

@ -1,128 +1,114 @@
'use strict';
import {test, stub} from 'supertape';
import {create} from 'auto-globals';
import wraptile from 'wraptile';
import * as currentFile from './current-file.js';
const test = require('tape');
const diff = require('sinon-called-with-diff');
const sinon = diff(require('sinon'));
const id = (a) => a;
const wraptile = require('wraptile');
const returns = wraptile(id);
const currentFile = require('./current-file');
const returns = wraptile(id);
const {_CURRENT_FILE} = currentFile;
test('current-file: setCurrentName: setAttribute', (t) => {
const {
DOM,
CloudCmd,
} = global;
const {DOM, CloudCmd} = globalThis;
global.DOM = getDOM();
global.CloudCmd = getCloudCmd();
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const setAttribute = sinon.stub();
const current = {
setAttribute
};
const current = create();
const {setAttribute} = current;
currentFile.setCurrentName('hello', current);
t.ok(setAttribute.calledWith('data-name', 'js-file-aGVsbG8='), 'should call setAttribute');
global.DOM = DOM;
global.CloudCmd = CloudCmd;
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,
} = global;
const {DOM, CloudCmd} = globalThis;
global.DOM = getDOM();
global.CloudCmd = getCloudCmd();
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd();
const setAttribute = sinon.stub();
const current = {
setAttribute
};
const current = create();
const {setAttribute} = current;
currentFile.setCurrentName('ай', current);
t.ok(setAttribute.calledWith('data-name', 'js-file-JUQwJUIwJUQwJUI5'), 'should call setAttribute');
globalThis.DOM = DOM;
globalThis.CloudCmd = CloudCmd;
global.DOM = DOM;
global.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,
} = global;
const {DOM, CloudCmd} = globalThis;
const emit = sinon.stub();
const setAttribute = sinon.stub();
const emit = stub();
global.DOM = getDOM();
global.CloudCmd = getCloudCmd({
globalThis.DOM = getDOM();
globalThis.CloudCmd = getCloudCmd({
emit,
});
const current = {
setAttribute,
};
const current = create();
currentFile.setCurrentName('hello', current);
t.ok(emit.calledWith('current-file', current), 'should call emit');
global.DOM = DOM;
global.CloudCmd = CloudCmd;
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,
} = global;
const {DOM, CloudCmd} = globalThis;
const setAttribute = sinon.stub();
const link = {};
global.DOM = getDOM({
link
globalThis.DOM = getDOM({
link,
});
global.CloudCmd = getCloudCmd();
const current = {
setAttribute,
};
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');
global.DOM = DOM;
global.CloudCmd = CloudCmd;
t.end();
});
test('current-file: getParentDirPath: result', (t) => {
const {
DOM,
} = global;
const {DOM} = globalThis;
const getCurrentDirPath = returns('/D/Films/+++favorite films/');
const getCurrentDirName = returns('+++favorite films');
global.DOM = getDOM({
globalThis.DOM = getDOM({
getCurrentDirPath,
getCurrentDirName,
});
@ -130,33 +116,193 @@ test('current-file: getParentDirPath: result', (t) => {
const result = currentFile.getParentDirPath();
const expected = '/D/Films/';
global.DOM = DOM;
globalThis.DOM = DOM;
t.equal(result, expected, 'should return parent dir path');
t.end();
});
function getCloudCmd({emit} = {}) {
return {
PREFIX: '',
emit: emit || sinon.stub(),
};
}
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();
});
function getDOM({
link = {},
getCurrentDirPath = sinon.stub(),
getCurrentDirName = sinon.stub(),
getByDataName = sinon.stub(),
} = {}) {
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,33 +1,18 @@
'use strict';
import {tryToCatch} from 'try-to-catch';
import * as smalltalk from 'smalltalk';
module.exports = Dialog;
const title = 'Cloud Commander';
const sm = require('smalltalk');
const smNative = require('smalltalk/native');
export const alert = (...a) => smalltalk.alert(title, ...a, {
cancel: false,
});
function Dialog(prefix, config) {
if (!(this instanceof Dialog))
return new Dialog(prefix, config);
const {htmlDialogs} = config;
const smalltalk = htmlDialogs ? sm : smNative;
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,33 +1,29 @@
/* global CloudCmd */
/* 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 philip = require('philip');
const Images = require('./images');
const {FS} = require('../../common/cloudfunc');
const DOM = require('.');
const {
getCurrentDirPath: getPathWhenRootEmpty,
} = DOM;
module.exports = (items) => {
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 dirPath = getPathWhenRootEmpty();
const path = dirPath
.replace(/\/$/, '');
const uploader = philip(entries, (type, name, data, i, n, callback) => {
const prefixURL = CloudCmd.PREFIX_URL;
const {prefixURL} = CloudCmd;
const full = prefixURL + FS + path + name;
let upload;
@ -49,7 +45,7 @@ module.exports = (items) => {
const max = next - current;
const value = current + percent(count, 100, max);
setProgress(value);
progress.setProgress(value);
});
});
@ -58,25 +54,11 @@ module.exports = (items) => {
uploader.abort();
});
uploader.on('progress', setProgress);
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,222 +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 args = [
eventName,
element,
listener,
callback,
];
const EVENT_NAME = 1;
const ELEMENT = 0;
const type = itype(eventName);
switch(type) {
default:
if (!/element$/.test(type))
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,
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, (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) => {
const 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, ...argsArr];
return Events.add(...args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmKey = function(...argsArr) {
const name = 'keydown';
const args = [name, ...argsArr];
return Events.remove(...args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addClick = function(...argsArr) {
const name = 'click';
const args = [name, ...argsArr];
return Events.add(...args);
};
/**
* safe remove event click listener
*
* @param listener
*/
this.rmClick = function(...argsArr) {
const name = 'click';
const args = [name, ...argsArr];
return Events.remove(...args);
};
this.addContextMenu = function(...argsArr) {
const name = 'contextmenu';
const args = [name, ...argsArr];
return Events.add(...args);
};
/**
* safe add event click listener
*
* @param listener
*/
this.addError = function(...argsArr) {
const name = 'error';
const args = [name, ...argsArr];
return Events.add(...args);
};
/**
* safe add load click listener
*
* @param listener
*/
this.addLoad = function(...argsArr) {
const name = 'load';
const args = [name, ...argsArr];
return Events.add(...args);
};
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((data) => {
const [, data] = await Promises.config();
if (data)
is = false;
Storage.setAllowed(data.localStorage);
callback(null, data);
timeout(() => {
if (!is)
Promises.config = null;
});
}, () => {
timeout(() => {
if (!is)
Promises.config = null;
});
}
return data;
};
function getTimeoutOnce(time) {
let is;
@ -165,4 +134,3 @@ function getTimeoutOnce(time) {
}, time);
};
}

View file

@ -1,21 +1,13 @@
/* global CloudCmd */
/* global DOM */
'use strict';
const Images = module.exports;
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
@ -34,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 {
@ -93,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);
@ -101,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;
@ -138,7 +125,7 @@ module.exports.setProgress = (value, title) => {
return Images;
};
module.exports.clearProgress = () => {
export const clearProgress = () => {
const DATA = 'data-progress';
const element = Images.get();
@ -151,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/legacy');
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/legacy');
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,30 +72,30 @@ 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);
@ -221,8 +103,8 @@ module.exports.put = (url, body) => {
if (!event.lengthComputable)
return;
const percent = (event.loaded / event.total) * 100;
const count = Math.round(percent);
const percent = event.loaded / event.total * 100;
const count = Math.round(percent);
emitter.emit('progress', count);
};
@ -234,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);
@ -245,117 +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,220 +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');
const {
encode,
} = require('../../common/entity');
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 = (url, data, callback) => {
const isFunc = itype.function(data);
if (!callback && isFunc) {
callback = data;
data = null;
}
const imgPosition = {
top: true
};
sendRequest({
method: 'PATCH',
url: FS + url,
data,
callback,
imgPosition,
});
};
this.write = (url, data, callback) => {
const isFunc = itype.function(data);
if (!callback && isFunc) {
callback = data;
data = null;
}
sendRequest({
method: 'PUT',
url: FS + url,
data,
callback,
imgPosition : { top: true }
});
};
this.read = (url, dataType, callback) => {
const isQuery = /\?/.test(url);
const isBeautify = /\?beautify$/.test(url);
const isMinify = /\?minify$/.test(url);
const notLog = !isQuery || isBeautify || isMinify;
const isFunc = itype.function(dataType);
if (!callback && isFunc) {
callback = dataType;
dataType = 'text';
}
sendRequest({
method: 'GET',
url: FS + url,
callback,
notLog,
dataType,
});
};
this.cp = (data, callback) => {
sendRequest({
method: 'PUT',
url: '/cp',
data,
callback,
imgPosition : { top: true }
});
};
this.pack = (data, callback) => {
sendRequest({
method : 'PUT',
url : '/pack',
data,
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) {
const p = params;
const 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;
const encoded = encode(text);
Images.show.error(encoded);
setTimeout(() => {
DOM.Dialog.alert(CloudCmd.TITLE, encoded);
}, 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/legacy');
const exec = require('execon');
const tryCatch = require('try-catch');
const setItem = localStorage.setItem.bind(localStorage);
/* приватный переключатель возможности работы с кэшем */
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] = tryCatch(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,80 +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;
}
};

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();
});

File diff suppressed because it is too large Load diff

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();
});

View file

@ -1,81 +1,58 @@
'use strict';
module.exports = {
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,
SEMICOLON : 52,
COLON : 54,
A : 65,
C : 67,
D : 68,
G : 71,
J : 74,
K : 75,
M : 77,
O : 79,
P : 80,
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
};
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

@ -1,23 +1,20 @@
/* global DOM */
import {escapeRegExp} from '#common/util';
'use strict';
const Info = DOM.CurrentInfo;
const {escapeRegExp} = require('../../common/util');
module.exports = function setCurrentByChar(char, charStore) {
export default function setCurrentByChar(char, charStore) {
const Info = DOM.CurrentInfo;
let firstByName;
let skipCount = 0;
let setted = false;
let set = false;
let i = 0;
const escapeChar = escapeRegExp(char);
const regExp = new RegExp('^' + escapeChar + '.*$', 'i');
const regExp = new RegExp(`^${escapeChar}.*$`, 'i');
const {files} = Info;
const chars = charStore();
const n = chars.length;
while(i < n && char === chars[i])
while (i < n && char === chars[i])
i++;
if (!i)
@ -31,19 +28,21 @@ module.exports = function setCurrentByChar(char, charStore) {
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;
set = true;
DOM.setCurrentFile(byName);
return true;
} else {
if (skipN === skipCount)
firstByName = byName;
--skipCount;
return true;
}
if (skipN === skipCount)
firstByName = byName;
--skipCount;
};
names
@ -51,9 +50,8 @@ module.exports = function setCurrentByChar(char, charStore) {
.filter(not(isRoot))
.some(setCurrent);
if (!setted) {
if (!set) {
DOM.setCurrentFile(firstByName);
charStore([char]);
}
};
}

View file

@ -1,41 +1,36 @@
'use strict';
/* global DOM */
const fullstore = require('fullstore/legacy');
const limier = require('limier/legacy');
const Info = DOM.CurrentInfo;
import {fullstore} from 'fullstore';
import limier from 'limier';
const searchStore = fullstore([]);
const searchIndex = fullstore(0);
module.exports.find = (value) => {
const names = Info.files.map(DOM.getCurrentName);
export const find = (value, names) => {
const result = limier(value, names);
searchStore(result);
searchIndex(0);
DOM.setCurrentByName(result[0]);
return result;
};
module.exports.findNext = () => {
export const findNext = () => {
const names = searchStore();
const index = next(searchIndex(), names.length);
searchIndex(index);
DOM.setCurrentByName(names[searchIndex()]);
return names[searchIndex()];
};
module.exports.findPrevious = () => {
export const findPrevious = () => {
const names = searchStore();
const index = previous(searchIndex(), names.length);
searchIndex(index);
DOM.setCurrentByName(names[index]);
return names[index];
};
module.exports._next = next;
module.exports._previous = previous;
export const _next = next;
export const _previous = previous;
function next(index, length) {
if (index === length - 1)
@ -50,4 +45,3 @@ function previous(index, length) {
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

@ -1,20 +1,19 @@
'use strict';
const noop = () => {};
module.exports.getDOM = () => {
const resolve = Promise.resolve.bind(Promise);
export const getDOM = () => {
const prompt = Promise.resolve.bind(Promise);
const CurrentInfo = {
element: {},
files: [],
};
const noop = () => {};
const Buffer = {
copy: noop,
paste: noop,
};
const Dialog = {
prompt: resolve
prompt,
};
return {
@ -28,16 +27,20 @@ module.exports.getDOM = () => {
getCurrentName: noop,
setCurrentByName: noop,
toggleSelectedFile: noop,
prompNewDirectory: noop,
promptNewFile: noop,
};
};
module.exports.getCloudCmd = () => {
export const getCloudCmd = () => {
const show = () => {};
return {
Operation: {
show
}
Operation: {
show,
},
config: noop,
_config: noop,
};
};

View file

@ -1,199 +1,167 @@
'use strict';
/* global CloudCmd, DOM */
import vim from './vim.js';
import * as finder from './find.js';
import {
setCurrent,
selectFileNotParent,
} from './set-current.js';
const KEY = require('../key');
const Info = DOM.CurrentInfo;
const Dialog = DOM.Dialog;
const fullstore = require('fullstore/legacy');
const store = fullstore('');
const visual = fullstore(false);
const {
find,
findNext,
findPrevious,
} = require('./find');
const TITLE = 'Cloud Commander';
const stopVisual = () => {
visual(false);
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 end = () => {
store('');
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);
},
};
};
const rmFirst = (a) => {
return a
.split('')
.slice(1)
.join('');
export const selectFile = selectFileNotParent;
const _createFindPrevious = (overrides = {}) => () => {
const {setCurrentByName} = overrides;
const name = finder.findPrevious();
setCurrentByName(name);
};
module.exports = (key, event) => {
const current = Info.element;
const keyCode = event.keyCode;
const prevStore = store();
const _createFindNext = (overrides = {}) => () => {
const {setCurrentByName} = overrides;
const name = finder.findNext();
const value = store(prevStore.concat(key));
if (keyCode === KEY.ENTER)
return end();
if (keyCode === KEY.ESC) {
DOM.unselectFiles();
visual(false);
return end();
}
if (key === 'j') {
move('next', {
prevStore,
current,
});
return end();
}
if (key === 'k') {
move('previous', {
prevStore,
current,
});
return end();
}
if (/gg/.test(value)) {
move('previous', {
current,
prevStore,
max: Infinity,
});
return end();
}
if (key === 'd' && (visual() || prevStore === 'd')) {
CloudCmd.Operation.show('delete');
stopVisual();
return end();
}
if (key === 'G') {
move('next', {
current,
prevStore,
max: Infinity,
});
return end();
}
if (key === 'y') {
if (!visual())
return end();
DOM.Buffer.copy();
stopVisual();
DOM.unselectFiles();
return end();
}
if (/^p$/i.test(key)) {
DOM.Buffer.paste();
return end();
}
if (/^v$/i.test(key)) {
DOM.toggleSelectedFile(current);
visual(!visual());
return end();
}
if (key === '/') {
event.preventDefault();
Dialog.prompt(TITLE, 'Find', '', {cancel: false})
.then(find);
return end();
}
if (key === 'n') {
findNext();
return end();
}
if (key === 'N') {
findPrevious();
return end();
}
setCurrentByName(name);
};
module.exports.selectFile = selectFile;
function move(sibling, {max, current, prevStore}) {
const isDelete = prevStore[0] === 'd';
const _createMakeFile = (overrides = {}) => () => {
const {
promptNewFile,
stopImmediatePropagation,
preventDefault,
} = overrides;
if (isDelete) {
visual(true);
prevStore = rmFirst(prevStore);
}
const n = max || getNumber(prevStore);
if (isNaN(n))
return;
setCurrent({
n,
current,
sibling,
visual: visual(),
});
if (isDelete)
CloudCmd.Operation.show('delete');
}
function getNumber(value) {
if (!value)
return 1;
if (value === 'g')
return 1;
return parseInt(value);
}
function selectFile(current) {
const name = DOM.getCurrentName(current);
if (name === '..')
return;
DOM.selectFile(current);
}
function setCurrent({n, current, visual, sibling}) {
const select = visual ? selectFile : DOM.unselectFile;
select(current);
const position = `${sibling}Sibling`;
for (let i = 0; i < n; i++) {
const next = current[position];
if (!next)
break;
current = next;
select(current);
}
DOM.setCurrentFile(current);
}
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,38 +1,30 @@
/* global DOM, CloudCmd */
'use strict';
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');
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';
const NBSP_REG = RegExp(String.fromCharCode(160), 'g');
const SPACE = ' ';
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,
@ -46,23 +38,16 @@ 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;
@ -70,6 +55,7 @@ let EXT;
function header() {
const fm = DOM.getFM();
const isDataset = (el) => el.dataset;
const isPanel = (el) => {
return /^js-(left|right)$/.test(el.dataset.name);
};
@ -81,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;
@ -103,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]);
});
};
@ -149,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);
@ -168,41 +157,45 @@ function getPathListener(panel) {
}
function isNoCurrent(panel) {
const Info = DOM.CurrentInfo;
const infoPanel = Info.panel;
if (!infoPanel)
return true;
const namePanel = panel.getAttribute('data-name');
const nameInfoPanel = infoPanel.getAttribute('data-name');
return namePanel !== nameInfoPanel;
}
function decodePath(path){
function decodePath(path) {
const url = CloudCmd.HOST;
const prefix = CloudCmd.PREFIX;
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(prefixReg, '') // browser doesn't replace % -> %25% do it for him
.replace('%%', '%25%')
.replace(NBSP_REG, SPACE) || '/';
}
function onPathElementClick(panel, event) {
async function onPathElementClick(panel, event) {
const Info = DOM.CurrentInfo;
event.preventDefault();
const element = event.target;
const attr = element.getAttribute('data-name');
const noCurrent = isNoCurrent(panel);
if (attr === 'js-clear-storage')
return Storage.clear();
if (attr === 'js-copy-path')
return copyPath(element);
if (attr === 'js-refresh')
return CloudCmd.refresh({
panel,
noCurrent
noCurrent,
});
if (attr !== 'js-path-link')
@ -211,13 +204,26 @@ function onPathElementClick(panel, event) {
const {href} = element;
const path = decodePath(href);
CloudCmd.loadDir({
path,
await CloudCmd.changeDir(path, {
isRefresh: false,
panel: noCurrent ? panel : Info.panel
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) {
const {target} = event;
const {tagName} = target;
@ -227,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);
@ -259,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);
@ -285,11 +287,7 @@ function onTouch(event) {
if (!isCurrent)
return;
CloudCmd.loadDir({
path: DOM.getCurrentPath(current)
});
event.preventDefault();
await CloudCmd.changeDir(DOM.getCurrentPath(current));
}
/*
@ -297,8 +295,10 @@ function onTouch(event) {
* 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);
@ -307,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) {
@ -334,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);
@ -377,7 +380,7 @@ function contextMenu() {
Events.addOnce('contextmenu', fm, (event) => {
CloudCmd.Menu.show({
x: event.clientX,
y: event.clientY
y: event.clientY,
});
});
@ -388,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();
@ -411,7 +410,10 @@ 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);
@ -423,13 +425,13 @@ function dragndrop() {
};
/**
* 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';
@ -439,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;
@ -462,15 +463,15 @@ function unload() {
}
function pop() {
Events.add('popstate', ({state}) => {
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,
});
});
@ -478,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;
@ -498,4 +500,3 @@ function resize() {
DOM.changePanel();
});
}

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