cloudcmd 19.18.1 → 19.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ChangeLog +12 -0
- package/HELP.md +10 -5
- package/README.md +3 -1
- package/dist/cloudcmd.common.js +38 -25
- package/dist/cloudcmd.common.js.map +1 -1
- package/dist/sw.js +1 -1
- package/dist-dev/cloudcmd.common.js +3 -3
- package/dist-dev/sw.js +1 -1
- package/package.json +1 -2
package/ChangeLog
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
2026.06.15, v19.19.1
|
|
2
|
+
|
|
3
|
+
feature:
|
|
4
|
+
- 78b206e0 client: key: Ctrl + L -> Ctrl + Shift + L: Log out (#466)
|
|
5
|
+
- b1492885 docker: io: NPM_CONFIG_PACKAGE_LOCK=false
|
|
6
|
+
- 76d7bf4d docker: typos, shellcheck: add
|
|
7
|
+
|
|
8
|
+
2026.05.26, v19.19.0
|
|
9
|
+
|
|
10
|
+
feature:
|
|
11
|
+
- 4ee38db6 client: view: flac: add support
|
|
12
|
+
|
|
1
13
|
2026.05.26, v19.18.1
|
|
2
14
|
|
|
3
15
|
feature:
|
package/HELP.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Cloud Commander v19.
|
|
1
|
+
# Cloud Commander v19.19.1
|
|
2
2
|
|
|
3
|
-
### [Main][MainURL] [Blog][BlogURL] [
|
|
3
|
+
### [Main][MainURL] [Blog][BlogURL] [Demo][DemoURL] [Deploy](#deploy)
|
|
4
4
|
|
|
5
5
|
[MainURL]: https://cloudcmd.io "Main"
|
|
6
6
|
[BlogURL]: https://blog.cloudcmd.io "Blog"
|
|
@@ -14,6 +14,9 @@
|
|
|
14
14
|
[TERMUX]: https://termux.com "Termux"
|
|
15
15
|
[INLY]: https://github.com/coderaiser/node-inly "Extract archive"
|
|
16
16
|
|
|
17
|
+
[DeployInstaPodsIMG]: https://img.shields.io/badge/deploy%20on-InstaPods-blue
|
|
18
|
+
[DeployInstaPodsURL]: https://app.instapods.com/dashboard/pods/create?app=cloudcmd&ref=cloudcmd
|
|
19
|
+
|
|
17
20
|
**Cloud Commander** is a file manager for the web. It includes a command-line console and a text editor. Cloud Commander helps you manage your server and work with files, directories and programs in a web browser from any computer, mobile or tablet.
|
|
18
21
|
|
|
19
22
|

|
|
@@ -187,12 +190,12 @@ Then, start the server again with `cloudcmd` and reload the page.
|
|
|
187
190
|
| `Ctrl + R` | refresh
|
|
188
191
|
| `Ctrl + D` | clear local storage
|
|
189
192
|
| `Ctrl + A` | select all files in a panel
|
|
190
|
-
| `Ctrl + L` | logout
|
|
191
193
|
| `Ctrl + M` | [rename selected files](https://github.com/coderaiser/cloudcmd/releases/tag/v12.1.0) in editor
|
|
192
194
|
| `Ctrl + U` | swap panels
|
|
193
195
|
| `Ctrl + F3` | sort by name
|
|
194
196
|
| `Ctrl + F5` | sort by date
|
|
195
197
|
| `Ctrl + F6` | sort by size
|
|
198
|
+
| `Ctrl + Shift + L` | logout
|
|
196
199
|
| `Ctrl + Command + .` | show/hide dot files
|
|
197
200
|
| `Up` | move cursor up
|
|
198
201
|
| `Down` | move cursor down
|
|
@@ -930,9 +933,9 @@ ln -s ./sites-available/io.cloudcmd.io ./sites-enabled
|
|
|
930
933
|
|
|
931
934
|
## Deploy
|
|
932
935
|
|
|
933
|
-
`Cloud Commander` can be easily deployed to [
|
|
936
|
+
`Cloud Commander` can be easily deployed to [InstaPods][DeployInstaPodsURL]. After deploy you receive email with credentials.
|
|
934
937
|
|
|
935
|
-
[](https://app.instapods.com/dashboard/pods/create?app=cloudcmd&ref=cloudcmd)
|
|
936
939
|
|
|
937
940
|
## Docker
|
|
938
941
|
|
|
@@ -1119,6 +1122,8 @@ There are a lot of ways to be involved in `Cloud Commander` development:
|
|
|
1119
1122
|
|
|
1120
1123
|
## Version history
|
|
1121
1124
|
|
|
1125
|
+
- *2026.06.15*, **[v19.19.1](//github.com/coderaiser/cloudcmd/releases/tag/v19.19.1)**
|
|
1126
|
+
- *2026.05.26*, **[v19.19.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.19.0)**
|
|
1122
1127
|
- *2026.05.26*, **[v19.18.1](//github.com/coderaiser/cloudcmd/releases/tag/v19.18.1)**
|
|
1123
1128
|
- *2026.05.26*, **[v19.18.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.18.0)**
|
|
1124
1129
|
- *2026.05.17*, **[v19.17.0](//github.com/coderaiser/cloudcmd/releases/tag/v19.17.0)**
|
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Cloud Commander v19.
|
|
1
|
+
# Cloud Commander v19.19.1 [![Build Status][BuildStatusIMGURL]][BuildStatusURL] [![Codacy][CodacyIMG]][CodacyURL] [![Gitter][GitterIMGURL]][GitterURL] [![Deploy on InstaPods][DeployInstaPodsIMG]][DeployInstaPodsURL]
|
|
2
2
|
|
|
3
3
|
### [Main][MainURL] [Blog][BlogURL] [Support][SupportURL] [Demo][DemoURL]
|
|
4
4
|
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
[GitterIMGURL]: https://img.shields.io/gitter/room/coderaiser/cloudcmd.js.svg
|
|
16
16
|
[DeployURL]: https://heroku.com/deploy?template=https://github.com/coderaiser/cloudcmd "Deploy"
|
|
17
17
|
[DeployIMG]: https://www.herokucdn.com/deploy/button.png
|
|
18
|
+
[DeployInstaPodsIMG]: https://img.shields.io/badge/deploy%20on-InstaPods-blue
|
|
19
|
+
[DeployInstaPodsURL]: https://app.instapods.com/dashboard/pods/create?app=cloudcmd&ref=cloudcmd
|
|
18
20
|
|
|
19
21
|
**Cloud Commander** a file manager for the web with console and editor.
|
|
20
22
|
|
package/dist/cloudcmd.common.js
CHANGED
|
@@ -5148,6 +5148,9 @@ var typedArrays = availableTypedArrays();
|
|
|
5148
5148
|
|
|
5149
5149
|
var $slice = callBound('String.prototype.slice');
|
|
5150
5150
|
|
|
5151
|
+
/** @import { BoundSet, BoundSlice, Cache, Getter } from './types' */
|
|
5152
|
+
/** @import { TypedArrayName } from '.' */
|
|
5153
|
+
|
|
5151
5154
|
/** @type {<T = unknown>(array: readonly T[], value: unknown) => number} */
|
|
5152
5155
|
var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(array, value) {
|
|
5153
5156
|
for (var i = 0; i < array.length; i += 1) {
|
|
@@ -5158,8 +5161,7 @@ var $indexOf = callBound('Array.prototype.indexOf', true) || function indexOf(ar
|
|
|
5158
5161
|
return -1;
|
|
5159
5162
|
};
|
|
5160
5163
|
|
|
5161
|
-
/** @
|
|
5162
|
-
/** @type {import('./types').Cache} */
|
|
5164
|
+
/** @type {Cache} */
|
|
5163
5165
|
var cache = { __proto__: null };
|
|
5164
5166
|
if (hasToStringTag && gOPD && getProto) {
|
|
5165
5167
|
forEach(typedArrays, function (typedArray) {
|
|
@@ -5176,7 +5178,8 @@ if (hasToStringTag && gOPD && getProto) {
|
|
|
5176
5178
|
if (descriptor && descriptor.get) {
|
|
5177
5179
|
var bound = callBind(descriptor.get);
|
|
5178
5180
|
cache[
|
|
5179
|
-
/** @type {`$${
|
|
5181
|
+
/** @type {`$${TypedArrayName}`} */
|
|
5182
|
+
('$' + typedArray)
|
|
5180
5183
|
] = bound;
|
|
5181
5184
|
}
|
|
5182
5185
|
}
|
|
@@ -5186,62 +5189,72 @@ if (hasToStringTag && gOPD && getProto) {
|
|
|
5186
5189
|
var arr = new g[typedArray]();
|
|
5187
5190
|
var fn = arr.slice || arr.set;
|
|
5188
5191
|
if (fn) {
|
|
5189
|
-
var bound = /** @type {
|
|
5192
|
+
var bound = /** @type {BoundSlice | BoundSet} */ (
|
|
5190
5193
|
// @ts-expect-error TODO FIXME
|
|
5191
5194
|
callBind(fn)
|
|
5192
5195
|
);
|
|
5193
5196
|
cache[
|
|
5194
|
-
/** @type {`$${
|
|
5197
|
+
/** @type {`$${TypedArrayName}`} */
|
|
5198
|
+
('$' + typedArray)
|
|
5195
5199
|
] = bound;
|
|
5196
5200
|
}
|
|
5197
5201
|
});
|
|
5198
5202
|
}
|
|
5199
5203
|
|
|
5200
|
-
/** @type {(value: object) => false |
|
|
5201
|
-
|
|
5202
|
-
/** @type {ReturnType<typeof
|
|
5204
|
+
/** @type {(value: object) => false | TypedArrayName} */
|
|
5205
|
+
function tryTypedArrays(value) {
|
|
5206
|
+
/** @type {ReturnType<typeof tryTypedArrays>} */ var found = false;
|
|
5203
5207
|
forEach(
|
|
5204
|
-
/** @type {Record
|
|
5205
|
-
/** @
|
|
5208
|
+
/** @type {Record<`$${TypedArrayName}`, Getter>} */ (cache),
|
|
5209
|
+
/** @param {Getter} getter @param {`$${TypedArrayName}`} typedArray */
|
|
5206
5210
|
function (getter, typedArray) {
|
|
5207
5211
|
if (!found) {
|
|
5208
5212
|
try {
|
|
5209
5213
|
// @ts-expect-error a throw is fine here
|
|
5210
5214
|
if ('$' + getter(value) === typedArray) {
|
|
5211
|
-
found = /** @type {
|
|
5215
|
+
found = /** @type {TypedArrayName} */ ($slice(typedArray, 1));
|
|
5212
5216
|
}
|
|
5213
5217
|
} catch (e) { /**/ }
|
|
5214
5218
|
}
|
|
5215
5219
|
}
|
|
5216
5220
|
);
|
|
5217
5221
|
return found;
|
|
5218
|
-
}
|
|
5222
|
+
}
|
|
5219
5223
|
|
|
5220
|
-
/** @type {(value: object) => false |
|
|
5221
|
-
|
|
5222
|
-
/** @type {ReturnType<typeof
|
|
5224
|
+
/** @type {(value: object) => false | TypedArrayName} */
|
|
5225
|
+
function trySlices(value) {
|
|
5226
|
+
/** @type {ReturnType<typeof trySlices>} */ var found = false;
|
|
5223
5227
|
forEach(
|
|
5224
|
-
/** @type {Record
|
|
5225
|
-
/** @
|
|
5228
|
+
/** @type {Record<`$${TypedArrayName}`, Getter>} */(cache),
|
|
5229
|
+
/** @param {Getter} getter @param {`$${TypedArrayName}`} name */ function (getter, name) {
|
|
5226
5230
|
if (!found) {
|
|
5227
5231
|
try {
|
|
5228
5232
|
// @ts-expect-error a throw is fine here
|
|
5229
5233
|
getter(value);
|
|
5230
|
-
found = /** @type {
|
|
5234
|
+
found = /** @type {TypedArrayName} */ ($slice(name, 1));
|
|
5231
5235
|
} catch (e) { /**/ }
|
|
5232
5236
|
}
|
|
5233
5237
|
}
|
|
5234
5238
|
);
|
|
5235
5239
|
return found;
|
|
5236
|
-
}
|
|
5240
|
+
}
|
|
5237
5241
|
|
|
5238
|
-
/** @type {
|
|
5242
|
+
/** @type {(tag: unknown) => tag is typeof typedArrays[number]} */
|
|
5243
|
+
function isTATag(tag) {
|
|
5244
|
+
return $indexOf(typedArrays, tag) > -1;
|
|
5245
|
+
}
|
|
5246
|
+
|
|
5247
|
+
/**
|
|
5248
|
+
* @type {import('.')}
|
|
5249
|
+
* @param {unknown} value
|
|
5250
|
+
*/
|
|
5239
5251
|
module.exports = function whichTypedArray(value) {
|
|
5240
|
-
if (!value || typeof value !== 'object') {
|
|
5252
|
+
if (!value || typeof value !== 'object') {
|
|
5253
|
+
return false;
|
|
5254
|
+
}
|
|
5241
5255
|
if (!hasToStringTag) {
|
|
5242
|
-
/** @type {string} */
|
|
5243
5256
|
var tag = $slice($toString(value), 8, -1);
|
|
5244
|
-
if (
|
|
5257
|
+
if (isTATag(tag)) {
|
|
5245
5258
|
return tag;
|
|
5246
5259
|
}
|
|
5247
5260
|
if (tag !== 'Object') {
|
|
@@ -6827,7 +6840,7 @@ async function _switchKey(event) {
|
|
|
6827
6840
|
}
|
|
6828
6841
|
break;
|
|
6829
6842
|
case key.L:
|
|
6830
|
-
if (ctrlMeta) {
|
|
6843
|
+
if (ctrlMeta && shift) {
|
|
6831
6844
|
CloudCmd.logOut();
|
|
6832
6845
|
event.preventDefault();
|
|
6833
6846
|
}
|
|
@@ -13817,7 +13830,7 @@ var path_browserify = __webpack_require__(7975);
|
|
|
13817
13830
|
;// ./client/modules/view/types.js
|
|
13818
13831
|
|
|
13819
13832
|
|
|
13820
|
-
const isAudio = name => /\.(mp3|ogg|m4a)$/i.test(name);
|
|
13833
|
+
const isAudio = name => /\.(mp3|ogg|m4a|flac)$/i.test(name);
|
|
13821
13834
|
const testRegExp = currify((name, reg) => reg.test(name));
|
|
13822
13835
|
const getRegExp = ext => RegExp(`\\.${ext}$`, 'i');
|
|
13823
13836
|
const isPDF = a => /\.pdf$/i.test(a);
|