mirror of
https://github.com/wekan/wekan.git
synced 2025-04-24 22:17:16 -04:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
2c042e7f11
16 changed files with 826 additions and 763 deletions
33
CHANGELOG.md
33
CHANGELOG.md
|
@ -1,3 +1,36 @@
|
||||||
|
# v3.00 2019-07-25 Wekan release
|
||||||
|
|
||||||
|
This release:
|
||||||
|
|
||||||
|
- works with source, and docker-compose.yml at master branch.
|
||||||
|
- Docker release uses Meteor 1.8.1 and MongoDB 4.0.10, so you need to backup your old MongoDB database and
|
||||||
|
restore with --noIndexRestore as described at https://github.com/wekan/wekan/wiki/Backup
|
||||||
|
- Snap and Sandstorm builds are not fixed yet, see progress at https://github.com/wekan/wekan/issues/2533
|
||||||
|
|
||||||
|
This release adds the following new features:
|
||||||
|
|
||||||
|
- [Added label text to labels on minicard](https://github.com/wekan/wekan/commit/c48d5a73cab04db1a1e113e4367dc88573110438).
|
||||||
|
Thanks to xet7.
|
||||||
|
- [Allow to shrink attached/pasted image](https://github.com/wekan/wekan/pull/2544).
|
||||||
|
Thanks to whowillcare.
|
||||||
|
|
||||||
|
and fixes the following bugs:
|
||||||
|
|
||||||
|
- [Fix invites](https://github.com/wekan/wekan/pull/2549).
|
||||||
|
Thanks to justinr1234.
|
||||||
|
- [Makes LDAP background sync work. If the sync interval is unspecified, falls back to a hourly default](https://github.com/wekan/wekan/pull/2555).
|
||||||
|
Thanks to pshunter.
|
||||||
|
- [Prevent isCommentOnly user adding attachments, editing list names, moving lists,
|
||||||
|
and seeing board settings menu. Show non-editable Custom Fields to isCommentOnly user](https://github.com/wekan/wekan/commit/a68c928896a94c377134f29a7183aa0b5a423720).
|
||||||
|
Thanks to xet7.
|
||||||
|
- [Many](https://github.com/wekan/wekan/pull/2546) [Snap](https://github.com/wekan/wekan/pull/2552) [fixes](https://github.com/wekan/wekan/pull/2553).
|
||||||
|
In Progress. Thanks to justrinr1234.
|
||||||
|
- [Fixed Dockerfile](https://github.com/wekan/wekan/commit/7df6f305c5cf41ac213623aeffaa7e48c981e0b6) and
|
||||||
|
[docker-compose.yml](https://github.com/wekan/wekan/commit/95698911f92ca728dbaab69406fd09bcbf81339d).
|
||||||
|
Thanks to xet7.
|
||||||
|
|
||||||
|
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||||
|
|
||||||
# v2.99 2019-07-17 Wekan release
|
# v2.99 2019-07-17 Wekan release
|
||||||
|
|
||||||
This release adds the following new features:
|
This release adds the following new features:
|
||||||
|
|
12
Dockerfile
12
Dockerfile
|
@ -174,7 +174,7 @@ RUN \
|
||||||
mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
|
mv node-${NODE_VERSION}-${ARCHITECTURE} /opt/nodejs && \
|
||||||
ln -s /opt/nodejs/bin/node /usr/bin/node && \
|
ln -s /opt/nodejs/bin/node /usr/bin/node && \
|
||||||
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
|
ln -s /opt/nodejs/bin/npm /usr/bin/npm && \
|
||||||
#mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/8.16.0 /home/wekan/.config && \
|
mkdir -p /opt/nodejs/lib/node_modules/fibers/.node-gyp /root/.node-gyp/8.16.0 /home/wekan/.config && \
|
||||||
chown wekan --recursive /home/wekan/.config && \
|
chown wekan --recursive /home/wekan/.config && \
|
||||||
\
|
\
|
||||||
#DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
#DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||||
|
@ -196,8 +196,8 @@ RUN \
|
||||||
#sed -i 's/VERBOSITY="--silent"/VERBOSITY="--progress-bar"/' ./install_meteor.sh && \
|
#sed -i 's/VERBOSITY="--silent"/VERBOSITY="--progress-bar"/' ./install_meteor.sh && \
|
||||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
|
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
|
||||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh && \
|
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh && \
|
||||||
#chown wekan /home/wekan/install_meteor.sh && \
|
mv /root/.meteor /home/wekan/ && \
|
||||||
#gosu wekan:wekan sh /home/wekan/install_meteor.sh; \
|
chown wekan --recursive /home/wekan/.meteor && \
|
||||||
\
|
\
|
||||||
# Check if opting for a release candidate instead of major release
|
# Check if opting for a release candidate instead of major release
|
||||||
#if [ "$USE_EDGE" = false ]; then \
|
#if [ "$USE_EDGE" = false ]; then \
|
||||||
|
@ -242,7 +242,7 @@ RUN \
|
||||||
# Build app
|
# Build app
|
||||||
cd /home/wekan/app && \
|
cd /home/wekan/app && \
|
||||||
mkdir -p /home/wekan/.npm && \
|
mkdir -p /home/wekan/.npm && \
|
||||||
chown wekan --recursive /home/wekan/.npm /home/wekan/.config && \
|
chown wekan --recursive /home/wekan/.npm /home/wekan/.config /home/wekan/.meteor && \
|
||||||
#gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js && \
|
#gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js && \
|
||||||
gosu wekan:wekan npm install && \
|
gosu wekan:wekan npm install && \
|
||||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
|
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
|
||||||
|
@ -270,9 +270,9 @@ RUN \
|
||||||
rm -R /var/lib/apt/lists/* && \
|
rm -R /var/lib/apt/lists/* && \
|
||||||
rm -R /home/wekan/.meteor && \
|
rm -R /home/wekan/.meteor && \
|
||||||
rm -R /home/wekan/app && \
|
rm -R /home/wekan/app && \
|
||||||
rm -R /home/wekan/app_build && \
|
rm -R /home/wekan/app_build
|
||||||
#cat /home/wekan/python/esprima-python/files.txt | xargs rm -R && \
|
#cat /home/wekan/python/esprima-python/files.txt | xargs rm -R && \
|
||||||
rm -R /home/wekan/python
|
#rm -R /home/wekan/python
|
||||||
#rm /home/wekan/install_meteor.sh
|
#rm /home/wekan/install_meteor.sh
|
||||||
|
|
||||||
ENV PORT=8080
|
ENV PORT=8080
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||||
appVersion: "v2.99.0"
|
appVersion: "v3.00.0"
|
||||||
files:
|
files:
|
||||||
userUploads:
|
userUploads:
|
||||||
- README.md
|
- README.md
|
||||||
|
|
|
@ -37,17 +37,19 @@ template(name="attachmentsGalery")
|
||||||
i.fa.fa-download
|
i.fa.fa-download
|
||||||
| {{_ 'download'}}
|
| {{_ 'download'}}
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
if isImage
|
unless currentUser.isCommentOnly
|
||||||
a(class="{{#if $eq ../coverId _id}}js-remove-cover{{else}}js-add-cover{{/if}}")
|
if isImage
|
||||||
i.fa.fa-thumb-tack
|
a(class="{{#if $eq ../coverId _id}}js-remove-cover{{else}}js-add-cover{{/if}}")
|
||||||
if($eq ../coverId _id)
|
i.fa.fa-thumb-tack
|
||||||
| {{_ 'remove-cover'}}
|
if($eq ../coverId _id)
|
||||||
else
|
| {{_ 'remove-cover'}}
|
||||||
| {{_ 'add-cover'}}
|
else
|
||||||
a.js-confirm-delete
|
| {{_ 'add-cover'}}
|
||||||
i.fa.fa-close
|
a.js-confirm-delete
|
||||||
| {{_ 'delete'}}
|
i.fa.fa-close
|
||||||
|
| {{_ 'delete'}}
|
||||||
|
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
li.attachment-item.add-attachment
|
unless currentUser.isCommentOnly
|
||||||
a.js-add-attachment {{_ 'add-attachment' }}
|
li.attachment-item.add-attachment
|
||||||
|
a.js-add-attachment {{_ 'add-attachment' }}
|
||||||
|
|
|
@ -31,6 +31,10 @@ template(name="cardCustomField-text")
|
||||||
= value
|
= value
|
||||||
else
|
else
|
||||||
| {{_ 'edit'}}
|
| {{_ 'edit'}}
|
||||||
|
else
|
||||||
|
+viewer
|
||||||
|
= value
|
||||||
|
|
||||||
|
|
||||||
template(name="cardCustomField-number")
|
template(name="cardCustomField-number")
|
||||||
if canModifyCard
|
if canModifyCard
|
||||||
|
@ -45,6 +49,9 @@ template(name="cardCustomField-number")
|
||||||
= value
|
= value
|
||||||
else
|
else
|
||||||
| {{_ 'edit'}}
|
| {{_ 'edit'}}
|
||||||
|
else
|
||||||
|
if value
|
||||||
|
= value
|
||||||
|
|
||||||
template(name="cardCustomField-date")
|
template(name="cardCustomField-date")
|
||||||
if canModifyCard
|
if canModifyCard
|
||||||
|
@ -55,6 +62,11 @@ template(name="cardCustomField-date")
|
||||||
| {{showDate}}
|
| {{showDate}}
|
||||||
else
|
else
|
||||||
| {{_ 'edit'}}
|
| {{_ 'edit'}}
|
||||||
|
else
|
||||||
|
if value
|
||||||
|
div.card-date
|
||||||
|
time(datetime="{{showISODate}}")
|
||||||
|
| {{showDate}}
|
||||||
|
|
||||||
template(name="cardCustomField-dropdown")
|
template(name="cardCustomField-dropdown")
|
||||||
if canModifyCard
|
if canModifyCard
|
||||||
|
@ -79,3 +91,7 @@ template(name="cardCustomField-dropdown")
|
||||||
= selectedItem
|
= selectedItem
|
||||||
else
|
else
|
||||||
| {{_ 'edit'}}
|
| {{_ 'edit'}}
|
||||||
|
else
|
||||||
|
if value
|
||||||
|
+viewer
|
||||||
|
= selectedItem
|
||||||
|
|
|
@ -8,7 +8,9 @@ template(name="minicard")
|
||||||
if labels
|
if labels
|
||||||
.minicard-labels
|
.minicard-labels
|
||||||
each labels
|
each labels
|
||||||
.minicard-label(class="card-label-{{color}}" title="{{name}}")
|
span.card-label(class="card-label-{{color}}" title=name)
|
||||||
|
+viewer
|
||||||
|
= name
|
||||||
.minicard-title
|
.minicard-title
|
||||||
.handle
|
.handle
|
||||||
.fa.fa-arrows
|
.fa.fa-arrows
|
||||||
|
|
|
@ -9,7 +9,7 @@ template(name="listHeader")
|
||||||
if currentList
|
if currentList
|
||||||
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
||||||
h2.list-header-name(
|
h2.list-header-name(
|
||||||
class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}")
|
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}js-open-inlined-form is-editable{{/unless}}{{/if}}")
|
||||||
+viewer
|
+viewer
|
||||||
= title
|
= title
|
||||||
if wipLimit.enabled
|
if wipLimit.enabled
|
||||||
|
|
|
@ -34,8 +34,9 @@ template(name="membersWidget")
|
||||||
h3
|
h3
|
||||||
i.fa.fa-user
|
i.fa.fa-user
|
||||||
| {{_ 'members'}}
|
| {{_ 'members'}}
|
||||||
a.board-header-btn.js-open-board-menu(title="{{_ 'boardMenuPopup-title'}}").right
|
unless currentUser.isCommentOnly
|
||||||
i.board-header-btn-icon.fa.fa-cog
|
a.board-header-btn.js-open-board-menu(title="{{_ 'boardMenuPopup-title'}}").right
|
||||||
|
i.board-header-btn-icon.fa.fa-cog
|
||||||
|
|
||||||
.board-widget-content
|
.board-widget-content
|
||||||
each currentBoard.activeMembers
|
each currentBoard.activeMembers
|
||||||
|
|
|
@ -9,14 +9,16 @@ template(name="swimlane")
|
||||||
each lists
|
each lists
|
||||||
+miniList(this)
|
+miniList(this)
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
+addListForm
|
unless currentUser.isCommentOnly
|
||||||
|
+addListForm
|
||||||
else
|
else
|
||||||
each lists
|
each lists
|
||||||
+list(this)
|
+list(this)
|
||||||
if currentCardIsInThisList _id ../_id
|
if currentCardIsInThisList _id ../_id
|
||||||
+cardDetails(currentCard)
|
+cardDetails(currentCard)
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
+addListForm
|
unless currentUser.isCommentOnly
|
||||||
|
+addListForm
|
||||||
|
|
||||||
template(name="listsGroup")
|
template(name="listsGroup")
|
||||||
.swimlane.list-group.js-lists
|
.swimlane.list-group.js-lists
|
||||||
|
@ -27,14 +29,16 @@ template(name="listsGroup")
|
||||||
each lists
|
each lists
|
||||||
+miniList(this)
|
+miniList(this)
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
+addListForm
|
unless currentUser.isCommentOnly
|
||||||
|
+addListForm
|
||||||
else
|
else
|
||||||
each lists
|
each lists
|
||||||
+list(this)
|
+list(this)
|
||||||
if currentCardIsInThisList _id null
|
if currentCardIsInThisList _id null
|
||||||
+cardDetails(currentCard)
|
+cardDetails(currentCard)
|
||||||
if currentUser.isBoardMember
|
if currentUser.isBoardMember
|
||||||
+addListForm
|
unless currentUser.isCommentOnly
|
||||||
|
+addListForm
|
||||||
|
|
||||||
template(name="addListForm")
|
template(name="addListForm")
|
||||||
.list.list-composer.js-list-composer
|
.list.list-composer.js-list-composer
|
||||||
|
|
|
@ -9,6 +9,8 @@ version: '2'
|
||||||
# https://github.com/wekan/wekan/wiki/Forgot-Password
|
# https://github.com/wekan/wekan/wiki/Forgot-Password
|
||||||
#---------------------------------------------------------------------------------------------------------
|
#---------------------------------------------------------------------------------------------------------
|
||||||
# ==== Upgrading Wekan to new version =====
|
# ==== Upgrading Wekan to new version =====
|
||||||
|
# NOTE: MongoDB has changed from 3.x to 4.x, in that case you need backup/restore with --noIndexRestore
|
||||||
|
# see https://github.com/wekan/wekan/wiki/Backup
|
||||||
# 1) Stop Wekan:
|
# 1) Stop Wekan:
|
||||||
# docker-compose stop
|
# docker-compose stop
|
||||||
# 2) Download new version:
|
# 2) Download new version:
|
||||||
|
@ -90,9 +92,9 @@ services:
|
||||||
wekandb:
|
wekandb:
|
||||||
#-------------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------------
|
||||||
# ==== MONGODB AND METEOR VERSION ====
|
# ==== MONGODB AND METEOR VERSION ====
|
||||||
# a) For Wekan Meteor 1.8.x version at meteor-1.8 branch, use mongo 4.x
|
# a) For Wekan Meteor 1.8.x version at master branch, use mongo 4.x
|
||||||
image: mongo:4.0.10
|
image: mongo:4.0.10
|
||||||
# b) For Wekan Meteor 1.6.x version at master/devel/edge branches.
|
# b) For Wekan Meteor 1.6.x version at devel branch.
|
||||||
# Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
|
# Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
|
||||||
#image: mongo:3.2.21
|
#image: mongo:3.2.21
|
||||||
#-------------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------------
|
||||||
|
@ -110,17 +112,18 @@ services:
|
||||||
wekan:
|
wekan:
|
||||||
#-------------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------------
|
||||||
# ==== MONGODB AND METEOR VERSION ====
|
# ==== MONGODB AND METEOR VERSION ====
|
||||||
# a) For Wekan Meteor 1.8.x version at meteor-1.8 branch,
|
# NOTE: Quay is currently not updated, use Docker Hub image below c)
|
||||||
|
# a) For Wekan Meteor 1.8.x version at master branch,
|
||||||
# using https://quay.io/wekan/wekan automatic builds
|
# using https://quay.io/wekan/wekan automatic builds
|
||||||
#image: quay.io/wekan/wekan:meteor-1.8
|
#image: quay.io/wekan/wekan:master
|
||||||
# b) For Wekan Meteor 1.6.x version at master/devel/edge branches.
|
# b) For Wekan Meteor 1.6.x version at master/devel/edge branches.
|
||||||
# Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
|
# Only for Snap and Sandstorm while they are not upgraded yet to Meteor 1.8.x
|
||||||
image: quay.io/wekan/wekan:master
|
#image: quay.io/wekan/wekan:master
|
||||||
# c) Using specific Meteor 1.6.x version tag:
|
# c) Using specific Meteor 1.6.x version tag:
|
||||||
# image: quay.io/wekan/wekan:v1.95
|
# image: quay.io/wekan/wekan:v1.95
|
||||||
# c) Using Docker Hub automatic builds https://hub.docker.com/r/wekanteam/wekan
|
# c) Using Docker Hub automatic builds https://hub.docker.com/r/wekanteam/wekan
|
||||||
# image: wekanteam/wekan:meteor-1.8
|
image: wekanteam/wekan
|
||||||
# image: wekanteam/wekan:v1.95
|
# image: wekanteam/wekan:v2.99
|
||||||
#-------------------------------------------------------------------------------------
|
#-------------------------------------------------------------------------------------
|
||||||
container_name: wekan-app
|
container_name: wekan-app
|
||||||
restart: always
|
restart: always
|
||||||
|
|
1444
i18n/sv.i18n.json
1444
i18n/sv.i18n.json
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "wekan",
|
"name": "wekan",
|
||||||
"version": "v2.99.0",
|
"version": "v3.00.0",
|
||||||
"description": "Open-Source kanban",
|
"description": "Open-Source kanban",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
|
|
@ -1524,7 +1524,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||||
<ul class="toc-list-h1">
|
<ul class="toc-list-h1">
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v2.99">Wekan REST API v2.99</a>
|
<a href="#wekan-rest-api" class="toc-h1 toc-link" data-title="Wekan REST API v3.00">Wekan REST API v3.00</a>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
@ -2017,7 +2017,7 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
|
||||||
<div class="page-wrapper">
|
<div class="page-wrapper">
|
||||||
<div class="dark-box"></div>
|
<div class="dark-box"></div>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<h1 id="wekan-rest-api">Wekan REST API v2.99</h1>
|
<h1 id="wekan-rest-api">Wekan REST API v3.00</h1>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
|
<p>Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.</p>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
swagger: '2.0'
|
swagger: '2.0'
|
||||||
info:
|
info:
|
||||||
title: Wekan REST API
|
title: Wekan REST API
|
||||||
version: v2.99
|
version: v3.00
|
||||||
description: |
|
description: |
|
||||||
The REST API allows you to control and extend Wekan with ease.
|
The REST API allows you to control and extend Wekan with ease.
|
||||||
|
|
||||||
|
|
|
@ -22,10 +22,10 @@ const pkgdef :Spk.PackageDefinition = (
|
||||||
appTitle = (defaultText = "Wekan"),
|
appTitle = (defaultText = "Wekan"),
|
||||||
# The name of the app as it is displayed to the user.
|
# The name of the app as it is displayed to the user.
|
||||||
|
|
||||||
appVersion = 301,
|
appVersion = 302,
|
||||||
# Increment this for every release.
|
# Increment this for every release.
|
||||||
|
|
||||||
appMarketingVersion = (defaultText = "2.99.0~2019-07-17"),
|
appMarketingVersion = (defaultText = "3.00.0~2019-07-27"),
|
||||||
# Human-readable presentation of the app version.
|
# Human-readable presentation of the app version.
|
||||||
|
|
||||||
minUpgradableAppVersion = 0,
|
minUpgradableAppVersion = 0,
|
||||||
|
|
|
@ -65,7 +65,7 @@ apps:
|
||||||
|
|
||||||
parts:
|
parts:
|
||||||
mongodb:
|
mongodb:
|
||||||
source: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.10.tgz
|
source: https://repo.mongodb.org/apt/ubuntu/dists/xenial/mongodb-org/4.0/multiverse/binary-amd64/mongodb-org-server_4.0.10_amd64.deb
|
||||||
plugin: dump
|
plugin: dump
|
||||||
stage-packages: [libssl1.0.0]
|
stage-packages: [libssl1.0.0]
|
||||||
filesets:
|
filesets:
|
||||||
|
@ -92,6 +92,8 @@ parts:
|
||||||
# - gcc++-8
|
# - gcc++-8
|
||||||
# - capnproto
|
# - capnproto
|
||||||
- curl
|
- curl
|
||||||
|
- libcurl3
|
||||||
|
- php-curl
|
||||||
# - execstack
|
# - execstack
|
||||||
# - nodejs
|
# - nodejs
|
||||||
# - npm
|
# - npm
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue