topbit 1.0.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +128 -0
- package/README.cn.md +1562 -0
- package/README.md +1272 -0
- package/bin/app.js +17 -0
- package/bin/loadinfo.sh +18 -0
- package/bin/new-ctl.js +230 -0
- package/bin/newapp.js +22 -0
- package/cache/allow.js +130 -0
- package/cache/errserv.js +45 -0
- package/cache/minserv.js +167 -0
- package/cache/router.js +84 -0
- package/cache/rsa/localhost-cert.pem +19 -0
- package/cache/rsa/localhost-privkey.pem +28 -0
- package/cache/servsock.js +286 -0
- package/cache/sni.js +66 -0
- package/demo/allow.js +98 -0
- package/demo/group-api.js +161 -0
- package/demo/group-api2.js +109 -0
- package/demo/log.js +118 -0
- package/demo/memlimit.js +31 -0
- package/demo/min.js +7 -0
- package/demo/serv.js +15 -0
- package/images/middleware.jpg +0 -0
- package/images/titbit-middleware.png +0 -0
- package/images/titbit.png +0 -0
- package/package.json +38 -8
- package/src/bodyparser.js +420 -0
- package/src/connfilter.js +125 -0
- package/src/context1.js +166 -0
- package/src/context2.js +179 -0
- package/src/ctxpool.js +38 -0
- package/src/ext.js +318 -0
- package/src/fastParseUrl.js +426 -0
- package/src/headerLimit.js +18 -0
- package/src/http1.js +337 -0
- package/src/http2.js +337 -0
- package/src/httpc.js +251 -0
- package/src/loader/loader.js +999 -0
- package/src/logger.js +32 -0
- package/src/loggermsg.js +349 -0
- package/src/makeId.js +200 -0
- package/src/midcore.js +213 -0
- package/src/middleware1.js +104 -0
- package/src/middleware2.js +121 -0
- package/src/monitor.js +380 -0
- package/src/movefile.js +30 -0
- package/src/optionsCheck.js +54 -0
- package/src/randstring.js +23 -0
- package/src/router.js +682 -0
- package/src/sendmsg.js +27 -0
- package/src/strong.js +72 -0
- package/src/token/token.js +462 -0
- package/src/topbit.js +1291 -0
- package/src/versionCheck.js +31 -0
- package/test/test-bigctx.js +29 -0
- package/test/test-daemon-args.js +7 -0
- package/test/test-find.js +69 -0
- package/test/test-helper.js +81 -0
- package/test/test-route-sort.js +71 -0
- package/test/test-route.js +49 -0
- package/test/test-route2.js +51 -0
- package/test/test-run-args.js +7 -0
- package/test/test-url.js +52 -0
- package/tmp/buff-code +134 -0
- package/tmp/devplan +9 -0
- package/tmp/evt-test.js +34 -0
- package/tmp/fastParseUrl.js +302 -0
- package/tmp/router-rule.js +559 -0
- package/tmp/test-cdps.js +122 -0
- package/tmp/titbit.js +1286 -0
- package/main.js +0 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const titbit = require('../lib/titbit.js')
|
|
4
|
+
|
|
5
|
+
const app = new titbit({
|
|
6
|
+
debug: true,
|
|
7
|
+
loadInfoFile: '--mem',
|
|
8
|
+
http2: true,
|
|
9
|
+
allowHTTP1: true,
|
|
10
|
+
key: __dirname + '/../cache/rsa/localhost-privkey.pem',
|
|
11
|
+
cert: __dirname + '/../cache/rsa/localhost-cert.pem'
|
|
12
|
+
})
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
app.midware.addFinal = () => {
|
|
16
|
+
return async (c, next) => {
|
|
17
|
+
return c.reply.end('ok')
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
app.pre(async (c, next) => {
|
|
22
|
+
return c.reply.end('ok')
|
|
23
|
+
})
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
app.get('/home', async c => {
|
|
27
|
+
c.setHeader('x-key', Math.random()).sendHeader().send('home page')
|
|
28
|
+
}, '@home')
|
|
29
|
+
|
|
30
|
+
app.get('/', async c => {
|
|
31
|
+
for (let i = 0; i < 10; i++) {
|
|
32
|
+
c.write(`${i} ${Math.random()}\n`)
|
|
33
|
+
await c.ext.delay()
|
|
34
|
+
}
|
|
35
|
+
c.send('home page')
|
|
36
|
+
}, '@home')
|
|
37
|
+
|
|
38
|
+
app.use(async (ctx, next) => {
|
|
39
|
+
console.log('group', ctx.group, ctx.path)
|
|
40
|
+
await next()
|
|
41
|
+
console.log('group', ctx.group, ctx.path, 'end')
|
|
42
|
+
}, '@home')
|
|
43
|
+
|
|
44
|
+
let mid_timing = async (c, next) => {
|
|
45
|
+
console.log('time start')
|
|
46
|
+
console.time('request')
|
|
47
|
+
await next()
|
|
48
|
+
console.timeEnd('request')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
app.trace('/o', async c => {})
|
|
52
|
+
|
|
53
|
+
app.use(async (c, next) => {
|
|
54
|
+
console.log('global request')
|
|
55
|
+
await next()
|
|
56
|
+
console.log('global request end\n')
|
|
57
|
+
|
|
58
|
+
}, {pre: true})
|
|
59
|
+
|
|
60
|
+
app.use(async (c, next) => {
|
|
61
|
+
console.log('global pre')
|
|
62
|
+
await next()
|
|
63
|
+
console.log('global pre end')
|
|
64
|
+
|
|
65
|
+
}, {pre: true})
|
|
66
|
+
|
|
67
|
+
app.router.group('/api', (route) => {
|
|
68
|
+
route.get('/test', async c => {
|
|
69
|
+
c.send('api test')
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
route.get('/stream', async c => {
|
|
73
|
+
for (let i = 0; i < 10; i++) {
|
|
74
|
+
await c.ext.delay(30)
|
|
75
|
+
c.write(`${i} ${Math.random()} ${Date.now()}\n`)
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
route.get('/:name', async c => {
|
|
80
|
+
c.send(c.param)
|
|
81
|
+
}, 'name')
|
|
82
|
+
|
|
83
|
+
route.use(async (ctx, next) => {
|
|
84
|
+
console.log('name test')
|
|
85
|
+
await next()
|
|
86
|
+
console.log('name test end')
|
|
87
|
+
}, 'name')
|
|
88
|
+
|
|
89
|
+
route.trace('/o', async c => {})
|
|
90
|
+
})
|
|
91
|
+
.use(async (c, next) => {
|
|
92
|
+
console.log(c.group, c.path, c.routepath)
|
|
93
|
+
await next()
|
|
94
|
+
})
|
|
95
|
+
.pre(async (c, next) => {
|
|
96
|
+
console.log('pre', c.method, c.headers)
|
|
97
|
+
await next()
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
app.middleware([mid_timing,], {pre: true}).group('验证', route => {
|
|
101
|
+
route.use(async (ctx, next) => {
|
|
102
|
+
console.log(' new route use test')
|
|
103
|
+
await next()
|
|
104
|
+
console.log(' new route use end')
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
route.get('/c/:o/:p', async c => {
|
|
108
|
+
console.log(c.group, c.name)
|
|
109
|
+
c.send(c.param)
|
|
110
|
+
})
|
|
111
|
+
|
|
112
|
+
route.middleware([
|
|
113
|
+
async (c, next) => {
|
|
114
|
+
console.log(' group sub test')
|
|
115
|
+
await next()
|
|
116
|
+
console.log(' group sub test end')
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
[
|
|
120
|
+
async (c, next) => {
|
|
121
|
+
console.log(' group sub test 2')
|
|
122
|
+
await next()
|
|
123
|
+
console.log(' group sub test 2 end')
|
|
124
|
+
},
|
|
125
|
+
{pre: false}
|
|
126
|
+
]
|
|
127
|
+
], {pre: true, tag: 'sub'}).group('sub', r => {
|
|
128
|
+
|
|
129
|
+
r.get('/oo', async c => {
|
|
130
|
+
c.send(c.group)
|
|
131
|
+
})
|
|
132
|
+
|
|
133
|
+
r.middleware(async (c, next) => {
|
|
134
|
+
console.log('sub sub test')
|
|
135
|
+
await next()
|
|
136
|
+
}).group('/sub', subr => {
|
|
137
|
+
subr.get('/ok', async c => {
|
|
138
|
+
c.send(c.group)
|
|
139
|
+
})
|
|
140
|
+
})
|
|
141
|
+
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
app.group('测试', route => {
|
|
147
|
+
route.get('/test', async c => {
|
|
148
|
+
console.log(c.group, c.name)
|
|
149
|
+
c.send('test ok')
|
|
150
|
+
}, 'test')
|
|
151
|
+
})
|
|
152
|
+
.use(async (c, next) => {
|
|
153
|
+
console.log('测试组')
|
|
154
|
+
await next()
|
|
155
|
+
})
|
|
156
|
+
|
|
157
|
+
app.daemon({port: 1234}, 2)
|
|
158
|
+
|
|
159
|
+
//app.run(1234)
|
|
160
|
+
|
|
161
|
+
//app.isWorker && console.log(app.midware.midGroup)
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
const Titbit = require('../lib/titbit.js')
|
|
4
|
+
|
|
5
|
+
let app = new Titbit({
|
|
6
|
+
debug: true,
|
|
7
|
+
globalLog: true
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
let sub = app.group('/api')
|
|
11
|
+
|
|
12
|
+
sub.pre(async (ctx, next) => {
|
|
13
|
+
console.log('sub start')
|
|
14
|
+
await next()
|
|
15
|
+
console.log('sub end')
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
sub.get('/t', async ctx => {
|
|
19
|
+
ctx.send({
|
|
20
|
+
group: ctx.group,
|
|
21
|
+
path: ctx.path
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
let subsub = sub.group('/sub')
|
|
26
|
+
|
|
27
|
+
subsub.pre(async (ctx, next) => {
|
|
28
|
+
console.log('sub 2 start')
|
|
29
|
+
await next()
|
|
30
|
+
console.log('sub 2 end')
|
|
31
|
+
})
|
|
32
|
+
.get('/.ok', async ctx => {
|
|
33
|
+
ctx.send('ok')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
subsub.get('/subt', async ctx => {
|
|
37
|
+
ctx.send({
|
|
38
|
+
group: ctx.group,
|
|
39
|
+
path: ctx.path
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
let ar = app.middleware([
|
|
44
|
+
async (ctx, next) => {
|
|
45
|
+
console.log('request timing start')
|
|
46
|
+
console.time('request')
|
|
47
|
+
await next()
|
|
48
|
+
console.timeEnd('request')
|
|
49
|
+
}
|
|
50
|
+
], {pre: true}).group('/ar')
|
|
51
|
+
|
|
52
|
+
ar.get('/test', async ctx => {
|
|
53
|
+
ctx.send('test ar')
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
ar.post('/test', async ctx => {
|
|
57
|
+
ctx.send(ctx.body)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
let arsub = ar.group('/s')
|
|
61
|
+
|
|
62
|
+
arsub.use(async (ctx, next) => {
|
|
63
|
+
console.log('ar sub start')
|
|
64
|
+
await next()
|
|
65
|
+
console.log('ar sub end')
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
arsub.get('/rich', async ctx => {
|
|
69
|
+
ctx.send('success')
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
app.post('/d', async ctx => {
|
|
73
|
+
ctx.send(ctx.body)
|
|
74
|
+
}, {group: 'data', name: 'data'})
|
|
75
|
+
|
|
76
|
+
app.post('/x', async ctx => {
|
|
77
|
+
ctx.send(ctx.body)
|
|
78
|
+
}, {group: 'data', name: 'x'})
|
|
79
|
+
|
|
80
|
+
app.put('/y/:id', async ctx => {
|
|
81
|
+
ctx.send({
|
|
82
|
+
param: ctx.param,
|
|
83
|
+
body: ctx.body
|
|
84
|
+
})
|
|
85
|
+
}, {group: 'data', name: 'y'})
|
|
86
|
+
|
|
87
|
+
app.pre(async (ctx, next) => {
|
|
88
|
+
console.log(ctx.group, ctx.path, 'start')
|
|
89
|
+
await next()
|
|
90
|
+
console.log(ctx.group, ctx.path, 'end')
|
|
91
|
+
}, '@data')
|
|
92
|
+
|
|
93
|
+
app.pre(async (ctx, next) => {
|
|
94
|
+
console.log(ctx.group, ctx.path, 'start', Math.random())
|
|
95
|
+
await next()
|
|
96
|
+
console.log(ctx.group, ctx.path, 'end', Math.random())
|
|
97
|
+
}, {group: 'data', name: 'x'})
|
|
98
|
+
|
|
99
|
+
app.pre(async (ctx, next) => {
|
|
100
|
+
console.log(ctx.group, ctx.path, ctx.routepath, 'start')
|
|
101
|
+
await next()
|
|
102
|
+
console.log(ctx.group, ctx.path, ctx.routepath, 'end')
|
|
103
|
+
}, {
|
|
104
|
+
group: 'data',
|
|
105
|
+
method: 'PUT',
|
|
106
|
+
name: 'y'
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
app.run(1235)
|
package/demo/log.js
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const titbit = require('../lib/titbit.js');
|
|
2
|
+
const v8 = require('v8');
|
|
3
|
+
const cluster = require('cluster');
|
|
4
|
+
|
|
5
|
+
process.on('exit', (code) => {
|
|
6
|
+
console.log('EXIT CODE:', code);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
/*
|
|
10
|
+
if (cluster.isWorker) {
|
|
11
|
+
setInterval(() => {
|
|
12
|
+
console.log(v8.getHeapStatistics());
|
|
13
|
+
}, 15000);
|
|
14
|
+
}
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
async function delay(t) {
|
|
18
|
+
return await new Promise((rv, rj) => {
|
|
19
|
+
setTimeout(() => {
|
|
20
|
+
rv();
|
|
21
|
+
}, t);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
let app = new titbit({
|
|
26
|
+
debug: true,
|
|
27
|
+
globalLog : true,
|
|
28
|
+
//loadInfoType : 'text',
|
|
29
|
+
loadInfoFile : '/tmp/loadinfo.log',
|
|
30
|
+
timeout : 15000,
|
|
31
|
+
//socktimeout: 1000,
|
|
32
|
+
useLimit: true,
|
|
33
|
+
maxConn: 6000,
|
|
34
|
+
logType : 'file',
|
|
35
|
+
logFile: '/tmp/access.log',
|
|
36
|
+
errorLogFile : '/tmp/error.log',
|
|
37
|
+
logMaxLines: 10,
|
|
38
|
+
logHistory: 10
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
app.addService('name', 'brave');
|
|
42
|
+
|
|
43
|
+
var _key = 'abcdefghijklmnopqrstuvwxyz123456';
|
|
44
|
+
|
|
45
|
+
app.get('/', async c => {
|
|
46
|
+
c.data = 'success';
|
|
47
|
+
},{name:'home', group:'/'});
|
|
48
|
+
|
|
49
|
+
app.get('/uuid', async c => {
|
|
50
|
+
c.data = c.ext.uuid()
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
app.get('/timeout/:tm', async ctx => {
|
|
54
|
+
await new Promise((rv, rj) => {
|
|
55
|
+
setTimeout(() => {
|
|
56
|
+
rv()
|
|
57
|
+
}, parseInt(ctx.param.tm) || 10)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
ctx.send(`timeout ok ${ctx.param.tm}`)
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
app.post('/p', async c => {
|
|
64
|
+
c.data = c.body;
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
app.get('/name', async c => {
|
|
68
|
+
c.data = c.service.name;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
app.get('/tout', async c => {
|
|
72
|
+
|
|
73
|
+
await delay(1800);
|
|
74
|
+
|
|
75
|
+
c.response.write('handling...');
|
|
76
|
+
|
|
77
|
+
await delay(1000);
|
|
78
|
+
|
|
79
|
+
c.data = 'timeout test';
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
app.post('/tout', async c => {
|
|
83
|
+
await delay (119);
|
|
84
|
+
|
|
85
|
+
console.log('start');
|
|
86
|
+
c.response.write('start');
|
|
87
|
+
|
|
88
|
+
await delay (119);
|
|
89
|
+
|
|
90
|
+
console.log('not end');
|
|
91
|
+
c.response.write('start 2');
|
|
92
|
+
|
|
93
|
+
await delay(18000);
|
|
94
|
+
|
|
95
|
+
c.response.write('handling...');
|
|
96
|
+
|
|
97
|
+
await delay(10000);
|
|
98
|
+
|
|
99
|
+
c.data = 'timeout test' + JSON.stringify(c.body);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
app.get('/encrypt', async c => {
|
|
103
|
+
c.data = c.helper.aesEncrypt(JSON.stringify(c.query), _key);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
app.get('/decrypt', async c => {
|
|
107
|
+
c.data = c.helper.aesDecrypt(c.query.data, _key);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
app.get('/sha256', async c => {
|
|
111
|
+
c.data = c.helper.sha256(`${Math.random()}${Date.now()}`);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
//app.logger.watch();
|
|
115
|
+
|
|
116
|
+
app.sched('none')
|
|
117
|
+
|
|
118
|
+
app.daemon(2025, 2)
|
package/demo/memlimit.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const titbit = require('../lib/titbit.js');
|
|
4
|
+
|
|
5
|
+
const cluster = require('cluster');
|
|
6
|
+
|
|
7
|
+
const app = new titbit({
|
|
8
|
+
maxBody : 100000000,
|
|
9
|
+
debug: true,
|
|
10
|
+
//showLoadInfo: false,
|
|
11
|
+
memFactor: -0.43,
|
|
12
|
+
loadInfoFile: '/tmp/loadinfo.log'
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
if (app.isWorker) {
|
|
16
|
+
app.addService('data', {})
|
|
17
|
+
|
|
18
|
+
setInterval(() => {
|
|
19
|
+
for (let i = 0; i < 100; i++)
|
|
20
|
+
app.service.data[ `${Math.random()}` ] = Date.now()
|
|
21
|
+
}, 5)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
if (cluster.isMaster) {
|
|
26
|
+
setTimeout(() => {
|
|
27
|
+
console.log(app.secure);
|
|
28
|
+
}, 10);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
app.daemon(1234, 9)
|
package/demo/min.js
ADDED
package/demo/serv.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const titbit = require('../lib/titbit.js')
|
|
2
|
+
|
|
3
|
+
const app = new titbit({
|
|
4
|
+
debug: true,
|
|
5
|
+
loadInfoFile: '--mem',
|
|
6
|
+
//http2: true,
|
|
7
|
+
key: __dirname + '/../cache/rsa/localhost-privkey.pem',
|
|
8
|
+
cert: __dirname + '/../cache/rsa/localhost-cert.pem'
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
app.get('/js', async ctx => {
|
|
12
|
+
await ctx.pipeText(__filename)
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
app.run(1230)
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,27 +1,57 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "topbit",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "A Server-side web framework support http/1.1 and http/2",
|
|
5
|
+
"main": "src/topbit.js",
|
|
6
|
+
"directories": {
|
|
7
|
+
"src": "src"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"tbload": "bin/loadinfo.sh",
|
|
11
|
+
"topbit-new-app": "bin/newapp.js"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"test": "node test/test-service.js",
|
|
15
|
+
"test-route": "node test/test-route.js"
|
|
16
|
+
},
|
|
5
17
|
"keywords": [
|
|
6
|
-
"
|
|
18
|
+
"top",
|
|
19
|
+
"topbit",
|
|
20
|
+
"tit",
|
|
21
|
+
"tibit",
|
|
22
|
+
"titbit",
|
|
23
|
+
"tidbit",
|
|
24
|
+
"bit",
|
|
25
|
+
"http",
|
|
26
|
+
"server",
|
|
27
|
+
"http/1.1",
|
|
28
|
+
"http/2",
|
|
29
|
+
"http2",
|
|
30
|
+
"web",
|
|
31
|
+
"middleware",
|
|
32
|
+
"framework",
|
|
33
|
+
"tidbit",
|
|
34
|
+
"proxy",
|
|
35
|
+
"webserver",
|
|
36
|
+
"backend",
|
|
37
|
+
"serverside"
|
|
7
38
|
],
|
|
8
|
-
"homepage": "https://github.com/master-genius/
|
|
39
|
+
"homepage": "https://github.com/master-genius/topbit#readme",
|
|
9
40
|
"bugs": {
|
|
10
|
-
"url": "https://github.com/master-genius/
|
|
41
|
+
"url": "https://github.com/master-genius/topbit/issues"
|
|
11
42
|
},
|
|
12
43
|
"repository": {
|
|
13
44
|
"type": "git",
|
|
14
|
-
"url": "git+https://github.com/master-genius/
|
|
45
|
+
"url": "git+https://github.com/master-genius/topbit.git"
|
|
15
46
|
},
|
|
16
47
|
"license": "ISC",
|
|
17
48
|
"author": "BraveWang",
|
|
18
49
|
"type": "commonjs",
|
|
19
|
-
"main": "main.js",
|
|
20
50
|
"scripts": {
|
|
21
51
|
"test": "echo ok"
|
|
22
52
|
},
|
|
23
53
|
"dependencies": {
|
|
24
|
-
|
|
54
|
+
|
|
25
55
|
},
|
|
26
56
|
"devDependencies": {}
|
|
27
57
|
}
|