Merge https://github.com/rr-/szurubooru into pool-nearby
This commit is contained in:
commit
4fe5973db7
18 changed files with 316 additions and 160 deletions
|
@ -1,7 +1,7 @@
|
||||||
repos:
|
repos:
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.0.1
|
rev: v4.4.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
|
@ -10,12 +10,12 @@ repos:
|
||||||
|
|
||||||
|
|
||||||
- repo: https://github.com/Lucas-C/pre-commit-hooks
|
- repo: https://github.com/Lucas-C/pre-commit-hooks
|
||||||
rev: v1.1.10
|
rev: v1.4.2
|
||||||
hooks:
|
hooks:
|
||||||
- id: remove-tabs
|
- id: remove-tabs
|
||||||
|
|
||||||
- repo: https://github.com/psf/black
|
- repo: https://github.com/psf/black
|
||||||
rev: '22.3.0'
|
rev: '23.1.0'
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: black
|
||||||
files: 'server/'
|
files: 'server/'
|
||||||
|
@ -23,7 +23,7 @@ repos:
|
||||||
language_version: python3.9
|
language_version: python3.9
|
||||||
|
|
||||||
- repo: https://github.com/PyCQA/isort
|
- repo: https://github.com/PyCQA/isort
|
||||||
rev: '5.10.1'
|
rev: '5.12.0'
|
||||||
hooks:
|
hooks:
|
||||||
- id: isort
|
- id: isort
|
||||||
files: 'server/'
|
files: 'server/'
|
||||||
|
@ -33,7 +33,7 @@ repos:
|
||||||
- toml
|
- toml
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||||
rev: v2.5.0
|
rev: v2.7.1
|
||||||
hooks:
|
hooks:
|
||||||
- id: prettier
|
- id: prettier
|
||||||
files: client/js/
|
files: client/js/
|
||||||
|
@ -41,7 +41,7 @@ repos:
|
||||||
args: ['--config', 'client/.prettierrc.yml']
|
args: ['--config', 'client/.prettierrc.yml']
|
||||||
|
|
||||||
- repo: https://github.com/pre-commit/mirrors-eslint
|
- repo: https://github.com/pre-commit/mirrors-eslint
|
||||||
rev: v8.3.0
|
rev: v8.33.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: eslint
|
- id: eslint
|
||||||
files: client/js/
|
files: client/js/
|
||||||
|
@ -49,8 +49,8 @@ repos:
|
||||||
additional_dependencies:
|
additional_dependencies:
|
||||||
- eslint-config-prettier
|
- eslint-config-prettier
|
||||||
|
|
||||||
- repo: https://gitlab.com/PyCQA/flake8
|
- repo: https://github.com/PyCQA/flake8
|
||||||
rev: '4.0.1'
|
rev: '6.0.0'
|
||||||
hooks:
|
hooks:
|
||||||
- id: flake8
|
- id: flake8
|
||||||
files: server/szurubooru/
|
files: server/szurubooru/
|
||||||
|
@ -58,33 +58,5 @@ repos:
|
||||||
- flake8-print
|
- flake8-print
|
||||||
args: ['--config=server/.flake8']
|
args: ['--config=server/.flake8']
|
||||||
|
|
||||||
- repo: local
|
|
||||||
hooks:
|
|
||||||
- id: docker-build-client
|
|
||||||
name: Docker - build client
|
|
||||||
entry: bash -c 'docker build client/'
|
|
||||||
language: system
|
|
||||||
types: [file]
|
|
||||||
files: client/
|
|
||||||
pass_filenames: false
|
|
||||||
|
|
||||||
- id: docker-build-server
|
|
||||||
name: Docker - build server
|
|
||||||
entry: bash -c 'docker build server/'
|
|
||||||
language: system
|
|
||||||
types: [file]
|
|
||||||
files: server/
|
|
||||||
pass_filenames: false
|
|
||||||
|
|
||||||
- id: pytest
|
|
||||||
name: pytest
|
|
||||||
entry: bash -c 'docker run --rm -t $(docker build --target testing -q server/) szurubooru/'
|
|
||||||
language: system
|
|
||||||
types: [python]
|
|
||||||
files: server/szurubooru/
|
|
||||||
exclude: server/szurubooru/migrations/
|
|
||||||
pass_filenames: false
|
|
||||||
stages: [manual]
|
|
||||||
|
|
||||||
fail_fast: true
|
fail_fast: true
|
||||||
exclude: LICENSE.md
|
exclude: LICENSE.md
|
||||||
|
|
|
@ -300,10 +300,10 @@ a .access-key
|
||||||
background-size: 20px 20px
|
background-size: 20px 20px
|
||||||
img
|
img
|
||||||
opacity: 0
|
opacity: 0
|
||||||
width: 100%
|
width: auto
|
||||||
height: 100%
|
height: 100%
|
||||||
video
|
video
|
||||||
width: 100%
|
width: auto
|
||||||
height: 100%
|
height: 100%
|
||||||
|
|
||||||
.flexbox-dummy
|
.flexbox-dummy
|
||||||
|
|
|
@ -114,6 +114,29 @@
|
||||||
&[data-disabled]
|
&[data-disabled]
|
||||||
background: rgba(200, 200, 200, 0.7)
|
background: rgba(200, 200, 200, 0.7)
|
||||||
|
|
||||||
|
.delete-flipper
|
||||||
|
display: inline-block
|
||||||
|
padding: 0.5em
|
||||||
|
box-sizing: border-box
|
||||||
|
border: 0
|
||||||
|
&:after
|
||||||
|
display: inline-block
|
||||||
|
width: 1em
|
||||||
|
height: 1em
|
||||||
|
text-align: center
|
||||||
|
line-height: 1em
|
||||||
|
font-size: 2.2em
|
||||||
|
&.delete
|
||||||
|
background: rgba(255, 0, 0, 0.7)
|
||||||
|
&:after
|
||||||
|
color: white
|
||||||
|
font-family: FontAwesome;
|
||||||
|
content: "\f1f8"; // fa-trash
|
||||||
|
&:not(.delete)
|
||||||
|
background: rgba(200, 200, 200, 0.7)
|
||||||
|
&:after
|
||||||
|
color: white
|
||||||
|
content: '-'
|
||||||
|
|
||||||
.thumbnail
|
.thumbnail
|
||||||
width: 100%
|
width: 100%
|
||||||
|
@ -215,7 +238,19 @@
|
||||||
.append
|
.append
|
||||||
@media (max-width: 1000px)
|
@media (max-width: 1000px)
|
||||||
margin-left: 0
|
margin-left: 0
|
||||||
|
.bulk-edit-delete
|
||||||
|
&.opened
|
||||||
|
.start
|
||||||
|
@media (max-width: 1000px)
|
||||||
|
margin-left: 0
|
||||||
|
&:not(.opened)
|
||||||
|
.start
|
||||||
|
display: none
|
||||||
|
.append.open
|
||||||
|
@media (max-width: 1000px)
|
||||||
|
margin-left: 0
|
||||||
|
.start
|
||||||
|
margin-left: 1em
|
||||||
.safety
|
.safety
|
||||||
margin-right: 0.25em
|
margin-right: 0.25em
|
||||||
&.safety-safe
|
&.safety-safe
|
||||||
|
|
|
@ -42,6 +42,7 @@
|
||||||
'image/heic': 'HEIC',
|
'image/heic': 'HEIC',
|
||||||
'video/webm': 'WEBM',
|
'video/webm': 'WEBM',
|
||||||
'video/mp4': 'MPEG-4',
|
'video/mp4': 'MPEG-4',
|
||||||
|
'video/quicktime': 'MOV',
|
||||||
'application/x-shockwave-flash': 'SWF',
|
'application/x-shockwave-flash': 'SWF',
|
||||||
}[ctx.post.mimeType] +
|
}[ctx.post.mimeType] +
|
||||||
' (' +
|
' (' +
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
'image/heic': 'HEIC',
|
'image/heic': 'HEIC',
|
||||||
'video/webm': 'WEBM',
|
'video/webm': 'WEBM',
|
||||||
'video/mp4': 'MPEG-4',
|
'video/mp4': 'MPEG-4',
|
||||||
|
'video/quicktime': 'MOV',
|
||||||
'application/x-shockwave-flash': 'SWF',
|
'application/x-shockwave-flash': 'SWF',
|
||||||
}[ctx.post.mimeType] %>
|
}[ctx.post.mimeType] %>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
@ -28,4 +28,11 @@
|
||||||
%><a href class='mousetrap button append close'>Stop editing safety</a><%
|
%><a href class='mousetrap button append close'>Stop editing safety</a><%
|
||||||
%></form><%
|
%></form><%
|
||||||
%><% } %><%
|
%><% } %><%
|
||||||
|
%><% if (ctx.canBulkDelete) { %><%
|
||||||
|
%><form class='horizontal bulk-edit bulk-edit-delete'><%
|
||||||
|
%><a href class='mousetrap button append open'>Mass delete</a><%
|
||||||
|
%><input class='mousetrap start' type='submit' value='Delete selected posts'/><%
|
||||||
|
%><a href class='mousetrap button append close'>Stop deleting</a><%
|
||||||
|
%></form><%
|
||||||
|
%><% } %><%
|
||||||
%></div>
|
%></div>
|
||||||
|
|
|
@ -50,6 +50,10 @@
|
||||||
<% } %>
|
<% } %>
|
||||||
</span>
|
</span>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
<% if (ctx.canBulkDelete && ctx.parameters && ctx.parameters.delete) { %>
|
||||||
|
<a href class='delete-flipper'>
|
||||||
|
</a>
|
||||||
|
<% } %>
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
|
@ -44,6 +44,7 @@ class PostListController {
|
||||||
enableSafety: api.safetyEnabled(),
|
enableSafety: api.safetyEnabled(),
|
||||||
canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"),
|
canBulkEditTags: api.hasPrivilege("posts:bulk-edit:tags"),
|
||||||
canBulkEditSafety: api.hasPrivilege("posts:bulk-edit:safety"),
|
canBulkEditSafety: api.hasPrivilege("posts:bulk-edit:safety"),
|
||||||
|
canBulkDelete: api.hasPrivilege("posts:bulk-edit:delete"),
|
||||||
bulkEdit: {
|
bulkEdit: {
|
||||||
tags: this._bulkEditTags,
|
tags: this._bulkEditTags,
|
||||||
},
|
},
|
||||||
|
@ -52,6 +53,16 @@ class PostListController {
|
||||||
this._evtNavigate(e)
|
this._evtNavigate(e)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if (this._headerView._bulkDeleteEditor) {
|
||||||
|
this._headerView._bulkDeleteEditor.addEventListener(
|
||||||
|
"deleteSelectedPosts",
|
||||||
|
(e) => {
|
||||||
|
this._evtDeleteSelectedPosts(e);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._postsMarkedForDeletion = [];
|
||||||
this._syncPageController();
|
this._syncPageController();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -91,6 +102,38 @@ class PostListController {
|
||||||
e.detail.post.save().catch((error) => window.alert(error.message));
|
e.detail.post.save().catch((error) => window.alert(error.message));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_evtMarkForDeletion(e) {
|
||||||
|
const postId = e.detail;
|
||||||
|
|
||||||
|
// Add or remove post from delete list
|
||||||
|
if (e.detail.delete) {
|
||||||
|
this._postsMarkedForDeletion.push(e.detail.post);
|
||||||
|
} else {
|
||||||
|
this._postsMarkedForDeletion = this._postsMarkedForDeletion.filter(
|
||||||
|
(x) => x.id != e.detail.post.id
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_evtDeleteSelectedPosts(e) {
|
||||||
|
if (this._postsMarkedForDeletion.length == 0) return;
|
||||||
|
|
||||||
|
if (
|
||||||
|
confirm(
|
||||||
|
`Are you sure you want to delete ${this._postsMarkedForDeletion.length} posts?`
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
Promise.all(
|
||||||
|
this._postsMarkedForDeletion.map((post) => post.delete())
|
||||||
|
)
|
||||||
|
.catch((error) => window.alert(error.message))
|
||||||
|
.then(() => {
|
||||||
|
this._postsMarkedForDeletion = [];
|
||||||
|
this._headerView._navigate();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_syncPageController() {
|
_syncPageController() {
|
||||||
this._pageController.run({
|
this._pageController.run({
|
||||||
parameters: this._ctx.parameters,
|
parameters: this._ctx.parameters,
|
||||||
|
@ -117,8 +160,10 @@ class PostListController {
|
||||||
canBulkEditSafety: api.hasPrivilege(
|
canBulkEditSafety: api.hasPrivilege(
|
||||||
"posts:bulk-edit:safety"
|
"posts:bulk-edit:safety"
|
||||||
),
|
),
|
||||||
|
canBulkDelete: api.hasPrivilege("posts:bulk-edit:delete"),
|
||||||
bulkEdit: {
|
bulkEdit: {
|
||||||
tags: this._bulkEditTags,
|
tags: this._bulkEditTags,
|
||||||
|
markedForDeletion: this._postsMarkedForDeletion,
|
||||||
},
|
},
|
||||||
postFlow: settings.get().postFlow,
|
postFlow: settings.get().postFlow,
|
||||||
});
|
});
|
||||||
|
@ -128,6 +173,9 @@ class PostListController {
|
||||||
view.addEventListener("changeSafety", (e) =>
|
view.addEventListener("changeSafety", (e) =>
|
||||||
this._evtChangeSafety(e)
|
this._evtChangeSafety(e)
|
||||||
);
|
);
|
||||||
|
view.addEventListener("markForDeletion", (e) =>
|
||||||
|
this._evtMarkForDeletion(e)
|
||||||
|
);
|
||||||
return view;
|
return view;
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -22,6 +22,7 @@ function _mimeTypeToPostType(mimeType) {
|
||||||
"image/heic": "image",
|
"image/heic": "image",
|
||||||
"video/mp4": "video",
|
"video/mp4": "video",
|
||||||
"video/webm": "video",
|
"video/webm": "video",
|
||||||
|
"video/quicktime": "video",
|
||||||
}[mimeType] || "unknown"
|
}[mimeType] || "unknown"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -120,6 +121,7 @@ class Url extends Uploadable {
|
||||||
heif: "image/heif",
|
heif: "image/heif",
|
||||||
heic: "image/heic",
|
heic: "image/heic",
|
||||||
mp4: "video/mp4",
|
mp4: "video/mp4",
|
||||||
|
mov: "video/quicktime",
|
||||||
webm: "video/webm",
|
webm: "video/webm",
|
||||||
};
|
};
|
||||||
for (let extension of Object.keys(mime)) {
|
for (let extension of Object.keys(mime)) {
|
||||||
|
|
|
@ -141,6 +141,34 @@ class BulkTagEditor extends BulkEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class BulkDeleteEditor extends BulkEditor {
|
||||||
|
constructor(hostNode) {
|
||||||
|
super(hostNode);
|
||||||
|
this._hostNode.addEventListener("submit", (e) =>
|
||||||
|
this._evtFormSubmit(e)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_evtFormSubmit(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.dispatchEvent(
|
||||||
|
new CustomEvent("deleteSelectedPosts", { detail: {} })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
_evtOpenLinkClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.toggleOpen(true);
|
||||||
|
this.dispatchEvent(new CustomEvent("open", { detail: {} }));
|
||||||
|
}
|
||||||
|
|
||||||
|
_evtCloseLinkClick(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
this.toggleOpen(false);
|
||||||
|
this.dispatchEvent(new CustomEvent("close", { detail: {} }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PostsHeaderView extends events.EventTarget {
|
class PostsHeaderView extends events.EventTarget {
|
||||||
constructor(ctx) {
|
constructor(ctx) {
|
||||||
super();
|
super();
|
||||||
|
@ -186,6 +214,13 @@ class PostsHeaderView extends events.EventTarget {
|
||||||
this._bulkEditors.push(this._bulkSafetyEditor);
|
this._bulkEditors.push(this._bulkSafetyEditor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this._bulkEditDeleteNode) {
|
||||||
|
this._bulkDeleteEditor = new BulkDeleteEditor(
|
||||||
|
this._bulkEditDeleteNode
|
||||||
|
);
|
||||||
|
this._bulkEditors.push(this._bulkDeleteEditor);
|
||||||
|
}
|
||||||
|
|
||||||
for (let editor of this._bulkEditors) {
|
for (let editor of this._bulkEditors) {
|
||||||
editor.addEventListener("submit", (e) => {
|
editor.addEventListener("submit", (e) => {
|
||||||
this._navigate();
|
this._navigate();
|
||||||
|
@ -204,6 +239,8 @@ class PostsHeaderView extends events.EventTarget {
|
||||||
this._openBulkEditor(this._bulkTagEditor);
|
this._openBulkEditor(this._bulkTagEditor);
|
||||||
} else if (ctx.parameters.safety && this._bulkSafetyEditor) {
|
} else if (ctx.parameters.safety && this._bulkSafetyEditor) {
|
||||||
this._openBulkEditor(this._bulkSafetyEditor);
|
this._openBulkEditor(this._bulkSafetyEditor);
|
||||||
|
} else if (ctx.parameters.delete && this._bulkDeleteEditor) {
|
||||||
|
this._openBulkEditor(this._bulkDeleteEditor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,6 +264,10 @@ class PostsHeaderView extends events.EventTarget {
|
||||||
return this._hostNode.querySelector(".bulk-edit-safety");
|
return this._hostNode.querySelector(".bulk-edit-safety");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get _bulkEditDeleteNode() {
|
||||||
|
return this._hostNode.querySelector(".bulk-edit-delete");
|
||||||
|
}
|
||||||
|
|
||||||
_openBulkEditor(editor) {
|
_openBulkEditor(editor) {
|
||||||
editor.toggleOpen(true);
|
editor.toggleOpen(true);
|
||||||
this._hideBulkEditorsExcept(editor);
|
this._hideBulkEditorsExcept(editor);
|
||||||
|
@ -293,6 +334,10 @@ class PostsHeaderView extends events.EventTarget {
|
||||||
this._bulkSafetyEditor && this._bulkSafetyEditor.opened
|
this._bulkSafetyEditor && this._bulkSafetyEditor.opened
|
||||||
? "1"
|
? "1"
|
||||||
: null;
|
: null;
|
||||||
|
parameters.delete =
|
||||||
|
this._bulkDeleteEditor && this._bulkDeleteEditor.opened
|
||||||
|
? "1"
|
||||||
|
: null;
|
||||||
this.dispatchEvent(
|
this.dispatchEvent(
|
||||||
new CustomEvent("navigate", { detail: { parameters: parameters } })
|
new CustomEvent("navigate", { detail: { parameters: parameters } })
|
||||||
);
|
);
|
||||||
|
|
|
@ -39,6 +39,13 @@ class PostsPageView extends events.EventTarget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deleteFlipperNode = this._getDeleteFlipperNode(listItemNode);
|
||||||
|
if (deleteFlipperNode) {
|
||||||
|
deleteFlipperNode.addEventListener("click", (e) =>
|
||||||
|
this._evtBulkToggleDeleteClick(e, post)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this._syncBulkEditorsHighlights();
|
this._syncBulkEditorsHighlights();
|
||||||
|
@ -56,6 +63,10 @@ class PostsPageView extends events.EventTarget {
|
||||||
return listItemNode.querySelector(".safety-flipper");
|
return listItemNode.querySelector(".safety-flipper");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getDeleteFlipperNode(listItemNode) {
|
||||||
|
return listItemNode.querySelector(".delete-flipper");
|
||||||
|
}
|
||||||
|
|
||||||
_evtPostChange(e) {
|
_evtPostChange(e) {
|
||||||
const listItemNode = this._postIdToListItemNode[e.detail.post.id];
|
const listItemNode = this._postIdToListItemNode[e.detail.post.id];
|
||||||
for (let node of listItemNode.querySelectorAll("[data-disabled]")) {
|
for (let node of listItemNode.querySelectorAll("[data-disabled]")) {
|
||||||
|
@ -99,6 +110,20 @@ class PostsPageView extends events.EventTarget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_evtBulkToggleDeleteClick(e, post) {
|
||||||
|
e.preventDefault();
|
||||||
|
const linkNode = e.target;
|
||||||
|
linkNode.classList.toggle("delete");
|
||||||
|
this.dispatchEvent(
|
||||||
|
new CustomEvent("markForDeletion", {
|
||||||
|
detail: {
|
||||||
|
post,
|
||||||
|
delete: linkNode.classList.contains("delete"),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
_syncBulkEditorsHighlights() {
|
_syncBulkEditorsHighlights() {
|
||||||
for (let listItemNode of this._listItemNodes) {
|
for (let listItemNode of this._listItemNodes) {
|
||||||
const postId = listItemNode.getAttribute("data-post-id");
|
const postId = listItemNode.getAttribute("data-post-id");
|
||||||
|
@ -123,6 +148,16 @@ class PostsPageView extends events.EventTarget {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const deleteFlipperNode = this._getDeleteFlipperNode(listItemNode);
|
||||||
|
if (deleteFlipperNode) {
|
||||||
|
deleteFlipperNode.classList.toggle(
|
||||||
|
"delete",
|
||||||
|
this._ctx.bulkEdit.markedForDeletion.some(
|
||||||
|
(x) => x.id == postId
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
206
client/package-lock.json
generated
206
client/package-lock.json
generated
|
@ -28,7 +28,7 @@
|
||||||
"jimp": "^0.13.0",
|
"jimp": "^0.13.0",
|
||||||
"pretty-error": "^3.0.3",
|
"pretty-error": "^3.0.3",
|
||||||
"stylus": "^0.54.8",
|
"stylus": "^0.54.8",
|
||||||
"terser": "^3.7.7",
|
"terser": "^4.8.1",
|
||||||
"underscore": "^1.12.1",
|
"underscore": "^1.12.1",
|
||||||
"watchify": "^4.0.0",
|
"watchify": "^4.0.0",
|
||||||
"ws": "^7.4.6"
|
"ws": "^7.4.6"
|
||||||
|
@ -476,24 +476,6 @@
|
||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/array-filter": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
|
|
||||||
"integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/array-map": {
|
|
||||||
"version": "0.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
|
|
||||||
"integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/array-reduce": {
|
|
||||||
"version": "0.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
|
|
||||||
"integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/asn1.js": {
|
"node_modules/asn1.js": {
|
||||||
"version": "4.10.1",
|
"version": "4.10.1",
|
||||||
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
|
||||||
|
@ -1515,7 +1497,6 @@
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
||||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1",
|
"function-bind": "^1.1.1",
|
||||||
"get-intrinsic": "^1.0.2"
|
"get-intrinsic": "^1.0.2"
|
||||||
|
@ -1682,9 +1663,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/cookiejar": {
|
"node_modules/cookiejar": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
|
||||||
"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
|
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
|
||||||
},
|
},
|
||||||
"node_modules/core-js": {
|
"node_modules/core-js": {
|
||||||
"version": "2.5.7",
|
"version": "2.5.7",
|
||||||
|
@ -1850,9 +1831,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/decode-uri-component": {
|
"node_modules/decode-uri-component": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
|
||||||
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
|
"integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10"
|
"node": ">=0.10"
|
||||||
|
@ -2254,8 +2235,7 @@
|
||||||
"node_modules/function-bind": {
|
"node_modules/function-bind": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"node_modules/get-assigned-identifiers": {
|
"node_modules/get-assigned-identifiers": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
|
@ -2267,7 +2247,6 @@
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
|
||||||
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
|
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1",
|
"function-bind": "^1.1.1",
|
||||||
"has": "^1.0.3",
|
"has": "^1.0.3",
|
||||||
|
@ -2351,7 +2330,6 @@
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"function-bind": "^1.1.1"
|
"function-bind": "^1.1.1"
|
||||||
},
|
},
|
||||||
|
@ -2384,7 +2362,6 @@
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
|
||||||
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
|
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
},
|
},
|
||||||
|
@ -2859,9 +2836,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/jpeg-js": {
|
"node_modules/jpeg-js": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
|
||||||
"integrity": "sha512-960VHmtN1vTpasX/1LupLohdP5odwAT7oK/VSm6mW0M58LbrBnowLAPWAZhWGhDAGjzbMnPXZxzB/QYgBwkN0w==",
|
"integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/js-cookie": {
|
"node_modules/js-cookie": {
|
||||||
|
@ -3224,7 +3201,6 @@
|
||||||
"version": "1.10.3",
|
"version": "1.10.3",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
|
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
|
||||||
"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
|
"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
|
||||||
"dev": true,
|
|
||||||
"funding": {
|
"funding": {
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
|
@ -3507,11 +3483,17 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/qs": {
|
"node_modules/qs": {
|
||||||
"version": "6.5.2",
|
"version": "6.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
||||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
|
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
||||||
|
"dependencies": {
|
||||||
|
"side-channel": "^1.0.4"
|
||||||
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.6"
|
"node": ">=0.6"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/querystring": {
|
"node_modules/querystring": {
|
||||||
|
@ -3770,15 +3752,22 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/shell-quote": {
|
"node_modules/shell-quote": {
|
||||||
"version": "1.6.1",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
|
||||||
"integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
|
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
|
},
|
||||||
|
"node_modules/side-channel": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"array-filter": "~0.0.0",
|
"call-bind": "^1.0.0",
|
||||||
"array-map": "~0.0.0",
|
"get-intrinsic": "^1.0.2",
|
||||||
"array-reduce": "~0.0.0",
|
"object-inspect": "^1.9.0"
|
||||||
"jsonify": "~0.0.0"
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/simple-concat": {
|
"node_modules/simple-concat": {
|
||||||
|
@ -4022,26 +4011,26 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser": {
|
"node_modules/terser": {
|
||||||
"version": "3.7.7",
|
"version": "4.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-3.7.7.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
|
||||||
"integrity": "sha512-RRLIxE7S52vSOI9cEbOaisgBd2y6MNgfg2ihUkidsFnuP1eDmZ79+lBWbyvgfFTAc/r8nSjL0k3cpZDDIYiYiA==",
|
"integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": "~2.14.1",
|
"commander": "^2.20.0",
|
||||||
"source-map": "~0.6.1",
|
"source-map": "~0.6.1",
|
||||||
"source-map-support": "~0.5.6"
|
"source-map-support": "~0.5.12"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
"terser": "bin/uglifyjs"
|
"terser": "bin/terser"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.8.0"
|
"node": ">=6.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser/node_modules/commander": {
|
"node_modules/terser/node_modules/commander": {
|
||||||
"version": "2.14.1",
|
"version": "2.20.3",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||||
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
|
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/terser/node_modules/source-map": {
|
"node_modules/terser/node_modules/source-map": {
|
||||||
|
@ -4054,9 +4043,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/terser/node_modules/source-map-support": {
|
"node_modules/terser/node_modules/source-map-support": {
|
||||||
"version": "0.5.6",
|
"version": "0.5.21",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||||
"integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
|
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"buffer-from": "^1.0.0",
|
"buffer-from": "^1.0.0",
|
||||||
|
@ -5041,24 +5030,6 @@
|
||||||
"picomatch": "^2.0.4"
|
"picomatch": "^2.0.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"array-filter": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
|
|
||||||
"integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"array-map": {
|
|
||||||
"version": "0.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
|
|
||||||
"integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"array-reduce": {
|
|
||||||
"version": "0.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
|
|
||||||
"integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"asn1.js": {
|
"asn1.js": {
|
||||||
"version": "4.10.1",
|
"version": "4.10.1",
|
||||||
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
|
||||||
|
@ -6056,7 +6027,6 @@
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
|
||||||
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"function-bind": "^1.1.1",
|
"function-bind": "^1.1.1",
|
||||||
"get-intrinsic": "^1.0.2"
|
"get-intrinsic": "^1.0.2"
|
||||||
|
@ -6205,9 +6175,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"cookiejar": {
|
"cookiejar": {
|
||||||
"version": "2.1.2",
|
"version": "2.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
|
||||||
"integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA=="
|
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
|
||||||
},
|
},
|
||||||
"core-js": {
|
"core-js": {
|
||||||
"version": "2.5.7",
|
"version": "2.5.7",
|
||||||
|
@ -6357,9 +6327,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"decode-uri-component": {
|
"decode-uri-component": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
|
||||||
"integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
|
"integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"define-properties": {
|
"define-properties": {
|
||||||
|
@ -6691,8 +6661,7 @@
|
||||||
"function-bind": {
|
"function-bind": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
|
||||||
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
|
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"get-assigned-identifiers": {
|
"get-assigned-identifiers": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
|
@ -6704,7 +6673,6 @@
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
|
||||||
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
|
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"function-bind": "^1.1.1",
|
"function-bind": "^1.1.1",
|
||||||
"has": "^1.0.3",
|
"has": "^1.0.3",
|
||||||
|
@ -6772,7 +6740,6 @@
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
|
||||||
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"function-bind": "^1.1.1"
|
"function-bind": "^1.1.1"
|
||||||
}
|
}
|
||||||
|
@ -6795,8 +6762,7 @@
|
||||||
"has-symbols": {
|
"has-symbols": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
|
||||||
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
|
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"hash-base": {
|
"hash-base": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
|
@ -7152,9 +7118,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"jpeg-js": {
|
"jpeg-js": {
|
||||||
"version": "0.4.0",
|
"version": "0.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
|
||||||
"integrity": "sha512-960VHmtN1vTpasX/1LupLohdP5odwAT7oK/VSm6mW0M58LbrBnowLAPWAZhWGhDAGjzbMnPXZxzB/QYgBwkN0w==",
|
"integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"js-cookie": {
|
"js-cookie": {
|
||||||
|
@ -7460,8 +7426,7 @@
|
||||||
"object-inspect": {
|
"object-inspect": {
|
||||||
"version": "1.10.3",
|
"version": "1.10.3",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
|
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
|
||||||
"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
|
"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw=="
|
||||||
"dev": true
|
|
||||||
},
|
},
|
||||||
"object-keys": {
|
"object-keys": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
|
@ -7699,9 +7664,12 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"qs": {
|
"qs": {
|
||||||
"version": "6.5.2",
|
"version": "6.11.0",
|
||||||
"resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
|
||||||
"integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
"integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
|
||||||
|
"requires": {
|
||||||
|
"side-channel": "^1.0.4"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"querystring": {
|
"querystring": {
|
||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
|
@ -7930,15 +7898,19 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"shell-quote": {
|
"shell-quote": {
|
||||||
"version": "1.6.1",
|
"version": "1.7.3",
|
||||||
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
|
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz",
|
||||||
"integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
|
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
|
},
|
||||||
|
"side-channel": {
|
||||||
|
"version": "1.0.4",
|
||||||
|
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
|
||||||
|
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"array-filter": "~0.0.0",
|
"call-bind": "^1.0.0",
|
||||||
"array-map": "~0.0.0",
|
"get-intrinsic": "^1.0.2",
|
||||||
"array-reduce": "~0.0.0",
|
"object-inspect": "^1.9.0"
|
||||||
"jsonify": "~0.0.0"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"simple-concat": {
|
"simple-concat": {
|
||||||
|
@ -8145,20 +8117,20 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"terser": {
|
"terser": {
|
||||||
"version": "3.7.7",
|
"version": "4.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/terser/-/terser-3.7.7.tgz",
|
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
|
||||||
"integrity": "sha512-RRLIxE7S52vSOI9cEbOaisgBd2y6MNgfg2ihUkidsFnuP1eDmZ79+lBWbyvgfFTAc/r8nSjL0k3cpZDDIYiYiA==",
|
"integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"commander": "~2.14.1",
|
"commander": "^2.20.0",
|
||||||
"source-map": "~0.6.1",
|
"source-map": "~0.6.1",
|
||||||
"source-map-support": "~0.5.6"
|
"source-map-support": "~0.5.12"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"commander": {
|
"commander": {
|
||||||
"version": "2.14.1",
|
"version": "2.20.3",
|
||||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz",
|
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
|
||||||
"integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==",
|
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"source-map": {
|
"source-map": {
|
||||||
|
@ -8168,9 +8140,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"source-map-support": {
|
"source-map-support": {
|
||||||
"version": "0.5.6",
|
"version": "0.5.21",
|
||||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz",
|
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
|
||||||
"integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==",
|
"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"buffer-from": "^1.0.0",
|
"buffer-from": "^1.0.0",
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node build.js",
|
"build": "node build.js",
|
||||||
"watch": "node build.js --watch"
|
"watch": "node build.js --watch",
|
||||||
|
"build-container": "docker build -t szurubooru/client:dev ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dompurify": "^2.0.17",
|
"dompurify": "^2.0.17",
|
||||||
|
@ -28,7 +29,7 @@
|
||||||
"jimp": "^0.13.0",
|
"jimp": "^0.13.0",
|
||||||
"pretty-error": "^3.0.3",
|
"pretty-error": "^3.0.3",
|
||||||
"stylus": "^0.54.8",
|
"stylus": "^0.54.8",
|
||||||
"terser": "^3.7.7",
|
"terser": "^4.8.1",
|
||||||
"underscore": "^1.12.1",
|
"underscore": "^1.12.1",
|
||||||
"watchify": "^4.0.0",
|
"watchify": "^4.0.0",
|
||||||
"ws": "^7.4.6"
|
"ws": "^7.4.6"
|
||||||
|
|
|
@ -115,6 +115,7 @@ privileges:
|
||||||
'posts:favorite': regular
|
'posts:favorite': regular
|
||||||
'posts:bulk-edit:tags': power
|
'posts:bulk-edit:tags': power
|
||||||
'posts:bulk-edit:safety': power
|
'posts:bulk-edit:safety': power
|
||||||
|
'posts:bulk-edit:delete': power
|
||||||
|
|
||||||
'tags:create': regular
|
'tags:create': regular
|
||||||
'tags:edit:names': power
|
'tags:edit:names': power
|
||||||
|
|
|
@ -39,6 +39,9 @@ def get_mime_type(content: bytes) -> str:
|
||||||
if content[4:12] in (b"ftypisom", b"ftypiso5", b"ftypiso6", b"ftypmp42", b"ftypM4V "):
|
if content[4:12] in (b"ftypisom", b"ftypiso5", b"ftypiso6", b"ftypmp42", b"ftypM4V "):
|
||||||
return "video/mp4"
|
return "video/mp4"
|
||||||
|
|
||||||
|
if content[4:12] == b"ftypqt ":
|
||||||
|
return "video/quicktime"
|
||||||
|
|
||||||
return "application/octet-stream"
|
return "application/octet-stream"
|
||||||
|
|
||||||
|
|
||||||
|
@ -54,6 +57,7 @@ def get_extension(mime_type: str) -> Optional[str]:
|
||||||
"image/heif": "heif",
|
"image/heif": "heif",
|
||||||
"image/heic": "heic",
|
"image/heic": "heic",
|
||||||
"video/mp4": "mp4",
|
"video/mp4": "mp4",
|
||||||
|
"video/quicktime": "mov",
|
||||||
"video/webm": "webm",
|
"video/webm": "webm",
|
||||||
"application/octet-stream": "dat",
|
"application/octet-stream": "dat",
|
||||||
}
|
}
|
||||||
|
@ -65,7 +69,12 @@ def is_flash(mime_type: str) -> bool:
|
||||||
|
|
||||||
|
|
||||||
def is_video(mime_type: str) -> bool:
|
def is_video(mime_type: str) -> bool:
|
||||||
return mime_type.lower() in ("application/ogg", "video/mp4", "video/webm")
|
return mime_type.lower() in (
|
||||||
|
"application/ogg",
|
||||||
|
"video/mp4",
|
||||||
|
"video/quicktime",
|
||||||
|
"video/webm",
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def is_image(mime_type: str) -> bool:
|
def is_image(mime_type: str) -> bool:
|
||||||
|
|
BIN
server/szurubooru/tests/assets/mov.mov
Normal file
BIN
server/szurubooru/tests/assets/mov.mov
Normal file
Binary file not shown.
|
@ -7,6 +7,7 @@ from szurubooru.func import mime
|
||||||
"input_path,expected_mime_type",
|
"input_path,expected_mime_type",
|
||||||
[
|
[
|
||||||
("mp4.mp4", "video/mp4"),
|
("mp4.mp4", "video/mp4"),
|
||||||
|
("mov.mov", "video/quicktime"),
|
||||||
("webm.webm", "video/webm"),
|
("webm.webm", "video/webm"),
|
||||||
("flash.swf", "application/x-shockwave-flash"),
|
("flash.swf", "application/x-shockwave-flash"),
|
||||||
("png.png", "image/png"),
|
("png.png", "image/png"),
|
||||||
|
@ -35,6 +36,7 @@ def test_get_mime_type_for_empty_file():
|
||||||
[
|
[
|
||||||
("video/mp4", "mp4"),
|
("video/mp4", "mp4"),
|
||||||
("video/webm", "webm"),
|
("video/webm", "webm"),
|
||||||
|
("video/quicktime", "mov"),
|
||||||
("application/x-shockwave-flash", "swf"),
|
("application/x-shockwave-flash", "swf"),
|
||||||
("image/png", "png"),
|
("image/png", "png"),
|
||||||
("image/jpeg", "jpg"),
|
("image/jpeg", "jpg"),
|
||||||
|
@ -70,6 +72,8 @@ def test_is_flash(input_mime_type, expected_state):
|
||||||
("VIDEO/WEBM", True),
|
("VIDEO/WEBM", True),
|
||||||
("video/mp4", True),
|
("video/mp4", True),
|
||||||
("VIDEO/MP4", True),
|
("VIDEO/MP4", True),
|
||||||
|
("video/quicktime", True),
|
||||||
|
("VIDEO/QUICKTIME", True),
|
||||||
("video/anything_else", False),
|
("video/anything_else", False),
|
||||||
("application/ogg", True),
|
("application/ogg", True),
|
||||||
("not a video", False),
|
("not a video", False),
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import os
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
from szurubooru import errors
|
from szurubooru import errors
|
||||||
|
@ -16,6 +18,9 @@ def inject_config(tmpdir, config_injector):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
|
||||||
|
)
|
||||||
def test_download():
|
def test_download():
|
||||||
url = "http://info.cern.ch/hypertext/WWW/TheProject.html"
|
url = "http://info.cern.ch/hypertext/WWW/TheProject.html"
|
||||||
|
|
||||||
|
@ -62,6 +67,9 @@ def test_download():
|
||||||
assert actual_content == expected_content
|
assert actual_content == expected_content
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
|
||||||
|
)
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"url",
|
"url",
|
||||||
[
|
[
|
||||||
|
@ -74,6 +82,9 @@ def test_too_large_download(url):
|
||||||
net.download(url, use_video_downloader=True)
|
net.download(url, use_video_downloader=True)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
|
||||||
|
)
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"url,expected_sha1",
|
"url,expected_sha1",
|
||||||
[
|
[
|
||||||
|
@ -96,6 +107,9 @@ def test_content_download(url, expected_sha1):
|
||||||
assert get_sha1(actual_content) == expected_sha1
|
assert get_sha1(actual_content) == expected_sha1
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
|
||||||
|
)
|
||||||
def test_bad_content_downlaod():
|
def test_bad_content_downlaod():
|
||||||
url = "http://info.cern.ch/hypertext/WWW/TheProject.html"
|
url = "http://info.cern.ch/hypertext/WWW/TheProject.html"
|
||||||
with pytest.raises(errors.ThirdPartyError):
|
with pytest.raises(errors.ThirdPartyError):
|
||||||
|
@ -108,11 +122,13 @@ def test_no_webhooks(config_injector):
|
||||||
assert len(res) == 0
|
assert len(res) == 0
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
|
||||||
|
)
|
||||||
@pytest.mark.parametrize(
|
@pytest.mark.parametrize(
|
||||||
"webhook,status_code",
|
"webhook,status_code",
|
||||||
[
|
[
|
||||||
("https://postman-echo.com/post", 200),
|
("https://postman-echo.com/post", 200),
|
||||||
("http://localhost/", 400),
|
|
||||||
("https://postman-echo.com/get", 400),
|
("https://postman-echo.com/get", 400),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -121,6 +137,9 @@ def test_single_webhook(config_injector, webhook, status_code):
|
||||||
assert ret == status_code
|
assert ret == status_code
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.skipif(
|
||||||
|
"TEST_NET" not in os.environ, reason="Network tests skipped by default."
|
||||||
|
)
|
||||||
def test_multiple_webhooks(config_injector):
|
def test_multiple_webhooks(config_injector):
|
||||||
config_injector(
|
config_injector(
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue