mirror of
https://github.com/IT4Change/Ocelot-Social.git
synced 2025-12-13 07:45:56 +00:00
Merge branch 'master' into 6810-bugdevops-fix-broken-links-and-content-in-readmes-part-2
This commit is contained in:
commit
6ddeb2b444
4
.github/workflows/check-documentation.yml
vendored
4
.github/workflows/check-documentation.yml
vendored
@ -28,11 +28,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Checkout code
|
- name: Checkout code
|
||||||
uses: actions/checkout@master
|
uses: actions/checkout@master
|
||||||
|
- name: Remove old documentation files
|
||||||
|
run: rm -rf ./deployment/src/old/ # workaround until https://github.com/gaurav-nelson/github-action-markdown-link-check/pull/183 has been done
|
||||||
- name: Check Markdown Links
|
- name: Check Markdown Links
|
||||||
uses: gaurav-nelson/github-action-markdown-link-check@master
|
uses: gaurav-nelson/github-action-markdown-link-check@master
|
||||||
with:
|
with:
|
||||||
use-quiet-mode: 'yes'
|
use-quiet-mode: 'yes'
|
||||||
use-verbose-mode: 'yes'
|
use-verbose-mode: 'no'
|
||||||
# at any .md file change take the chance to check the links in all .md files
|
# at any .md file change take the chance to check the links in all .md files
|
||||||
check-modified-files-only: 'no'
|
check-modified-files-only: 'no'
|
||||||
config-file: '.github/workflows/mlc_config.json'
|
config-file: '.github/workflows/mlc_config.json'
|
||||||
|
|||||||
2
.github/workflows/mlc_config.json
vendored
2
.github/workflows/mlc_config.json
vendored
@ -3,7 +3,7 @@
|
|||||||
"retryOn429": true,
|
"retryOn429": true,
|
||||||
"retryCount": 2,
|
"retryCount": 2,
|
||||||
"fallbackRetryDelay": "30s",
|
"fallbackRetryDelay": "30s",
|
||||||
"aliveStatusCodes": [200, 206],
|
"aliveStatusCodes": [200, 206, 303, 403],
|
||||||
"ignorePatterns": [
|
"ignorePatterns": [
|
||||||
{
|
{
|
||||||
"pattern": "^(https:\/\/github.com\/Ocelot-Social-Community\/Ocelot-Social\/(pull|deployment\/src\/old)\/|http:\/\/localhost)"
|
"pattern": "^(https:\/\/github.com\/Ocelot-Social-Community\/Ocelot-Social\/(pull|deployment\/src\/old)\/|http:\/\/localhost)"
|
||||||
|
|||||||
11
.vuepress/config.js
Normal file
11
.vuepress/config.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import { defineUserConfig } from 'vuepress'
|
||||||
|
import meta from './config/meta'
|
||||||
|
import theme from './config/theme'
|
||||||
|
import plugins from './config/plugins'
|
||||||
|
|
||||||
|
export default defineUserConfig({
|
||||||
|
pagePatterns: ['**/*.md', '!.vuepress', '!node_modules', '!backend/node_modules', '!webapp/node_modules', '!deployment/src/old'],
|
||||||
|
...meta,
|
||||||
|
theme,
|
||||||
|
plugins,
|
||||||
|
})
|
||||||
8
.vuepress/config/meta.js
Normal file
8
.vuepress/config/meta.js
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
export default {
|
||||||
|
base: '/',
|
||||||
|
title: 'Ocelot.Social Documentation',
|
||||||
|
description: 'Ocelot.Social Documentation',
|
||||||
|
head: [
|
||||||
|
['meta', {name: 'viewport', content: 'width=device-width,initial-scale=1'}],
|
||||||
|
],
|
||||||
|
}
|
||||||
18
.vuepress/config/plugins.js
Normal file
18
.vuepress/config/plugins.js
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { searchProPlugin } from 'vuepress-plugin-search-pro'
|
||||||
|
|
||||||
|
export default [
|
||||||
|
searchProPlugin({
|
||||||
|
indexContent: true,
|
||||||
|
autoSuggestions: true,
|
||||||
|
customFields: [
|
||||||
|
{
|
||||||
|
getter: (page) => page.frontmatter.category,
|
||||||
|
formatter: "Category: $content",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
getter: (page) => page.frontmatter.tag,
|
||||||
|
formatter: "Tag: $content",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
})
|
||||||
|
]
|
||||||
82
.vuepress/config/theme.js
Normal file
82
.vuepress/config/theme.js
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
import path from 'path'
|
||||||
|
import fs from 'fs'
|
||||||
|
import { hopeTheme } from 'vuepress-theme-hope'
|
||||||
|
|
||||||
|
export default hopeTheme({
|
||||||
|
favicon: 'favicon.ico',
|
||||||
|
logo: '/logo.svg',
|
||||||
|
docsRepo: 'https://github.com/Ocelot-Social-Community/Ocelot-Social',
|
||||||
|
docsBranch: 'master',
|
||||||
|
docsDir: '.',
|
||||||
|
editLink: true,
|
||||||
|
lastUpdated: false,
|
||||||
|
contributors: false,
|
||||||
|
print: false,
|
||||||
|
pure: true,
|
||||||
|
displayFooter: true,
|
||||||
|
footer: 'CC BY busFaktor() e.V. & Authors',
|
||||||
|
sidebar: generateSidebar('../../SUMMARY.md'),
|
||||||
|
navbar: [
|
||||||
|
{ text: 'Home', link: '/' },
|
||||||
|
{
|
||||||
|
text: 'Github',
|
||||||
|
link: 'https://github.com/Ocelot-Social-Community/Ocelot-Social'
|
||||||
|
},
|
||||||
|
],
|
||||||
|
plugins: {
|
||||||
|
mdEnhance: {
|
||||||
|
tabs: true,
|
||||||
|
imgSize: true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
function generateSidebar(summaryFileName) {
|
||||||
|
const summaryFile = path.resolve(__dirname, summaryFileName)
|
||||||
|
|
||||||
|
try {
|
||||||
|
return getSummaryData(summaryFile)
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`Error generating sidebar from file ${summaryFileName}:`, err)
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSummaryData(file) {
|
||||||
|
const lines = fs.readFileSync(file, 'utf8').split('\n')
|
||||||
|
const sidebarStructure = []
|
||||||
|
let currentParent = null
|
||||||
|
|
||||||
|
lines.forEach((line, i) => {
|
||||||
|
const level = line.search(/\S|$/) / 2
|
||||||
|
const match = line.match(/^\s*\*\s*\[([^\]]+)\]\(([^)]+)\)/)
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
const newEntry = { text: match[1], link: `/${match[2]}`, children: [] }
|
||||||
|
if (level === 0) {
|
||||||
|
sidebarStructure.push(newEntry)
|
||||||
|
currentParent = sidebarStructure[sidebarStructure.length - 1]
|
||||||
|
} else {
|
||||||
|
let parent = currentParent
|
||||||
|
|
||||||
|
for (let i = 1; i < level; i++) {
|
||||||
|
parent = parent.children[parent.children.length - 1]
|
||||||
|
}
|
||||||
|
|
||||||
|
parent.children.push(newEntry)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
sidebarStructure.forEach(removeEmptyArrays)
|
||||||
|
return sidebarStructure
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeEmptyArrays(item) {
|
||||||
|
if (item.children && item.children.length === 0) {
|
||||||
|
delete item.children;
|
||||||
|
} else if (item.children) {
|
||||||
|
item.children.forEach(removeEmptyArrays);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BIN
.vuepress/public/favicon.ico
Normal file
BIN
.vuepress/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.4 KiB |
65
.vuepress/public/logo.svg
Normal file
65
.vuepress/public/logo.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 28 KiB |
@ -1,6 +1,6 @@
|
|||||||
# CONTRIBUTING
|
# CONTRIBUTING
|
||||||
|
|
||||||
Thank you so much for thinking of contributing to the [ocelot.social](https://ocelot.social) project! It's awesome you're here, we really appreciate it. :-\)
|
Thank you so much for thinking of contributing to the <!-- [ -->ocelot.social<!-- ](https://ocelot.social) --> project! It's awesome you're here, we really appreciate it. :-\)
|
||||||
|
|
||||||
## Getting Set Up
|
## Getting Set Up
|
||||||
|
|
||||||
@ -48,6 +48,9 @@ You can talk to our core team on [Discord](https://discord.gg/AJSX9DCSUA). And o
|
|||||||
* Moriz (@Mogge)
|
* Moriz (@Mogge)
|
||||||
* Wolle (@Tirokk)
|
* Wolle (@Tirokk)
|
||||||
* Alex (@ogerly)
|
* Alex (@ogerly)
|
||||||
|
* Hannes (@elweyn5803)
|
||||||
|
* Mathias (@mahula)
|
||||||
|
* Markus (@maeckes#1133)
|
||||||
|
|
||||||
<!-- * Robert (@roschaefer)
|
<!-- * Robert (@roschaefer)
|
||||||
* Matt (@mattwr18)
|
* Matt (@mattwr18)
|
||||||
|
|||||||
16
README.md
16
README.md
@ -6,11 +6,13 @@
|
|||||||
[](https://discord.gg/AJSX9DCSUA)
|
[](https://discord.gg/AJSX9DCSUA)
|
||||||
[](https://www.codetriage.com/ocelot-social-community/ocelot-social)
|
[](https://www.codetriage.com/ocelot-social-community/ocelot-social)
|
||||||
|
|
||||||
[Ocelot.social](https://ocelot.social) is free and open source software program code to run social networks. Its development is supported by a community of programmers and interested network operators.
|
<!-- [ -->Ocelot.social<!-- ](<https://ocelot.social>) --> is free and open source software program code to run social networks. Its development is supported by a community of programmers and interested network operators.
|
||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<!-- markdownlint-disable MD033 -->
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://ocelot.social" target="_blank"><img src="webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%"></a>
|
<!-- <a href="https://ocelot.social" target="_blank"> -->
|
||||||
|
<img src="https://raw.githubusercontent.com/Ocelot-Social-Community/Ocelot-Social/master/webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%">
|
||||||
|
<!-- </a> -->
|
||||||
</p>
|
</p>
|
||||||
<!-- markdownlint-enable MD033 -->
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
@ -67,7 +69,7 @@ Try out our live demo network, see [here](#live-demo-and-developer-logins).
|
|||||||
If you're wondering how you could help, there are plenty of ways, e.g.:
|
If you're wondering how you could help, there are plenty of ways, e.g.:
|
||||||
|
|
||||||
- Spread the good word about ocelot.social to make it more popular:
|
- Spread the good word about ocelot.social to make it more popular:
|
||||||
- Add the link [ocelot.social](https://ocelot.social) to your website.
|
- Add the link <!-- [ -->ocelot.social<!-- ](https://ocelot.social)--> to your website.
|
||||||
- Give ocelot.social a Like at <https://alternativeto.net/software/ocelot-social/>.
|
- Give ocelot.social a Like at <https://alternativeto.net/software/ocelot-social/>.
|
||||||
- Star our project on GitHub at <https://github.com/Ocelot-Social-Community/Ocelot-Social/>.
|
- Star our project on GitHub at <https://github.com/Ocelot-Social-Community/Ocelot-Social/>.
|
||||||
- Promote it on your social networks.
|
- Promote it on your social networks.
|
||||||
@ -138,11 +140,11 @@ $ cd Ocelot-Social
|
|||||||
|
|
||||||
### Live Demo and Developer Logins
|
### Live Demo and Developer Logins
|
||||||
|
|
||||||
**Try out our deployed [development environment](https://stage.ocelot.social).**
|
**Try out our deployed <!-- [ -->development environment<!--](https://stage.ocelot.social)-->.**
|
||||||
|
|
||||||
Visit our staging networks:
|
Visit our staging networks:
|
||||||
|
|
||||||
- central staging network: [stage.ocelot.social](https://stage.ocelot.social)
|
- central staging network: <!-- [ -->stage.ocelot.social<!-- ](https://stage.ocelot.social)-->
|
||||||
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
||||||
|
|
||||||
#### Login
|
#### Login
|
||||||
@ -249,7 +251,7 @@ $ yarn locales --fix
|
|||||||
$ yarn test
|
$ yarn test
|
||||||
```
|
```
|
||||||
|
|
||||||
Check out our [contribution guideline](./CONTRIBUTING.md), too!
|
Check out our [contribution guideline](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/CONTRIBUTING.md), too!
|
||||||
|
|
||||||
#### Developer Chat
|
#### Developer Chat
|
||||||
|
|
||||||
@ -303,7 +305,7 @@ Locale Icons made by [Freepik](http://www.freepik.com/) from [www.flaticon.com](
|
|||||||
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
Browser compatibility testing with [BrowserStack](https://www.browserstack.com/).
|
||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<!-- markdownlint-disable MD033 -->
|
||||||
<img alt="BrowserStack Logo" src=".gitbook/assets/browserstack-logo.svg" width="256">
|
<img alt="BrowserStack Logo" src="https://raw.githubusercontent.com/Ocelot-Social-Community/Ocelot-Social/master/.gitbook/assets/browserstack-logo.svg" width="256">
|
||||||
<!-- markdownlint-enable MD033 -->
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
### License
|
### License
|
||||||
|
|||||||
@ -1,7 +1,6 @@
|
|||||||
# Table of contents
|
# Table of contents
|
||||||
|
|
||||||
* [Introduction](README.md)
|
* [Introduction](README.md)
|
||||||
* [Edit this Documentation](edit-this-documentation.md)
|
|
||||||
* [Neo4J](neo4j/README.md)
|
* [Neo4J](neo4j/README.md)
|
||||||
* [Backend](backend/README.md)
|
* [Backend](backend/README.md)
|
||||||
* [GraphQL](backend/graphql.md)
|
* [GraphQL](backend/graphql.md)
|
||||||
@ -19,4 +18,5 @@
|
|||||||
* [Contributing](CONTRIBUTING.md)
|
* [Contributing](CONTRIBUTING.md)
|
||||||
* [Feature Specification](cypress/features.md)
|
* [Feature Specification](cypress/features.md)
|
||||||
* [Code of Conduct](CODE_OF_CONDUCT.md)
|
* [Code of Conduct](CODE_OF_CONDUCT.md)
|
||||||
|
* [Documentation](documentation.md)
|
||||||
* [License](LICENSE.md)
|
* [License](LICENSE.md)
|
||||||
|
|||||||
@ -83,8 +83,8 @@ More details about our GraphQL playground and how to use it with ocelot.social c
|
|||||||
|
|
||||||
Database indexes and constraints need to be created and upgraded when the database and the backend are running:
|
Database indexes and constraints need to be created and upgraded when the database and the backend are running:
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# in main folder while docker-compose is running
|
# in main folder while docker-compose is running
|
||||||
@ -102,8 +102,7 @@ $ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
|
|||||||
$ docker exec backend yarn run db:migrate up
|
$ docker exec backend yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# in folder backend/ while database is running
|
# in folder backend/ while database is running
|
||||||
@ -116,16 +115,15 @@ yarn run db:migrate init
|
|||||||
yarn run db:migrate up
|
yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
#### Seed Database
|
#### Seed Database
|
||||||
|
|
||||||
If you want your backend to return anything else than an empty response, you
|
If you want your backend to return anything else than an empty response, you
|
||||||
need to seed your database:
|
need to seed your database:
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
In another terminal run:
|
In another terminal run:
|
||||||
|
|
||||||
@ -147,8 +145,7 @@ $ docker exec backend yarn run db:migrate init
|
|||||||
$ docker exec backend yarn run db:migrate up
|
$ docker exec backend yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
Run:
|
Run:
|
||||||
|
|
||||||
@ -164,16 +161,15 @@ To reset the database run:
|
|||||||
$ yarn run db:reset
|
$ yarn run db:reset
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
### Data migrations
|
### Data migrations
|
||||||
|
|
||||||
Although Neo4J is schema-less,you might find yourself in a situation in which
|
Although Neo4J is schema-less,you might find yourself in a situation in which
|
||||||
you have to migrate your data e.g. because your data modeling has changed.
|
you have to migrate your data e.g. because your data modeling has changed.
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
Generate a data migration file:
|
Generate a data migration file:
|
||||||
|
|
||||||
@ -190,8 +186,7 @@ To run the migration:
|
|||||||
$ docker exec backend yarn run db:migrate up
|
$ docker exec backend yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
Generate a data migration file:
|
Generate a data migration file:
|
||||||
|
|
||||||
@ -208,16 +203,15 @@ To run the migration:
|
|||||||
$ yarn run db:migrate up
|
$ yarn run db:migrate up
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
**Beware**: We have no multiple database setup at the moment. We clean the
|
**Beware**: We have no multiple database setup at the moment. We clean the
|
||||||
database after each test, running the tests will wipe out all your data!
|
database after each test, running the tests will wipe out all your data!
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Docker" %}
|
@tab:active Docker
|
||||||
|
|
||||||
Run the unit tests:
|
Run the unit tests:
|
||||||
|
|
||||||
@ -226,9 +220,7 @@ Run the unit tests:
|
|||||||
$ docker exec backend yarn run test
|
$ docker exec backend yarn run test
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
@tab Without Docker
|
||||||
|
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
Run the unit tests:
|
Run the unit tests:
|
||||||
|
|
||||||
@ -237,5 +229,4 @@ Run the unit tests:
|
|||||||
$ yarn run test
|
$ yarn run test
|
||||||
```
|
```
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|||||||
@ -45,7 +45,7 @@
|
|||||||
"cheerio": "~1.0.0-rc.3",
|
"cheerio": "~1.0.0-rc.3",
|
||||||
"cors": "~2.8.5",
|
"cors": "~2.8.5",
|
||||||
"cross-env": "~7.0.3",
|
"cross-env": "~7.0.3",
|
||||||
"dotenv": "~8.2.0",
|
"dotenv": "~16.3.1",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"graphql": "^14.6.0",
|
"graphql": "^14.6.0",
|
||||||
"graphql-middleware": "~4.0.2",
|
"graphql-middleware": "~4.0.2",
|
||||||
@ -85,7 +85,7 @@
|
|||||||
"nodemailer": "^6.4.4",
|
"nodemailer": "^6.4.4",
|
||||||
"nodemailer-html-to-text": "^3.2.0",
|
"nodemailer-html-to-text": "^3.2.0",
|
||||||
"request": "~2.88.2",
|
"request": "~2.88.2",
|
||||||
"sanitize-html": "~1.22.0",
|
"sanitize-html": "~2.11.0",
|
||||||
"slug": "~6.0.0",
|
"slug": "~6.0.0",
|
||||||
"subscriptions-transport-ws": "^0.9.19",
|
"subscriptions-transport-ws": "^0.9.19",
|
||||||
"trunc-html": "~1.1.2",
|
"trunc-html": "~1.1.2",
|
||||||
@ -100,13 +100,11 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
"@typescript-eslint/eslint-plugin": "^5.57.1",
|
||||||
"@typescript-eslint/parser": "^5.57.1",
|
"@typescript-eslint/parser": "^5.57.1",
|
||||||
"apollo-server-testing": "~2.11.0",
|
"apollo-server-testing": "~2.11.0",
|
||||||
"chai": "~4.3.8",
|
|
||||||
"cucumber": "~6.0.5",
|
|
||||||
"eslint": "^8.37.0",
|
"eslint": "^8.37.0",
|
||||||
"eslint-config-prettier": "^9.0.0",
|
"eslint-config-prettier": "^9.0.0",
|
||||||
"eslint-config-standard": "^17.0.0",
|
"eslint-config-standard": "^17.0.0",
|
||||||
"eslint-import-resolver-typescript": "^3.6.1",
|
"eslint-import-resolver-typescript": "^3.6.1",
|
||||||
"eslint-plugin-import": "^2.27.5",
|
"eslint-plugin-import": "^2.29.0",
|
||||||
"eslint-plugin-jest": "^27.2.1",
|
"eslint-plugin-jest": "^27.2.1",
|
||||||
"eslint-plugin-n": "^15.7.0",
|
"eslint-plugin-n": "^15.7.0",
|
||||||
"eslint-plugin-prettier": "^4.2.1",
|
"eslint-plugin-prettier": "^4.2.1",
|
||||||
|
|||||||
@ -1,35 +1,11 @@
|
|||||||
import Factory, { cleanDatabase } from '../db/factories'
|
import Factory, { cleanDatabase } from '../db/factories'
|
||||||
import { getDriver, getNeode } from '../db/neo4j'
|
import { getDriver, getNeode } from '../db/neo4j'
|
||||||
import decode from './decode'
|
import decode from './decode'
|
||||||
|
import encode from './encode'
|
||||||
|
|
||||||
const driver = getDriver()
|
const driver = getDriver()
|
||||||
const neode = getNeode()
|
const neode = getNeode()
|
||||||
|
|
||||||
// here is the decoded JWT token:
|
|
||||||
// {
|
|
||||||
// role: 'user',
|
|
||||||
// locationName: null,
|
|
||||||
// name: 'Jenny Rostock',
|
|
||||||
// about: null,
|
|
||||||
// avatar: 'https://s3.amazonaws.com/uifaces/faces/twitter/sasha_shestakov/128.jpg',
|
|
||||||
// id: 'u3',
|
|
||||||
// email: 'user@example.org',
|
|
||||||
// slug: 'jenny-rostock',
|
|
||||||
// iat: 1550846680,
|
|
||||||
// exp: 1637246680,
|
|
||||||
// aud: 'http://localhost:3000',
|
|
||||||
// iss: 'http://localhost:4000',
|
|
||||||
// sub: 'u3'
|
|
||||||
// }
|
|
||||||
// !!! if the token expires go into the GraphQL Playground in the browser at 'http://localhost:4000' with a running backend and a seeded Neo4j database
|
|
||||||
// now do the login mutation:
|
|
||||||
// mutation {
|
|
||||||
// login(email:"user@example.org", password:"1234")
|
|
||||||
// }
|
|
||||||
// replace this token here with the one you received as the result
|
|
||||||
export const validAuthorizationHeader =
|
|
||||||
'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6InUzIiwibmFtZSI6Ikplbm55IFJvc3RvY2siLCJzbHVnIjoiamVubnktcm9zdG9jayIsImlhdCI6MTYzNzY0NDMwMCwiZXhwIjoxNzAwNzU5NTAwLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjQwMDAiLCJzdWIiOiJ1MyJ9.ispIfRfgkXuYoIhKx7x2jPxgvHDJVv1ogMycLmfUnsk'
|
|
||||||
|
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
await cleanDatabase()
|
await cleanDatabase()
|
||||||
})
|
})
|
||||||
@ -75,14 +51,8 @@ describe('decode', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
describe('given valid JWT Bearer token', () => {
|
describe('given valid JWT Bearer token', () => {
|
||||||
beforeEach(() => {
|
|
||||||
authorizationHeader = validAuthorizationHeader
|
|
||||||
})
|
|
||||||
|
|
||||||
it('returns null', returnsNull)
|
|
||||||
|
|
||||||
describe('and corresponding user in the database', () => {
|
describe('and corresponding user in the database', () => {
|
||||||
let user
|
let user, validAuthorizationHeader
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
user = await Factory.build(
|
user = await Factory.build(
|
||||||
'user',
|
'user',
|
||||||
@ -99,10 +69,11 @@ describe('decode', () => {
|
|||||||
email: 'user@example.org',
|
email: 'user@example.org',
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
validAuthorizationHeader = encode(await user.toJson())
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns user object without email', async () => {
|
it('returns user object without email', async () => {
|
||||||
await expect(decode(driver, authorizationHeader)).resolves.toMatchObject({
|
await expect(decode(driver, validAuthorizationHeader)).resolves.toMatchObject({
|
||||||
role: 'user',
|
role: 'user',
|
||||||
name: 'Jenny Rostock',
|
name: 'Jenny Rostock',
|
||||||
id: 'u3',
|
id: 'u3',
|
||||||
@ -113,7 +84,7 @@ describe('decode', () => {
|
|||||||
it('sets `lastActiveAt`', async () => {
|
it('sets `lastActiveAt`', async () => {
|
||||||
let user = await neode.first('User', { id: 'u3' })
|
let user = await neode.first('User', { id: 'u3' })
|
||||||
await expect(user.toJson()).resolves.not.toHaveProperty('lastActiveAt')
|
await expect(user.toJson()).resolves.not.toHaveProperty('lastActiveAt')
|
||||||
await decode(driver, authorizationHeader)
|
await decode(driver, validAuthorizationHeader)
|
||||||
user = await neode.first('User', { id: 'u3' })
|
user = await neode.first('User', { id: 'u3' })
|
||||||
await expect(user.toJson()).resolves.toMatchObject({
|
await expect(user.toJson()).resolves.toMatchObject({
|
||||||
lastActiveAt: expect.any(String),
|
lastActiveAt: expect.any(String),
|
||||||
@ -129,7 +100,7 @@ describe('decode', () => {
|
|||||||
await expect(user.toJson()).resolves.toMatchObject({
|
await expect(user.toJson()).resolves.toMatchObject({
|
||||||
lastActiveAt: '2019-10-03T23:33:08.598Z',
|
lastActiveAt: '2019-10-03T23:33:08.598Z',
|
||||||
})
|
})
|
||||||
await decode(driver, authorizationHeader)
|
await decode(driver, validAuthorizationHeader)
|
||||||
user = await neode.first('User', { id: 'u3' })
|
user = await neode.first('User', { id: 'u3' })
|
||||||
await expect(user.toJson()).resolves.toMatchObject({
|
await expect(user.toJson()).resolves.toMatchObject({
|
||||||
// should be a different time by now ;)
|
// should be a different time by now ;)
|
||||||
@ -152,6 +123,15 @@ describe('decode', () => {
|
|||||||
|
|
||||||
it('returns null', returnsNull)
|
it('returns null', returnsNull)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
describe('and NO corresponding user in the database', () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
await cleanDatabase()
|
||||||
|
authorizationHeader = validAuthorizationHeader
|
||||||
|
})
|
||||||
|
|
||||||
|
it('returns null', returnsNull)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -14,9 +14,9 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
2. In a second step we will make our prototype publicly available with an advanced feature set including the technology and organizational structure to drive a bigger public social network.
|
2. In a second step we will make our prototype publicly available with an advanced feature set including the technology and organizational structure to drive a bigger public social network.
|
||||||
3. In a third step all the remaining features will be implemented to build the full product.
|
3. In a third step all the remaining features will be implemented to build the full product.
|
||||||
|
|
||||||
### User Account
|
The implemented features can be found [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/e2e)
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/user_account)
|
### User Account
|
||||||
|
|
||||||
* Sign-up
|
* Sign-up
|
||||||
* Agree to Data Privacy Statement
|
* Agree to Data Privacy Statement
|
||||||
@ -34,8 +34,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### User Profile
|
### User Profile
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/user_profile)
|
|
||||||
|
|
||||||
* Upload and Change Avatar
|
* Upload and Change Avatar
|
||||||
* Upload and Change Profile Picture
|
* Upload and Change Profile Picture
|
||||||
* Edit Social Media Accounts
|
* Edit Social Media Accounts
|
||||||
@ -46,8 +44,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Dashboard
|
### Dashboard
|
||||||
|
|
||||||
[Clickdummy](https://preview.uxpin.com/24a2ab8adcd84f9a763d87ed27251351225e0ecd#/pages/99768919/simulate/sitemap?mode=i)
|
|
||||||
|
|
||||||
* Show Link to own Profile
|
* Show Link to own Profile
|
||||||
* Show Friends Widget
|
* Show Friends Widget
|
||||||
* Show Favorites Widget
|
* Show Favorites Widget
|
||||||
@ -59,8 +55,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Posts
|
### Posts
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/post)
|
|
||||||
|
|
||||||
* Creating Posts
|
* Creating Posts
|
||||||
* Persistent Links
|
* Persistent Links
|
||||||
* Upload Teaser Picture for Post
|
* Upload Teaser Picture for Post
|
||||||
@ -85,8 +79,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Notifications
|
### Notifications
|
||||||
|
|
||||||
[Cucumber features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/notifications)
|
|
||||||
|
|
||||||
* User @-mentionings
|
* User @-mentionings
|
||||||
* Notify authors for comments
|
* Notify authors for comments
|
||||||
* Administrative notifications to all users
|
* Administrative notifications to all users
|
||||||
@ -108,8 +100,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Blacklist
|
### Blacklist
|
||||||
|
|
||||||
[Video](https://www.youtube.com/watch?v=-uDvvmN8hLQ)
|
|
||||||
|
|
||||||
* Blacklist Users
|
* Blacklist Users
|
||||||
* Blacklist specific Terms
|
* Blacklist specific Terms
|
||||||
* Blacklist Tags
|
* Blacklist Tags
|
||||||
@ -117,8 +107,6 @@ The following features will be implemented. This gets done in three steps:
|
|||||||
|
|
||||||
### Search
|
### Search
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/search)
|
|
||||||
|
|
||||||
* Search for Categories
|
* Search for Categories
|
||||||
* Search for Tags
|
* Search for Tags
|
||||||
* Fulltext Search
|
* Fulltext Search
|
||||||
@ -238,8 +226,6 @@ Shows automatically related actions for existing post.
|
|||||||
|
|
||||||
### Moderation
|
### Moderation
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/moderation)
|
|
||||||
|
|
||||||
* Report Button for users for doubtful Content
|
* Report Button for users for doubtful Content
|
||||||
* Moderator Panel
|
* Moderator Panel
|
||||||
* List of reported Content \(later replaced by User-Moderation\)
|
* List of reported Content \(later replaced by User-Moderation\)
|
||||||
@ -250,8 +236,6 @@ Shows automatically related actions for existing post.
|
|||||||
|
|
||||||
### Administration
|
### Administration
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/administration)
|
|
||||||
|
|
||||||
* Provide Admin-Interface to send Users Invite Code
|
* Provide Admin-Interface to send Users Invite Code
|
||||||
* Static Pages for Data Privacy Statement ...
|
* Static Pages for Data Privacy Statement ...
|
||||||
* Create, edit and delete Announcements
|
* Create, edit and delete Announcements
|
||||||
@ -265,8 +249,6 @@ Shows automatically related actions for existing post.
|
|||||||
|
|
||||||
### Internationalization
|
### Internationalization
|
||||||
|
|
||||||
[Cucumber Features](https://github.com/Ocelot-Social-Community/Ocelot-Social/tree/master/cypress/integration/internationalization)
|
|
||||||
|
|
||||||
* Frontend UI
|
* Frontend UI
|
||||||
* Backend Error Messages
|
* Backend Error Messages
|
||||||
|
|
||||||
|
|||||||
@ -9,8 +9,6 @@
|
|||||||
$ export DOCKER_DEFAULT_PLATFORM=linux/amd64
|
$ export DOCKER_DEFAULT_PLATFORM=linux/amd64
|
||||||
```
|
```
|
||||||
|
|
||||||
For even more informations, see [Docker More Closely](#docker-more-closely)
|
|
||||||
|
|
||||||
### Docker Compose Override File For Apple M1 Platform
|
### Docker Compose Override File For Apple M1 Platform
|
||||||
|
|
||||||
For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform:
|
For Docker compose `up` or `build` commands, you can use our Apple M1 override file that specifies the M1 platform:
|
||||||
@ -27,7 +25,3 @@ $ docker compose -f docker-compose.ocelotsocial-branded.yml -f docker-compose.ap
|
|||||||
# only once: init admin user and create indexes and constraints in Neo4j database
|
# only once: init admin user and create indexes and constraints in Neo4j database
|
||||||
$ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
|
$ docker compose exec backend /bin/sh -c "yarn prod:migrate init"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Docker More Closely In Main Code
|
|
||||||
|
|
||||||
To get more informations about the Apple M1 platform and to analyze the Docker builds etc. you find our documentation in our main code, [here](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/DOCKER_MORE_CLOSELY.md).
|
|
||||||
|
|||||||
@ -10,17 +10,19 @@ The forked original repository is [stage.ocelot.social](https://github.com/Ocelo
|
|||||||
|
|
||||||
<!-- markdownlint-disable MD033 -->
|
<!-- markdownlint-disable MD033 -->
|
||||||
<p align="center">
|
<p align="center">
|
||||||
<a href="https://ocelot.social" target="_blank"><img src="../webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%"></a>
|
<!-- <a href="https://ocelot.social" target="_blank"> -->
|
||||||
|
<img src="../webapp/static/img/custom/logo-squared.svg" alt="ocelot.social" width="40%" height="40%">
|
||||||
|
<!-- </a> -->
|
||||||
</p>
|
</p>
|
||||||
<!-- markdownlint-enable MD033 -->
|
<!-- markdownlint-enable MD033 -->
|
||||||
|
|
||||||
## Live demo
|
## Live demo
|
||||||
|
|
||||||
__Try out our deployed [development environment](https://stage.ocelot.social).__
|
__Try out our deployed <!-- [ -->development environment<!-- ](https://stage.ocelot.social)-->.__
|
||||||
|
|
||||||
Visit our staging networks:
|
Visit our staging networks:
|
||||||
|
|
||||||
- central staging network: [stage.ocelot.social](https://stage.ocelot.social)
|
- central staging network: <!-- [ -->stage.ocelot.social<!-- ](https://stage.ocelot.social)-->
|
||||||
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
<!-- - rebranded staging network: [rebrand.ocelot.social](https://stage.ocelot.social). -->
|
||||||
|
|
||||||
Logins:
|
Logins:
|
||||||
@ -41,14 +43,16 @@ Write your own data into the main configuration file:
|
|||||||
|
|
||||||
- [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json)
|
- [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json)
|
||||||
|
|
||||||
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](/package.json) file as your `dockerOrganisation`.
|
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json) file as your `dockerOrganisation`.
|
||||||
|
|
||||||
### Configure And Branding
|
### Configure And Branding
|
||||||
|
|
||||||
The next step is:
|
The next step is:
|
||||||
|
|
||||||
- [Set Environment Variables and Configurations](./deployment-values.md)
|
- [Set Environment Variables and Configurations](./deployment-values.md)
|
||||||
|
<!-- markdown-link-check-disable -->
|
||||||
- [Configure And Branding](./configurations/stage.ocelot.social/branding/README.md)
|
- [Configure And Branding](./configurations/stage.ocelot.social/branding/README.md)
|
||||||
|
<!-- markdown-link-check-enable -->
|
||||||
|
|
||||||
### Optional: Locally Testing Configuration And Branding
|
### Optional: Locally Testing Configuration And Branding
|
||||||
|
|
||||||
@ -71,7 +75,7 @@ For the maintenance page have a look in your browser at `http://localhost:5000/`
|
|||||||
|
|
||||||
### Push Changes To GitHub
|
### Push Changes To GitHub
|
||||||
|
|
||||||
Before merging these changes into the "master" branch on your GitHub fork repository, you need to configure the GitHub repository secrets. This is necessary to [publish](../.github/workflows/publish.yml) the Docker images by pushing them via GitHub actions to repositories belonging to your DockerHub organisation.
|
Before merging these changes into the "master" branch on your GitHub fork repository, you need to configure the GitHub repository secrets. This is necessary to [publish](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/.github/workflows/publish.yml) the Docker images by pushing them via GitHub actions to repositories belonging to your DockerHub organisation.
|
||||||
|
|
||||||
First, go to your DockerHub profile under `Account Settings` and click on the `Security` tab. There you create an access token called `<your-organisation>-access-token` and copy the token to a safe place.
|
First, go to your DockerHub profile under `Account Settings` and click on the `Security` tab. There you create an access token called `<your-organisation>-access-token` and copy the token to a safe place.
|
||||||
|
|
||||||
@ -131,7 +135,6 @@ Browser compatibility testing with [BrowserStack](https://www.browserstack.com/)
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
See the [LICENSE](../LICENSE.md) file for license rights and limitations (MIT).
|
See the [LICENSE](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/LICENSE.md) file for license rights and limitations (MIT).
|
||||||
|
|
||||||
|
|
||||||
We need `DOCKER_BUILDKIT=0` for this to work.
|
We need `DOCKER_BUILDKIT=0` for this to work.
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
Subproject commit fdc2e52fa444b300e1c4736600bc0e9ae3314222
|
Subproject commit a930f11d8f2d0c11136ff0bf9188aaab9cabc5d1
|
||||||
@ -4,8 +4,8 @@ Before you start the deployment you have to do preparations.
|
|||||||
|
|
||||||
## Deployment Preparations
|
## Deployment Preparations
|
||||||
|
|
||||||
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json) file as your `dockerOrganisation`.
|
Since all deployment methods described here depend on [Docker](https://docker.com) and [DockerHub](https://hub.docker.com), you need to create your own organisation on DockerHub and put its name in the [package.json](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/package.json) file as your `dockerOrganisation`.
|
||||||
Read more details in the [main README](./README.md) under [Usage](./README.md#usage).
|
Read more details in the [main README](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md) under [Usage](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/README.md#usage).
|
||||||
|
|
||||||
## Deployment Methods
|
## Deployment Methods
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# !!! never tested !!!
|
|
||||||
|
|
||||||
# base setup
|
# base setup
|
||||||
SCRIPT_PATH=$(realpath $0)
|
SCRIPT_PATH=$(realpath $0)
|
||||||
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
|
SCRIPT_DIR=$(dirname $SCRIPT_PATH)
|
||||||
@ -35,7 +33,7 @@ helm install \
|
|||||||
--kubeconfig=${KUBECONFIG} \
|
--kubeconfig=${KUBECONFIG} \
|
||||||
--namespace cert-manager \
|
--namespace cert-manager \
|
||||||
--create-namespace \
|
--create-namespace \
|
||||||
--version v1.13.1 \
|
--version v1.13.2 \
|
||||||
--set installCRDs=true
|
--set installCRDs=true
|
||||||
|
|
||||||
## install Ocelot with helm
|
## install Ocelot with helm
|
||||||
|
|||||||
@ -76,7 +76,7 @@ $ helm install \
|
|||||||
cert-manager jetstack/cert-manager \
|
cert-manager jetstack/cert-manager \
|
||||||
--namespace cert-manager \
|
--namespace cert-manager \
|
||||||
--create-namespace \
|
--create-namespace \
|
||||||
--version v1.13.1 \
|
--version v1.13.2 \
|
||||||
--set installCRDs=true
|
--set installCRDs=true
|
||||||
# or kubeconfig.yaml in your repo, then adjust
|
# or kubeconfig.yaml in your repo, then adjust
|
||||||
$ helm install \
|
$ helm install \
|
||||||
@ -84,7 +84,7 @@ $ helm install \
|
|||||||
--kubeconfig ./kubeconfig.yaml \
|
--kubeconfig ./kubeconfig.yaml \
|
||||||
--namespace cert-manager \
|
--namespace cert-manager \
|
||||||
--create-namespace \
|
--create-namespace \
|
||||||
--version v1.13.1 \
|
--version v1.13.2 \
|
||||||
--set installCRDs=true
|
--set installCRDs=true
|
||||||
``` -->
|
``` -->
|
||||||
|
|
||||||
@ -282,7 +282,7 @@ helm uninstall ocelot \
|
|||||||
|
|
||||||
You can and should do [backups](./Backup.md) with Kubernetes for sure.
|
You can and should do [backups](./Backup.md) with Kubernetes for sure.
|
||||||
|
|
||||||
## Error Reporting
|
<!-- ## Error Reporting
|
||||||
|
|
||||||
We use [Sentry](https://github.com/getsentry/sentry) for error reporting in both
|
We use [Sentry](https://github.com/getsentry/sentry) for error reporting in both
|
||||||
our backend and web frontend. You can either use a hosted or a self-hosted
|
our backend and web frontend. You can either use a hosted or a self-hosted
|
||||||
@ -297,7 +297,7 @@ If you are lucky enough to have a kubernetes cluster with the required hardware
|
|||||||
support, try this [helm chart](https://github.com/helm/charts/tree/master/stable/sentry).
|
support, try this [helm chart](https://github.com/helm/charts/tree/master/stable/sentry).
|
||||||
|
|
||||||
On our kubernetes cluster we get "mult-attach" errors for persistent volumes.
|
On our kubernetes cluster we get "mult-attach" errors for persistent volumes.
|
||||||
Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements.
|
Apparently DigitalOcean's kubernetes clusters do not fulfill the requirements. -->
|
||||||
|
|
||||||
## Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster
|
## Kubernetes Commands (Without Helm) To Deploy New Docker Images To A Kubernetes Cluster
|
||||||
|
|
||||||
|
|||||||
@ -23,13 +23,12 @@ CAUTION: It seems that the behaviour of DigitalOcean has changed and the load ba
|
|||||||
And to create a load balancer costs money. Please refine the following documentation if required.
|
And to create a load balancer costs money. Please refine the following documentation if required.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Without Load Balancer" %}
|
@tab:active Without Load Balancer
|
||||||
|
|
||||||
A solution without a load balance you can find [here](../no-loadbalancer/README.md).
|
A solution without a load balance you can find [here](../no-loadbalancer/README.md).
|
||||||
|
|
||||||
{% endtab %}
|
@tab With DigitalOcean Load Balancer
|
||||||
{% tab title="With DigitalOcean Load Balancer" %}
|
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore.
|
CAUTION: It seems that the behaviour of DigitalOcean has changed and the load balancer is not created automatically anymore.
|
||||||
@ -44,8 +43,7 @@ address. On DigitalOcean, this is how it should look like:
|
|||||||
If the load balancer isn't created automatically you have to create it your self on DigitalOcean under Networks.
|
If the load balancer isn't created automatically you have to create it your self on DigitalOcean under Networks.
|
||||||
In case you don't need a DigitalOcean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`.
|
In case you don't need a DigitalOcean load balancer (which costs money by the way) have a look in the tab `Without Load Balancer`.
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
Check the ingress server is working correctly:
|
Check the ingress server is working correctly:
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,6 @@
|
|||||||
# Edit this Documentation
|
# Documentation
|
||||||
|
|
||||||
|
## Edit this Documentation
|
||||||
|
|
||||||
Find the [**table of contents** for this documentation on GitHub](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/SUMMARY.md) and navigate to the file you need to update.
|
Find the [**table of contents** for this documentation on GitHub](https://github.com/Ocelot-Social-Community/Ocelot-Social/blob/master/SUMMARY.md) and navigate to the file you need to update.
|
||||||
|
|
||||||
@ -10,15 +12,15 @@ If you are ready, fill in the **Propose file change** at the end of the webpage.
|
|||||||
|
|
||||||
After that you have to compare your change branch to our `master` branch with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our [open issues](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) please include the number.)
|
After that you have to compare your change branch to our `master` branch with a pull request. Here make a comment which issue you have fixed. (If you are working on one of our [open issues](https://github.com/Ocelot-Social-Community/Ocelot-Social/issues) please include the number.)
|
||||||
|
|
||||||
## Markdown your documentation
|
### Markdown your documentation
|
||||||
|
|
||||||
To design your documentation see the syntax description at GitBook:
|
To design your documentation see the syntax description at GitBook:
|
||||||
|
|
||||||
[https://toolchain.gitbook.com/syntax/markdown.html](https://toolchain.gitbook.com/syntax/markdown.html)
|
[https://toolchain.gitbook.com/syntax/markdown.html](https://toolchain.gitbook.com/syntax/markdown.html)
|
||||||
|
|
||||||
### Some quick Examples
|
#### Some quick Examples
|
||||||
|
|
||||||
#### Headlines
|
##### Headlines
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
# Main Headline
|
# Main Headline
|
||||||
@ -26,21 +28,19 @@ To design your documentation see the syntax description at GitBook:
|
|||||||
### Small Headlines
|
### Small Headlines
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Tabs
|
##### Tabs
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="XXX" %}
|
@tab:active First tab's title <!-- this tab is setactive -->
|
||||||
XXX
|
|
||||||
{% endtab %}
|
@tab Second tab's title
|
||||||
{% tab title="XXX" %}
|
|
||||||
XXX
|
:::
|
||||||
{% endtab %}
|
|
||||||
…
|
|
||||||
{% endtabs %}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Commands
|
|
||||||
|
##### Commands
|
||||||
|
|
||||||
~~~markdown
|
~~~markdown
|
||||||
```<LANGUAGE> (for text highlighting)
|
```<LANGUAGE> (for text highlighting)
|
||||||
@ -48,33 +48,34 @@ XXX
|
|||||||
```
|
```
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
#### Links
|
##### Links
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
[XXX](https://XXX)
|
[XXX](https://XXX)
|
||||||
```
|
```
|
||||||
|
For the documentation to work in both frameworks - Github and Vuepress - please use absolute path for Github internal documentation links (e.g. /README.md over ../../README.mdetc.)
|
||||||
|
|
||||||
#### Screenshots or other Images
|
##### Screenshots or other Images
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||

|

|
||||||
```
|
```
|
||||||
|
|
||||||
#### Hints for ToDos
|
##### Hints for ToDos
|
||||||
|
|
||||||
```markdown
|
```markdown
|
||||||
{% hint style="info" %} TODO: XXX {% endhint %}
|
{% hint style="info" %} TODO: XXX {% endhint %}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Host the Screenshots
|
### Host the Screenshots
|
||||||
|
|
||||||
### Host on Ocelot-Social \(GitHub\) Repository
|
#### Host on Ocelot-Social \(GitHub\) Repository
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: How to host on Ocelot-Social \(GitHub\) repository ...
|
TODO: How to host on Ocelot-Social \(GitHub\) repository ...
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### Quick Solution
|
#### Quick Solution
|
||||||
|
|
||||||
To quickly host the screenshots go to:
|
To quickly host the screenshots go to:
|
||||||
|
|
||||||
@ -88,27 +89,41 @@ Right click on it and choose kind of **Open link in new tab**.
|
|||||||
|
|
||||||
Copy the URL and paste it were you need it.
|
Copy the URL and paste it were you need it.
|
||||||
|
|
||||||
## Screenshot Modification
|
### Screenshot Modification
|
||||||
|
|
||||||
### Add an Arrow or some other Marking Stuff
|
#### Add an Arrow or some other Marking Stuff
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="macOS" %}
|
@tab:active macOS
|
||||||
|
|
||||||
#### In the Preview App
|
##### In the Preview App
|
||||||
|
|
||||||
Got to: **Menu** + **Tools** \(GER: Werkzeuge\) + **Annotate** \(GER: Anmerkungen\) + etc.
|
Got to: **Menu** + **Tools** \(GER: Werkzeuge\) + **Annotate** \(GER: Anmerkungen\) + etc.
|
||||||
{% endtab %}
|
|
||||||
|
|
||||||
{% tab title="Windows" %}
|
@tab Windows
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: How to modify screenshots in Windows ...
|
TODO: How to modify screenshots in Windows ...
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
{% endtab %}
|
{% endtab %}
|
||||||
|
|
||||||
{% tab title="Linux" %}
|
@tab Linux
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: How to modify screenshots in Linux ...
|
TODO: How to modify screenshots in Linux ...
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
## Deploy this Documentation
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# set configured Node version
|
||||||
|
nvm use
|
||||||
|
|
||||||
|
# install Vuepress
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# run vuepress
|
||||||
|
npm run docs:dev
|
||||||
|
```
|
||||||
@ -88,7 +88,7 @@ $ docker cp <local-folder-path>/neo4j-dump <docker-image-name('neo4j')>:/var/lib
|
|||||||
# connect to the Docker containers Neo4j terminal
|
# connect to the Docker containers Neo4j terminal
|
||||||
$ docker exec -it neo4j bash
|
$ docker exec -it neo4j bash
|
||||||
# to load the dump into the database we need the following command in this terminal
|
# to load the dump into the database we need the following command in this terminal
|
||||||
neo4j% neo4j-admin load --expand-commands --database=graph.db --from /var/lib/neo4j/$(date +%F)-neo4j-dump --force
|
neo4j% neo4j-admin load --database=neo4j --from /var/lib/neo4j/$(date +%F)-neo4j-dump --force
|
||||||
# leave the terminal by entering
|
# leave the terminal by entering
|
||||||
neo4j% exit
|
neo4j% exit
|
||||||
```
|
```
|
||||||
|
|||||||
16644
package-lock.json
generated
Normal file
16644
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
24
package.json
24
package.json
@ -4,7 +4,6 @@
|
|||||||
"description": "Free and open source software program code available to run social networks.",
|
"description": "Free and open source software program code available to run social networks.",
|
||||||
"author": "ocelot.social Community",
|
"author": "ocelot.social Community",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"private": false,
|
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/Ocelot-Social-Community/Ocelot-Social.git"
|
"url": "https://github.com/Ocelot-Social-Community/Ocelot-Social.git"
|
||||||
@ -27,24 +26,24 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"db:seed": "cd backend && yarn run db:seed",
|
"db:seed": "cd backend && yarn run db:seed",
|
||||||
"db:reset": "cd backend && yarn run db:reset",
|
"db:reset": "cd backend && yarn run db:reset",
|
||||||
|
"docs:build": "NODE_OPTIONS=--openssl-legacy-provider vuepress build .",
|
||||||
|
"docs:dev": "NODE_OPTIONS=--openssl-legacy-provider vuepress dev .",
|
||||||
"cypress:run": "cypress run --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
"cypress:run": "cypress run --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
||||||
"cypress:open": "cypress open --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
"cypress:open": "cypress open --e2e --browser electron --config-file ./cypress/cypress.config.js",
|
||||||
"cucumber:setup": "cd backend && yarn run dev",
|
|
||||||
"cucumber": "wait-on tcp:4000 && cucumber-js --require-module @babel/register --exit",
|
|
||||||
"release": "yarn version --no-git-tag-version --no-commit-hooks --no-commit && auto-changelog --latest-version $(node -p -e \"require('./package.json').version\") && cd backend && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp/maintenance/source && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../../../package.json').version\")"
|
"release": "yarn version --no-git-tag-version --no-commit-hooks --no-commit && auto-changelog --latest-version $(node -p -e \"require('./package.json').version\") && cd backend && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../package.json').version\") && cd ../webapp/maintenance/source && yarn version --no-git-tag-version --no-commit-hooks --no-commit --new-version $(node -p -e \"require('./../../../package.json').version\")"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@babel/core": "^7.23.2",
|
"@babel/core": "^7.23.3",
|
||||||
"@babel/preset-env": "^7.23.2",
|
"@babel/preset-env": "^7.23.3",
|
||||||
"@babel/register": "^7.22.15",
|
"@babel/register": "^7.22.15",
|
||||||
"@badeball/cypress-cucumber-preprocessor": "^19.0.0",
|
"@badeball/cypress-cucumber-preprocessor": "^19.1.1",
|
||||||
"@cypress/browserify-preprocessor": "^3.0.2",
|
"@cypress/browserify-preprocessor": "^3.0.2",
|
||||||
"@faker-js/faker": "8.2.0",
|
"@cucumber/cucumber": "10.0.1",
|
||||||
|
"@faker-js/faker": "8.3.1",
|
||||||
"auto-changelog": "^2.3.0",
|
"auto-changelog": "^2.3.0",
|
||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^7.0.3",
|
||||||
"cucumber": "^6.0.5",
|
"cypress": "^13.6.0",
|
||||||
"cypress": "^13.4.0",
|
|
||||||
"cypress-network-idle": "^1.14.2",
|
"cypress-network-idle": "^1.14.2",
|
||||||
"date-fns": "^2.25.0",
|
"date-fns": "^2.25.0",
|
||||||
"dotenv": "^16.3.1",
|
"dotenv": "^16.3.1",
|
||||||
@ -58,7 +57,12 @@
|
|||||||
"neode": "^0.4.8",
|
"neode": "^0.4.8",
|
||||||
"rosie": "^2.1.0",
|
"rosie": "^2.1.0",
|
||||||
"slug": "^8.2.3",
|
"slug": "^8.2.3",
|
||||||
"wait-on": "^7.0.1"
|
"wait-on": "^7.2.0"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"vuepress": "^2.0.0-rc.0",
|
||||||
|
"vuepress-plugin-search-pro": "^2.0.0-rc.0",
|
||||||
|
"vuepress-theme-hope": "^2.0.0-rc.0"
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"set-value": "^2.0.1",
|
"set-value": "^2.0.1",
|
||||||
|
|||||||
@ -59,8 +59,8 @@ We ensure the quality of our frontend code by using
|
|||||||
|
|
||||||
For more information see our [frontend testing guide](testing.md). Use these commands to run the tests:
|
For more information see our [frontend testing guide](testing.md). Use these commands to run the tests:
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="With Docker" %}
|
@tab:active With Docker
|
||||||
|
|
||||||
After starting the application following the above guidelines, open new terminal windows for each of these commands:
|
After starting the application following the above guidelines, open new terminal windows for each of these commands:
|
||||||
|
|
||||||
@ -81,9 +81,7 @@ $ docker-compose exec webapp yarn storybook
|
|||||||
|
|
||||||
You can then visit the Storybook playground on `http://localhost:3002`
|
You can then visit the Storybook playground on `http://localhost:3002`
|
||||||
|
|
||||||
{% endtab %}
|
@tab title Without Docker
|
||||||
|
|
||||||
{% tab title="Without Docker" %}
|
|
||||||
|
|
||||||
After starting the application following the above guidelines, open new terminal windows and navigate to the `/webapp` directory for each of these commands:
|
After starting the application following the above guidelines, open new terminal windows and navigate to the `/webapp` directory for each of these commands:
|
||||||
|
|
||||||
@ -109,8 +107,7 @@ $ yarn storybook
|
|||||||
|
|
||||||
You can then visit the Storybook playground on `http://localhost:3002`
|
You can then visit the Storybook playground on `http://localhost:3002`
|
||||||
|
|
||||||
{% endtab %}
|
:::
|
||||||
{% endtabs %}
|
|
||||||
|
|
||||||
## Maintenance Mode
|
## Maintenance Mode
|
||||||
|
|
||||||
|
|||||||
@ -8,8 +8,8 @@ The maintenance mode shows a translatable page that tells the user that we are r
|
|||||||
|
|
||||||
At the moment the maintenance mode can only be locally tested with Docker-Compose.
|
At the moment the maintenance mode can only be locally tested with Docker-Compose.
|
||||||
|
|
||||||
{% tabs %}
|
::: tabs
|
||||||
{% tab title="Locally Without Docker" %}
|
@tab:active Locally Without Docker
|
||||||
|
|
||||||
{% hint style="info" %}
|
{% hint style="info" %}
|
||||||
TODO: Implement a locally running maintenance mode! Without Docker …
|
TODO: Implement a locally running maintenance mode! Without Docker …
|
||||||
@ -25,8 +25,7 @@ $ yarn generate:maintenance
|
|||||||
… is unfortunatelly **not(!)** working at the moment.
|
… is unfortunatelly **not(!)** working at the moment.
|
||||||
This is because the code is rewritten to be easy usable for Docker-Compose. Therefore we lost this possibility.
|
This is because the code is rewritten to be easy usable for Docker-Compose. Therefore we lost this possibility.
|
||||||
|
|
||||||
{% endtab %}
|
@tab Locally With Docker
|
||||||
{% tab title="Locally With Docker" %}
|
|
||||||
|
|
||||||
To get the maintenance mode running use the command:
|
To get the maintenance mode running use the command:
|
||||||
|
|
||||||
@ -37,3 +36,5 @@ $ docker-compose up
|
|||||||
|
|
||||||
And the maintenance mode page or service will be started as well in an own container.
|
And the maintenance mode page or service will be started as well in an own container.
|
||||||
In the browser you can reach it under `http://localhost:3001/`.
|
In the browser you can reach it under `http://localhost:3001/`.
|
||||||
|
|
||||||
|
:::
|
||||||
|
|||||||
@ -32,7 +32,7 @@
|
|||||||
"apollo-cache-inmemory": "~1.6.6",
|
"apollo-cache-inmemory": "~1.6.6",
|
||||||
"apollo-client": "~2.6.8",
|
"apollo-client": "~2.6.8",
|
||||||
"cookie-universal-nuxt": "~2.2.2",
|
"cookie-universal-nuxt": "~2.2.2",
|
||||||
"cropperjs": "^1.5.5",
|
"cropperjs": "^1.6.1",
|
||||||
"cross-env": "~7.0.3",
|
"cross-env": "~7.0.3",
|
||||||
"date-fns": "2.22.1",
|
"date-fns": "2.22.1",
|
||||||
"express": "~4.17.1",
|
"express": "~4.17.1",
|
||||||
|
|||||||
@ -8016,10 +8016,10 @@ create-react-context@^0.2.1:
|
|||||||
fbjs "^0.8.0"
|
fbjs "^0.8.0"
|
||||||
gud "^1.0.0"
|
gud "^1.0.0"
|
||||||
|
|
||||||
cropperjs@^1.5.5:
|
cropperjs@^1.6.1:
|
||||||
version "1.5.6"
|
version "1.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.5.6.tgz#82faf432bec709d828f2f7a96d1179198edaf0e2"
|
resolved "https://registry.yarnpkg.com/cropperjs/-/cropperjs-1.6.1.tgz#fd132021d93b824b1b0f2c2c3b763419fb792d89"
|
||||||
integrity sha512-eAgWf4j7sNJIG329qUHIFi17PSV0VtuWyAu9glZSgu/KlQSrfTQOC2zAz+jHGa5fAB+bJldEnQwvJEaJ8zRf5A==
|
integrity sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA==
|
||||||
|
|
||||||
cross-env@~7.0.3:
|
cross-env@~7.0.3:
|
||||||
version "7.0.3"
|
version "7.0.3"
|
||||||
@ -17486,6 +17486,7 @@ string-length@^4.0.1:
|
|||||||
strip-ansi "^6.0.0"
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3:
|
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.2.3:
|
||||||
|
name string-width-cjs
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
@ -17578,6 +17579,7 @@ string_decoder@~1.1.1:
|
|||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
|
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1:
|
||||||
|
name strip-ansi-cjs
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
@ -19562,6 +19564,7 @@ worker-farm@^1.7.0:
|
|||||||
errno "~0.1.7"
|
errno "~0.1.7"
|
||||||
|
|
||||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
||||||
|
name wrap-ansi-cjs
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user