mirror of
https://github.com/cudr/slate-collaborative.git
synced 2024-10-27 20:34:06 +00:00
Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
68f955ab73 | ||
|
12ae164ea1 | ||
|
12b8fc26bd | ||
|
c66c01ac07 | ||
|
ca8b4b741c |
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
33
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@ -1,33 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Create a report to help us improve
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Device (please complete the following information):**
|
|
||||||
- OS: [e.g. iOS]
|
|
||||||
- Browser [e.g. chrome, safari]
|
|
||||||
- Version of slate [e.g. 0.58.0]
|
|
||||||
- Version of slate-collaborative
|
|
||||||
|
|
||||||
**Describe the bug**
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
**To Reproduce**
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
**Expected behavior**
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
**Screenshots**
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context about the problem here.
|
|
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@ -1,20 +0,0 @@
|
|||||||
---
|
|
||||||
name: Feature request
|
|
||||||
about: Suggest an idea for this project
|
|
||||||
title: ''
|
|
||||||
labels: ''
|
|
||||||
assignees: ''
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Is your feature request related to a problem? Please describe.**
|
|
||||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
||||||
|
|
||||||
**Describe the solution you'd like**
|
|
||||||
A clear and concise description of what you want to happen.
|
|
||||||
|
|
||||||
**Describe alternatives you've considered**
|
|
||||||
A clear and concise description of any alternative solutions or features you've considered.
|
|
||||||
|
|
||||||
**Additional context**
|
|
||||||
Add any other context or screenshots about the feature request here.
|
|
61
CHANGELOG.md
61
CHANGELOG.md
@ -1,65 +1,12 @@
|
|||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
|
||||||
|
|
||||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||||
|
|
||||||
#### [v0.7.2](https://github.com/cudr/slate-collaborative/compare/v0.7.1...v0.7.2)
|
#### [v0.6.3](https://github.com/cudr/slate-collaborative/compare/v0.6.3...v0.6.3)
|
||||||
|
|
||||||
> 18 January 2021
|
> 21 June 2020
|
||||||
|
|
||||||
- fix dependency update [`#50`](https://github.com/cudr/slate-collaborative/pull/50)
|
|
||||||
- Fix split_node missing properties bug. [`#45`](https://github.com/cudr/slate-collaborative/pull/45)
|
|
||||||
- Always call external onChange. [`#43`](https://github.com/cudr/slate-collaborative/pull/43)
|
|
||||||
- Fix setNodes undefined value since automerge does not handle undefined value correctly. [`#49`](https://github.com/cudr/slate-collaborative/pull/49)
|
|
||||||
- Fix destory [`#48`](https://github.com/cudr/slate-collaborative/pull/48)
|
|
||||||
- Fix cursor delete [`#44`](https://github.com/cudr/slate-collaborative/pull/44)
|
|
||||||
- build(deps): bump react from 16.14.0 to 17.0.1 [`#40`](https://github.com/cudr/slate-collaborative/pull/40)
|
|
||||||
- build(deps-dev): bump husky from 3.1.0 to 4.3.6 [`#46`](https://github.com/cudr/slate-collaborative/pull/46)
|
|
||||||
- build(deps): bump @types/node from 12.7.5 to 14.14.6 [`#42`](https://github.com/cudr/slate-collaborative/pull/42)
|
|
||||||
- build(deps-dev): bump ts-jest from 25.5.1 to 26.4.4 [`#41`](https://github.com/cudr/slate-collaborative/pull/41)
|
|
||||||
- build(deps): bump react-dom from 16.14.0 to 17.0.1 [`#39`](https://github.com/cudr/slate-collaborative/pull/39)
|
|
||||||
- build(deps-dev): bump @commitlint/cli from 9.1.2 to 11.0.0 [`#38`](https://github.com/cudr/slate-collaborative/pull/38)
|
|
||||||
- build(deps): bump slate-react from 0.58.3 to 0.59.0 [`#37`](https://github.com/cudr/slate-collaborative/pull/37)
|
|
||||||
- build(deps): bump slate from 0.58.3 to 0.59.0 [`#36`](https://github.com/cudr/slate-collaborative/pull/36)
|
|
||||||
- build(deps): bump faker from 4.1.0 to 5.1.0 [`#35`](https://github.com/cudr/slate-collaborative/pull/35)
|
|
||||||
- build(deps): bump nodemon from 1.19.4 to 2.0.6 [`#34`](https://github.com/cudr/slate-collaborative/pull/34)
|
|
||||||
- Update issue templates [`cc4449e`](https://github.com/cudr/slate-collaborative/commit/cc4449e6dd35fbf36675a5ac5a7bac61222dad06)
|
|
||||||
- feat: nodemon run example [`71ab42d`](https://github.com/cudr/slate-collaborative/commit/71ab42d5bec04b89819f51a85659a93587f1af67)
|
|
||||||
|
|
||||||
#### [v0.7.1](https://github.com/cudr/slate-collaborative/compare/v0.7.0...v0.7.1)
|
|
||||||
|
|
||||||
> 28 October 2020
|
|
||||||
|
|
||||||
- defensive code for when the document sometimes isn't there on server restarts. [`#26`](https://github.com/cudr/slate-collaborative/pull/26)
|
|
||||||
- fix: socket io namespace message broadcast [`ab3c36a`](https://github.com/cudr/slate-collaborative/commit/ab3c36ab7dd7f24059c5d0864735c5892df98028)
|
|
||||||
|
|
||||||
#### [v0.7.0](https://github.com/cudr/slate-collaborative/compare/v0.6.7...v0.7.0)
|
|
||||||
|
|
||||||
> 2 July 2020
|
|
||||||
|
|
||||||
- Preserve external history option [`#22`](https://github.com/cudr/slate-collaborative/pull/22)
|
|
||||||
- Generate auto-changelog [`#21`](https://github.com/cudr/slate-collaborative/pull/21)
|
|
||||||
- feat: take changelog version from bridge package [`45b8a16`](https://github.com/cudr/slate-collaborative/commit/45b8a16ef57e582a617c7f6284de697a90e16030)
|
|
||||||
|
|
||||||
#### [v0.6.7](https://github.com/cudr/slate-collaborative/compare/v0.6.6...v0.6.7)
|
|
||||||
|
|
||||||
> 22 June 2020
|
|
||||||
|
|
||||||
- feat: add license [`f5bd03c`](https://github.com/cudr/slate-collaborative/commit/f5bd03cf27a1c620c69e6823b433963aea84610e)
|
|
||||||
- feat: modify changelog template [`c40cdda`](https://github.com/cudr/slate-collaborative/commit/c40cdda45d478b733f195058ef7b239bbb476aeb)
|
|
||||||
|
|
||||||
#### [v0.6.6](https://github.com/cudr/slate-collaborative/compare/v0.6.5...v0.6.6)
|
|
||||||
|
|
||||||
> 22 June 2020
|
|
||||||
|
|
||||||
- feat: add auto-changelog [`73a363c`](https://github.com/cudr/slate-collaborative/commit/73a363c8b3c0839046c255774580143eee6e1ee8)
|
|
||||||
|
|
||||||
#### [v0.6.5](https://github.com/cudr/slate-collaborative/compare/v0.6.4...v0.6.5)
|
|
||||||
|
|
||||||
> 22 June 2020
|
|
||||||
|
|
||||||
#### [v0.6.4](https://github.com/cudr/slate-collaborative/compare/v0.6.3...v0.6.4)
|
|
||||||
|
|
||||||
> 22 June 2020
|
|
||||||
|
|
||||||
- feat: add auto-changelog [`c66c01a`](https://github.com/cudr/slate-collaborative/commit/c66c01ac07d6e3ca59db765f45ce53868e103f31)
|
- feat: add auto-changelog [`c66c01a`](https://github.com/cudr/slate-collaborative/commit/c66c01ac07d6e3ca59db765f45ce53868e103f31)
|
||||||
- feat: add auto-changelog [`ca8b4b7`](https://github.com/cudr/slate-collaborative/commit/ca8b4b741c79381e41319bf58a6980a30128be67)
|
- feat: add auto-changelog [`ca8b4b7`](https://github.com/cudr/slate-collaborative/commit/ca8b4b741c79381e41319bf58a6980a30128be67)
|
||||||
|
@ -31,7 +31,6 @@ Check [detailed example](https://github.com/cudr/slate-collaborative/blob/master
|
|||||||
onConnect?: () => void // connect callback
|
onConnect?: () => void // connect callback
|
||||||
onDisconnect?: () => void // disconnect callback
|
onDisconnect?: () => void // disconnect callback
|
||||||
onError?: (reason: string) => void // error callback
|
onError?: (reason: string) => void // error callback
|
||||||
preserveExternalHistory?: boolean // preserve slate-history operations form other clients
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
### Changelog
|
|
||||||
|
|
||||||
{{#unless options.hideCredit}}
|
|
||||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
|
||||||
{{/unless}}
|
|
||||||
|
|
||||||
{{#each releases}}
|
|
||||||
{{#if href}}
|
|
||||||
###{{#unless major}}#{{/unless}} [{{title}}]({{href}})
|
|
||||||
{{else}}
|
|
||||||
#### {{title}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if tag}}
|
|
||||||
> {{niceDate}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#if summary}}
|
|
||||||
{{summary}}
|
|
||||||
{{/if}}
|
|
||||||
|
|
||||||
{{#each merges}}
|
|
||||||
- {{#if commit.breaking}}**Breaking change:** {{/if}}{{message}}{{#if href}} [`#{{id}}`]({{href}}){{/if}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each fixes}}
|
|
||||||
- {{#if commit.breaking}}**Breaking change:** {{/if}}{{commit.subject}}{{#each fixes}}{{#if href}} [`#{{id}}`]({{href}}){{/if}}{{/each}}
|
|
||||||
{{/each}}
|
|
||||||
{{#each commits}}
|
|
||||||
- {{#if breaking}}**Breaking change:** {{/if}}{{subject}}{{#if href}} [`{{shorthash}}`]({{href}}){{/if}}
|
|
||||||
{{/each}}
|
|
||||||
|
|
||||||
{{/each}}
|
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"lerna": "2.7.1",
|
"lerna": "2.7.1",
|
||||||
"version": "0.7.2",
|
"version": "0.6.4",
|
||||||
"npmClient": "yarn",
|
"npmClient": "yarn",
|
||||||
"useWorkspaces": true
|
"useWorkspaces": true
|
||||||
}
|
}
|
||||||
|
12
package.json
12
package.json
@ -1,12 +1,11 @@
|
|||||||
{
|
{
|
||||||
"private": true,
|
"private": true,
|
||||||
"version": "0.7.1",
|
|
||||||
"description": "Slate collaborative plugin & microservice",
|
"description": "Slate collaborative plugin & microservice",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"bootstrap": "lerna bootstrap",
|
"bootstrap": "lerna bootstrap",
|
||||||
"changelog": "auto-changelog -p ./packages/bridge/package.json --template changelog-template.hbs && git add CHANGELOG.md",
|
"version": "auto-changelog -p && git add CHANGELOG.md",
|
||||||
"clean": "rimraf ./packages/**/lib/ && rimraf ./packages/**/tsconfig.tsbuildinfo && lerna clean --yes",
|
"clean": "rimraf ./packages/**/lib/ && rimraf ./packages/**/tsconfig.tsbuildinfo && lerna clean --yes",
|
||||||
"release": "yarn prebuild && yarn build && lerna version && lerna publish from-package && yarn changelog",
|
"release": "yarn version && yarn prebuild && yarn build && lerna publish from-package",
|
||||||
"deploy:site": "git subtree push --prefix packages/example heroku master",
|
"deploy:site": "git subtree push --prefix packages/example heroku master",
|
||||||
"dev": "lerna run --stream build:js && concurrently \"yarn watch\" \"lerna run dev --stream\"",
|
"dev": "lerna run --stream build:js && concurrently \"yarn watch\" \"lerna run dev --stream\"",
|
||||||
"build": "lerna run build:module --stream",
|
"build": "lerna run build:module --stream",
|
||||||
@ -38,14 +37,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@commitlint/cli": "^11.0.0",
|
"@commitlint/cli": "^9.0.1",
|
||||||
"@commitlint/config-conventional": "^9.0.1",
|
"@commitlint/config-conventional": "^9.0.1",
|
||||||
"auto-changelog": "^2.1.0",
|
"auto-changelog": "^2.1.0",
|
||||||
"concurrently": "^4.1.2",
|
"concurrently": "^4.1.2",
|
||||||
"husky": "^4.3.6",
|
"husky": "^3.0.5",
|
||||||
"lerna": "^3.20.2",
|
"lerna": "^3.20.2",
|
||||||
"lint-staged": "^9.2.5",
|
"lint-staged": "^9.2.5",
|
||||||
"prettier": "^1.18.2",
|
"prettier": "^1.18.2",
|
||||||
"rimraf": "^3.0.2"
|
"rimraf": "^3.0.2"
|
||||||
}
|
},
|
||||||
|
"version": "0.6.3"
|
||||||
}
|
}
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright © 2019–2020, [George Kukushin](https://github.com/cudr)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@slate-collaborative/backend",
|
"name": "@slate-collaborative/backend",
|
||||||
"version": "0.7.2",
|
"version": "0.6.4",
|
||||||
"files": [
|
"files": [
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
@ -26,12 +26,12 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.9.0",
|
"@babel/plugin-proposal-optional-chaining": "^7.9.0",
|
||||||
"@babel/runtime": "^7.6.3",
|
"@babel/runtime": "^7.6.3",
|
||||||
"@slate-collaborative/bridge": "^0.7.2",
|
"@slate-collaborative/bridge": "^0.6.4",
|
||||||
"@types/lodash": "^4.14.150",
|
"@types/lodash": "^4.14.150",
|
||||||
"@types/socket.io": "^2.1.4",
|
"@types/socket.io": "^2.1.4",
|
||||||
"automerge": "0.14.0",
|
"automerge": "0.14.0",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"slate": "0.59.0",
|
"slate": "0.58.3",
|
||||||
"socket.io": "^2.3.0",
|
"socket.io": "^2.3.0",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^3.8.3"
|
||||||
},
|
},
|
||||||
|
@ -31,14 +31,13 @@ export default class SocketIOCollaboration {
|
|||||||
private io: SocketIO.Server
|
private io: SocketIO.Server
|
||||||
private options: SocketIOCollaborationOptions
|
private options: SocketIOCollaborationOptions
|
||||||
private backend: AutomergeBackend
|
private backend: AutomergeBackend
|
||||||
private autoSaveDoc: (docId: string) => void
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*/
|
*/
|
||||||
|
|
||||||
constructor(options: SocketIOCollaborationOptions) {
|
constructor(options: SocketIOCollaborationOptions) {
|
||||||
this.io = io(options.entry as Server, options.connectOpts)
|
this.io = io(options.entry, options.connectOpts)
|
||||||
|
|
||||||
this.backend = new AutomergeBackend()
|
this.backend = new AutomergeBackend()
|
||||||
|
|
||||||
@ -46,15 +45,6 @@ export default class SocketIOCollaboration {
|
|||||||
|
|
||||||
this.configure()
|
this.configure()
|
||||||
|
|
||||||
/**
|
|
||||||
* Save document with throttle
|
|
||||||
*/
|
|
||||||
this.autoSaveDoc = throttle(
|
|
||||||
async (docId: string) =>
|
|
||||||
this.backend.getDocument(docId) && this.saveDocument(docId),
|
|
||||||
this.options?.saveFrequency || 2000
|
|
||||||
)
|
|
||||||
|
|
||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,24 +108,24 @@ export default class SocketIOCollaboration {
|
|||||||
const { name } = socket.nsp
|
const { name } = socket.nsp
|
||||||
|
|
||||||
this.backend.createConnection(id, ({ type, payload }: CollabAction) => {
|
this.backend.createConnection(id, ({ type, payload }: CollabAction) => {
|
||||||
if (payload.docId === name) {
|
socket.emit('msg', { type, payload: { id: conn.id, ...payload } })
|
||||||
socket.emit('msg', { type, payload: { id: conn.id, ...payload } })
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.on('msg', this.onMessage(id, name))
|
socket.on('msg', this.onMessage(id, name))
|
||||||
|
|
||||||
socket.on('disconnect', this.onDisconnect(id, socket))
|
socket.on('disconnect', this.onDisconnect(id, socket))
|
||||||
|
|
||||||
const doc = this.backend.getDocument(name)
|
socket.join(id, () => {
|
||||||
|
const doc = this.backend.getDocument(name)
|
||||||
|
|
||||||
socket.emit('msg', {
|
socket.emit('msg', {
|
||||||
type: 'document',
|
type: 'document',
|
||||||
payload: Automerge.save<SyncDoc>(doc)
|
payload: Automerge.save<SyncDoc>(doc)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.backend.openConnection(id)
|
||||||
})
|
})
|
||||||
|
|
||||||
this.backend.openConnection(id)
|
|
||||||
|
|
||||||
this.garbageCursors(name)
|
this.garbageCursors(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -158,6 +148,16 @@ export default class SocketIOCollaboration {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save document with throttle
|
||||||
|
*/
|
||||||
|
|
||||||
|
private autoSaveDoc = throttle(
|
||||||
|
async (docId: string) =>
|
||||||
|
this.backend.getDocument(docId) && this.saveDocument(docId),
|
||||||
|
this.options?.saveFrequency || 2000
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Save document
|
* Save document
|
||||||
*/
|
*/
|
||||||
@ -183,8 +183,6 @@ export default class SocketIOCollaboration {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
private onDisconnect = (id: string, socket: SocketIO.Socket) => async () => {
|
private onDisconnect = (id: string, socket: SocketIO.Socket) => async () => {
|
||||||
socket.leave(socket.nsp.name)
|
|
||||||
|
|
||||||
this.backend.closeConnection(id)
|
this.backend.closeConnection(id)
|
||||||
|
|
||||||
await this.saveDocument(socket.nsp.name)
|
await this.saveDocument(socket.nsp.name)
|
||||||
@ -221,7 +219,7 @@ export default class SocketIOCollaboration {
|
|||||||
garbageCursors = (nsp: string) => {
|
garbageCursors = (nsp: string) => {
|
||||||
const doc = this.backend.getDocument(nsp)
|
const doc = this.backend.getDocument(nsp)
|
||||||
|
|
||||||
if (!doc || !doc.cursors) return
|
if (!doc.cursors) return
|
||||||
|
|
||||||
const namespace = this.io.of(nsp)
|
const namespace = this.io.of(nsp)
|
||||||
|
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright © 2019–2020, [George Kukushin](https://github.com/cudr)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@slate-collaborative/bridge",
|
"name": "@slate-collaborative/bridge",
|
||||||
"version": "0.7.2",
|
"version": "0.6.4",
|
||||||
"files": [
|
"files": [
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
@ -26,7 +26,7 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"automerge": "0.14.0",
|
"automerge": "0.14.0",
|
||||||
"slate": "0.59.0",
|
"slate": "0.58.3",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^3.8.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@ -39,7 +39,7 @@
|
|||||||
"@babel/preset-typescript": "^7.6.0",
|
"@babel/preset-typescript": "^7.6.0",
|
||||||
"@types/jest": "^24.9.0",
|
"@types/jest": "^24.9.0",
|
||||||
"jest": "^24.9.0",
|
"jest": "^24.9.0",
|
||||||
"ts-jest": "^26.4.4"
|
"ts-jest": "^25.4.0"
|
||||||
},
|
},
|
||||||
"directories": {
|
"directories": {
|
||||||
"lib": "lib"
|
"lib": "lib"
|
||||||
|
@ -9,12 +9,7 @@ const setNode = (doc: SyncValue, op: SetNodeOperation): SyncValue => {
|
|||||||
const { newProperties } = op
|
const { newProperties } = op
|
||||||
|
|
||||||
for (let key in newProperties) {
|
for (let key in newProperties) {
|
||||||
const value = newProperties[key]
|
node[key] = newProperties[key]
|
||||||
if (value !== undefined) {
|
|
||||||
node[key] = value
|
|
||||||
} else {
|
|
||||||
delete node[key]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
|
@ -8,10 +8,7 @@ const splitNode = (doc: SyncValue, op: SplitNodeOperation): SyncValue => {
|
|||||||
const [parent, index]: [any, number] = getParent(doc, op.path)
|
const [parent, index]: [any, number] = getParent(doc, op.path)
|
||||||
|
|
||||||
const target = getChildren(parent)[index]
|
const target = getChildren(parent)[index]
|
||||||
const inject = {
|
const inject = cloneNode(target)
|
||||||
...cloneNode(target),
|
|
||||||
...op.properties
|
|
||||||
}
|
|
||||||
|
|
||||||
if (target.text) {
|
if (target.text) {
|
||||||
target.text.length > op.position &&
|
target.text.length > op.position &&
|
||||||
|
@ -9,9 +9,7 @@ export const insertText = (
|
|||||||
): SyncValue => {
|
): SyncValue => {
|
||||||
const node = getTarget(doc, op.path)
|
const node = getTarget(doc, op.path)
|
||||||
|
|
||||||
const offset = Math.min(node.text.length, op.offset)
|
node.text.insertAt(op.offset, ...op.text.split(''))
|
||||||
|
|
||||||
node.text.insertAt(offset, ...op.text.split(''))
|
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
}
|
}
|
||||||
@ -22,9 +20,7 @@ export const removeText = (
|
|||||||
): SyncValue => {
|
): SyncValue => {
|
||||||
const node = getTarget(doc, op.path)
|
const node = getTarget(doc, op.path)
|
||||||
|
|
||||||
const offset = Math.min(node.text.length, op.offset)
|
node.text.deleteAt(op.offset, op.text.length)
|
||||||
|
|
||||||
node.text.deleteAt(offset, op.text.length)
|
|
||||||
|
|
||||||
return doc
|
return doc
|
||||||
}
|
}
|
||||||
|
@ -54,13 +54,15 @@ describe('convert operations to slatejs model', () => {
|
|||||||
{
|
{
|
||||||
type: 'remove_node',
|
type: 'remove_node',
|
||||||
path: [1],
|
path: [1],
|
||||||
node: createNode('paragraph', 'hello twice!')
|
node: {
|
||||||
|
text: '*'
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: 'remove_node',
|
type: 'remove_node',
|
||||||
path: [0, 0],
|
path: [0, 0],
|
||||||
node: {
|
node: {
|
||||||
children: []
|
text: '*'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import * as Automerge from 'automerge'
|
import * as Automerge from 'automerge'
|
||||||
|
|
||||||
const createByType = (type: Automerge.CollectionType) =>
|
const createByType = (type: any) =>
|
||||||
type === 'map' ? {} : type === 'list' ? [] : ''
|
type === 'map' ? {} : type === 'list' ? [] : ''
|
||||||
|
|
||||||
const opCreate = ({ obj, type }: Automerge.Diff, [map, ops]: any) => {
|
const opCreate = ({ obj, type }: Automerge.Diff, [map, ops]: any) => {
|
||||||
|
@ -5,8 +5,6 @@ import opRemove from './remove'
|
|||||||
import opSet from './set'
|
import opSet from './set'
|
||||||
import opCreate from './create'
|
import opCreate from './create'
|
||||||
|
|
||||||
import { toJS } from '../utils'
|
|
||||||
|
|
||||||
import { SyncDoc } from '../model'
|
import { SyncDoc } from '../model'
|
||||||
|
|
||||||
const byAction = {
|
const byAction = {
|
||||||
@ -34,9 +32,7 @@ const toSlateOp = (ops: Automerge.Diff[], doc: SyncDoc) => {
|
|||||||
[]
|
[]
|
||||||
])
|
])
|
||||||
|
|
||||||
const tempDoc = toJS(doc)
|
return defer.flatMap(op => op(tempTree, doc)).filter(op => op)
|
||||||
|
|
||||||
return defer.flatMap(op => op(tempTree, tempDoc)).filter(op => op)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export { toSlateOp }
|
export { toSlateOp }
|
||||||
|
@ -1,74 +1,33 @@
|
|||||||
import * as Automerge from 'automerge'
|
import * as Automerge from 'automerge'
|
||||||
import { Element } from 'slate'
|
|
||||||
|
|
||||||
import { toSlatePath, toJS } from '../utils'
|
import { toSlatePath, toJS } from '../utils'
|
||||||
import { getTarget } from '../path'
|
import { getTarget } from '../path'
|
||||||
|
|
||||||
const removeTextOp = (op: Automerge.Diff) => (map: any, doc: Element) => {
|
const removeTextOp = ({ index, path }: Automerge.Diff) => () => ({
|
||||||
try {
|
type: 'remove_text',
|
||||||
const { index, path, obj } = op
|
path: toSlatePath(path).slice(0, path?.length),
|
||||||
|
offset: index,
|
||||||
|
text: '*',
|
||||||
|
marks: []
|
||||||
|
})
|
||||||
|
|
||||||
const slatePath = toSlatePath(path).slice(0, path?.length)
|
const removeNodeOp = ({ index, obj, path }: Automerge.Diff) => (
|
||||||
|
|
||||||
let node = map[obj]
|
|
||||||
|
|
||||||
try {
|
|
||||||
node = getTarget(doc, slatePath)
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e, slatePath, op, map, toJS(doc))
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof index !== 'number') return
|
|
||||||
|
|
||||||
const text = node?.text?.[index] || '*'
|
|
||||||
|
|
||||||
if (node) {
|
|
||||||
node.text = node?.text ? (node.text.slice(0, index) + node.text.slice(index + 1)) : ''
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
type: 'remove_text',
|
|
||||||
path: slatePath,
|
|
||||||
offset: index,
|
|
||||||
text,
|
|
||||||
marks: []
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e, op, map, toJS(doc))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const removeNodeOp = (op: Automerge.Diff) => (
|
|
||||||
map: any,
|
map: any,
|
||||||
doc: Element
|
doc: any
|
||||||
) => {
|
) => {
|
||||||
try {
|
const slatePath = toSlatePath(path)
|
||||||
const { index, obj, path } = op
|
if (!map.hasOwnProperty(obj)) {
|
||||||
|
const target = getTarget(doc, [...slatePath, index] as any)
|
||||||
|
|
||||||
const slatePath = toSlatePath(path)
|
map[obj] = target
|
||||||
|
}
|
||||||
|
|
||||||
const parent = getTarget(doc, slatePath)
|
return {
|
||||||
const target = parent?.children?.[index as number] || parent?.[index as number] || { children: [] }
|
type: 'remove_node',
|
||||||
|
path: slatePath.length ? slatePath.concat(index) : [index],
|
||||||
if (!target) {
|
node: {
|
||||||
throw new TypeError('Target is not found!')
|
text: '*'
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!map.hasOwnProperty(obj)) {
|
|
||||||
map[obj] = target
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!Number.isInteger(index)) {
|
|
||||||
throw new TypeError('Index is not a number')
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
type: 'remove_node',
|
|
||||||
path: slatePath.length ? slatePath.concat(index) : [index],
|
|
||||||
node: target
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e, op, map, toJS(doc))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,8 +38,7 @@ const opRemove = (op: Automerge.Diff, [map, ops]: any) => {
|
|||||||
if (
|
if (
|
||||||
map.hasOwnProperty(obj) &&
|
map.hasOwnProperty(obj) &&
|
||||||
typeof map[obj] !== 'string' &&
|
typeof map[obj] !== 'string' &&
|
||||||
type !== 'text' &&
|
type !== 'text'
|
||||||
map?.obj?.length
|
|
||||||
) {
|
) {
|
||||||
map[obj].splice(index, 1)
|
map[obj].splice(index, 1)
|
||||||
|
|
||||||
@ -91,7 +49,7 @@ const opRemove = (op: Automerge.Diff, [map, ops]: any) => {
|
|||||||
|
|
||||||
const key = path[path.length - 1]
|
const key = path[path.length - 1]
|
||||||
|
|
||||||
if (key === 'cursors' || op.key === 'cursors') return [map, ops]
|
if (key === 'cursors') return [map, ops]
|
||||||
|
|
||||||
const fn = key === 'text' ? removeTextOp : removeNodeOp
|
const fn = key === 'text' ? removeTextOp : removeNodeOp
|
||||||
|
|
||||||
|
@ -10,10 +10,10 @@ const setDataOp = (
|
|||||||
type: 'set_node',
|
type: 'set_node',
|
||||||
path: toSlatePath(path),
|
path: toSlatePath(path),
|
||||||
properties: {
|
properties: {
|
||||||
[key]: toJS(Automerge.getObjectById(doc, obj)?.[key])
|
[key]: Automerge.getObjectById(doc, obj)?.[key]
|
||||||
},
|
},
|
||||||
newProperties: {
|
newProperties: {
|
||||||
[key]: map?.[value] || value
|
[key]: value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -22,7 +22,7 @@ const opSet = (op: Automerge.Diff, [map, ops]: any, doc: any) => {
|
|||||||
const { link, value, path, obj, key } = op
|
const { link, value, path, obj, key } = op
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (path && path.length && path[0] !== 'cursors') {
|
if (path && path[0] !== 'cursors') {
|
||||||
ops.push(setDataOp(op, doc))
|
ops.push(setDataOp(op, doc))
|
||||||
} else if (map[obj]) {
|
} else if (map[obj]) {
|
||||||
map[obj][key as any] = link ? map[value] : value
|
map[obj][key as any] = link ? map[value] : value
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
import { Element, Node, Path } from 'slate'
|
import { Node, Path } from 'slate'
|
||||||
|
|
||||||
import { SyncValue } from '../model'
|
import { SyncValue } from '../model'
|
||||||
|
|
||||||
export const isTree = (node: Node): boolean => Boolean(node?.children)
|
export const isTree = (node: Node): boolean => Boolean(node?.children)
|
||||||
|
|
||||||
export const getTarget = (doc: SyncValue | Element, path: Path) => {
|
export const getTarget = (doc: SyncValue, path: Path) => {
|
||||||
const iterate = (current: any, idx: number) => {
|
const iterate = (current: any, idx: number) => {
|
||||||
if (!(isTree(current) || current[idx])) {
|
if (!(isTree(current) || current[idx])) {
|
||||||
throw new TypeError(
|
throw new TypeError(
|
||||||
@ -30,7 +30,7 @@ export const getParentPath = (
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const getParent = (
|
export const getParent = (
|
||||||
doc: SyncValue | Element,
|
doc: SyncValue,
|
||||||
path: Path,
|
path: Path,
|
||||||
level = 1
|
level = 1
|
||||||
): [any, number] => {
|
): [any, number] => {
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright © 2019–2020, [George Kukushin](https://github.com/cudr)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "@slate-collaborative/client",
|
"name": "@slate-collaborative/client",
|
||||||
"version": "0.7.2",
|
"version": "0.6.4",
|
||||||
"files": [
|
"files": [
|
||||||
"lib"
|
"lib"
|
||||||
],
|
],
|
||||||
@ -26,10 +26,9 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/plugin-proposal-optional-chaining": "^7.9.0",
|
"@babel/plugin-proposal-optional-chaining": "^7.9.0",
|
||||||
"@babel/preset-react": "^7.0.0",
|
"@babel/preset-react": "^7.0.0",
|
||||||
"@slate-collaborative/bridge": "^0.7.2",
|
"@slate-collaborative/bridge": "^0.6.4",
|
||||||
"automerge": "0.14.0",
|
"automerge": "0.14.0",
|
||||||
"slate": "0.59.0",
|
"slate": "0.58.3",
|
||||||
"slate-history": "0.58.3",
|
|
||||||
"socket.io-client": "^2.3.0",
|
"socket.io-client": "^2.3.0",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^3.8.3"
|
||||||
},
|
},
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
import Automerge from 'automerge'
|
import Automerge from 'automerge'
|
||||||
|
|
||||||
import { Editor, Operation } from 'slate'
|
import { Editor, Operation } from 'slate'
|
||||||
import { HistoryEditor } from 'slate-history'
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
toJS,
|
toJS,
|
||||||
@ -112,8 +111,7 @@ export const AutomergeEditor = {
|
|||||||
applyOperation: (
|
applyOperation: (
|
||||||
e: AutomergeEditor,
|
e: AutomergeEditor,
|
||||||
docId: string,
|
docId: string,
|
||||||
data: Automerge.Message,
|
data: Automerge.Message
|
||||||
preserveExternalHistory?: boolean
|
|
||||||
) => {
|
) => {
|
||||||
try {
|
try {
|
||||||
const current: any = e.docSet.getDoc(docId)
|
const current: any = e.docSet.getDoc(docId)
|
||||||
@ -128,19 +126,13 @@ export const AutomergeEditor = {
|
|||||||
e.isRemote = true
|
e.isRemote = true
|
||||||
|
|
||||||
Editor.withoutNormalizing(e, () => {
|
Editor.withoutNormalizing(e, () => {
|
||||||
if (HistoryEditor.isHistoryEditor(e) && !preserveExternalHistory) {
|
slateOps.forEach((o: Operation) => {
|
||||||
HistoryEditor.withoutSaving(e, () => {
|
e.apply(o)
|
||||||
slateOps.forEach((o: Operation) => {
|
})
|
||||||
e.apply(o)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
slateOps.forEach((o: Operation) => e.apply(o))
|
|
||||||
}
|
|
||||||
|
|
||||||
e.onCursor && e.onCursor(updated.cursors)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
e.onCursor && e.onCursor(updated.cursors)
|
||||||
|
|
||||||
Promise.resolve().then(_ => (e.isRemote = false))
|
Promise.resolve().then(_ => (e.isRemote = false))
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
@ -151,12 +143,8 @@ export const AutomergeEditor = {
|
|||||||
garbageCursor: (e: AutomergeEditor, docId: string) => {
|
garbageCursor: (e: AutomergeEditor, docId: string) => {
|
||||||
const doc = e.docSet.getDoc(docId)
|
const doc = e.docSet.getDoc(docId)
|
||||||
|
|
||||||
if (!doc) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const changed = Automerge.change<SyncDoc>(doc, (d: any) => {
|
const changed = Automerge.change<SyncDoc>(doc, (d: any) => {
|
||||||
delete d.cursors
|
delete d.cusors
|
||||||
})
|
})
|
||||||
|
|
||||||
e.onCursor && e.onCursor(null)
|
e.onCursor && e.onCursor(null)
|
||||||
|
@ -9,7 +9,6 @@ import { CursorData, CollabAction } from '@slate-collaborative/bridge'
|
|||||||
export interface AutomergeOptions {
|
export interface AutomergeOptions {
|
||||||
docId: string
|
docId: string
|
||||||
cursorData?: CursorData
|
cursorData?: CursorData
|
||||||
preserveExternalHistory?: boolean
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -24,7 +23,7 @@ const withAutomerge = <T extends Editor>(
|
|||||||
|
|
||||||
const { onChange } = e
|
const { onChange } = e
|
||||||
|
|
||||||
const { docId, cursorData, preserveExternalHistory } = options || {}
|
const { docId, cursorData } = options || {}
|
||||||
|
|
||||||
e.docSet = new Automerge.DocSet()
|
e.docSet = new Automerge.DocSet()
|
||||||
|
|
||||||
@ -77,6 +76,8 @@ const withAutomerge = <T extends Editor>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
onChange()
|
onChange()
|
||||||
|
|
||||||
|
// console.log('e', e.children)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -96,7 +97,7 @@ const withAutomerge = <T extends Editor>(
|
|||||||
e.receiveOperation = data => {
|
e.receiveOperation = data => {
|
||||||
if (docId !== data.docId) return
|
if (docId !== data.docId) return
|
||||||
|
|
||||||
AutomergeEditor.applyOperation(e, docId, data, preserveExternalHistory)
|
AutomergeEditor.applyOperation(e, docId, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
return e
|
return e
|
||||||
|
@ -122,8 +122,6 @@ const withSocketIO = <T extends AutomergeEditor>(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
e.destroy = () => {
|
e.destroy = () => {
|
||||||
e.socket.removeListener('disconnect')
|
|
||||||
|
|
||||||
e.socket.close()
|
e.socket.close()
|
||||||
|
|
||||||
e.closeConnection()
|
e.closeConnection()
|
||||||
|
@ -1,28 +1,36 @@
|
|||||||
{
|
{
|
||||||
"name": "@slate-collaborative/example",
|
"name": "@slate-collaborative/example",
|
||||||
"version": "0.7.2",
|
"version": "0.6.4",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/core": "^10.0.17",
|
"@emotion/core": "^10.0.17",
|
||||||
"@emotion/styled": "^10.0.17",
|
"@emotion/styled": "^10.0.17",
|
||||||
"@slate-collaborative/backend": "^0.7.2",
|
"@slate-collaborative/backend": "^0.6.4",
|
||||||
"@slate-collaborative/client": "^0.7.2",
|
"@slate-collaborative/client": "^0.6.4",
|
||||||
|
"@types/faker": "^4.1.5",
|
||||||
|
"@types/is-url": "^1.2.28",
|
||||||
|
"@types/jest": "24.0.18",
|
||||||
|
"@types/node": "12.7.5",
|
||||||
|
"@types/randomcolor": "^0.5.4",
|
||||||
|
"@types/react-dom": "^16.9.6",
|
||||||
"concurrently": "^4.1.2",
|
"concurrently": "^4.1.2",
|
||||||
"cross-env": "^6.0.3",
|
"cross-env": "^6.0.3",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
|
"faker": "^4.1.0",
|
||||||
"is-url": "^1.2.4",
|
"is-url": "^1.2.4",
|
||||||
"lodash": "^4.17.15",
|
"lodash": "^4.17.15",
|
||||||
"nodemon": "^2.0.6",
|
"nodemon": "^1.19.2",
|
||||||
"randomcolor": "^0.5.4",
|
"randomcolor": "^0.5.4",
|
||||||
"react": "^17.0.1",
|
"react": "^16.9.0",
|
||||||
"react-dom": "^17.0.1",
|
"react-dom": "^16.9.0",
|
||||||
"react-scripts": "3.1.2",
|
"react-scripts": "3.1.2",
|
||||||
"slate": "0.59.0",
|
"slate": "0.58.3",
|
||||||
"slate-history": "0.58.3",
|
"slate-history": "0.58.3",
|
||||||
"slate-react": "0.59.0"
|
"slate-react": "0.58.3",
|
||||||
|
"typescript": "^3.8.3"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "nodemon server.js",
|
"start": "node server.js",
|
||||||
"start:cra": "react-scripts start",
|
"start:cra": "react-scripts start",
|
||||||
"prebuild": "cp -f ./tsconfig.production.json ./tsconfig.json",
|
"prebuild": "cp -f ./tsconfig.production.json ./tsconfig.json",
|
||||||
"build": "cross-env NODE_ENV=production && react-scripts build",
|
"build": "cross-env NODE_ENV=production && react-scripts build",
|
||||||
@ -46,15 +54,5 @@
|
|||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "12.x"
|
"node": "12.x"
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/faker": "^4.1.5",
|
|
||||||
"@types/is-url": "^1.2.28",
|
|
||||||
"@types/jest": "24.0.18",
|
|
||||||
"@types/node": "14.14.6",
|
|
||||||
"@types/randomcolor": "^0.5.4",
|
|
||||||
"@types/react-dom": "^16.9.6",
|
|
||||||
"faker": "^5.1.0",
|
|
||||||
"typescript": "^3.8.3"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user