🍕
This commit is contained in:
parent
0c0dc1ce3f
commit
5166fc92b6
17 changed files with 295 additions and 44 deletions
20
gulpfile.ts
20
gulpfile.ts
|
@ -13,6 +13,7 @@ import * as es from 'event-stream';
|
||||||
import cssnano = require('gulp-cssnano');
|
import cssnano = require('gulp-cssnano');
|
||||||
import * as uglifyComposer from 'gulp-uglify/composer';
|
import * as uglifyComposer from 'gulp-uglify/composer';
|
||||||
import pug = require('gulp-pug');
|
import pug = require('gulp-pug');
|
||||||
|
import stylus = require('gulp-stylus');
|
||||||
import * as rimraf from 'rimraf';
|
import * as rimraf from 'rimraf';
|
||||||
import chalk from 'chalk';
|
import chalk from 'chalk';
|
||||||
import imagemin = require('gulp-imagemin');
|
import imagemin = require('gulp-imagemin');
|
||||||
|
@ -47,15 +48,32 @@ if (isDebug) {
|
||||||
|
|
||||||
const constants = require('./src/const.json');
|
const constants = require('./src/const.json');
|
||||||
|
|
||||||
|
require('./src/web/docs/api/endpoints/gulpfile.ts');
|
||||||
|
|
||||||
gulp.task('build', [
|
gulp.task('build', [
|
||||||
'build:js',
|
'build:js',
|
||||||
'build:ts',
|
'build:ts',
|
||||||
'build:copy',
|
'build:copy',
|
||||||
'build:client'
|
'build:client',
|
||||||
|
'build:doc'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
gulp.task('rebuild', ['clean', 'build']);
|
gulp.task('rebuild', ['clean', 'build']);
|
||||||
|
|
||||||
|
gulp.task('build:doc', [
|
||||||
|
'doc:endpoints',
|
||||||
|
'doc:styles'
|
||||||
|
]);
|
||||||
|
|
||||||
|
gulp.task('doc:styles', () =>
|
||||||
|
gulp.src('./src/web/docs/**/*.styl')
|
||||||
|
.pipe(stylus())
|
||||||
|
.pipe(isProduction
|
||||||
|
? (cssnano as any)()
|
||||||
|
: gutil.noop())
|
||||||
|
.pipe(gulp.dest('./built/web/assets/docs/'))
|
||||||
|
);
|
||||||
|
|
||||||
gulp.task('build:js', () =>
|
gulp.task('build:js', () =>
|
||||||
gulp.src(['./src/**/*.js', '!./src/web/**/*.js'])
|
gulp.src(['./src/**/*.js', '!./src/web/**/*.js'])
|
||||||
.pipe(gulp.dest('./built/'))
|
.pipe(gulp.dest('./built/'))
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
"@types/is-root": "1.0.0",
|
"@types/is-root": "1.0.0",
|
||||||
"@types/is-url": "1.2.28",
|
"@types/is-url": "1.2.28",
|
||||||
"@types/js-yaml": "3.10.1",
|
"@types/js-yaml": "3.10.1",
|
||||||
|
"@types/mkdirp": "^0.5.2",
|
||||||
"@types/mocha": "2.2.44",
|
"@types/mocha": "2.2.44",
|
||||||
"@types/mongodb": "2.2.17",
|
"@types/mongodb": "2.2.17",
|
||||||
"@types/monk": "1.0.6",
|
"@types/monk": "1.0.6",
|
||||||
|
@ -62,6 +63,7 @@
|
||||||
"@types/node": "8.5.1",
|
"@types/node": "8.5.1",
|
||||||
"@types/page": "1.5.32",
|
"@types/page": "1.5.32",
|
||||||
"@types/proxy-addr": "2.0.0",
|
"@types/proxy-addr": "2.0.0",
|
||||||
|
"@types/pug": "^2.0.4",
|
||||||
"@types/qrcode": "0.8.0",
|
"@types/qrcode": "0.8.0",
|
||||||
"@types/ratelimiter": "2.1.28",
|
"@types/ratelimiter": "2.1.28",
|
||||||
"@types/redis": "2.8.3",
|
"@types/redis": "2.8.3",
|
||||||
|
@ -112,6 +114,7 @@
|
||||||
"gulp-pug": "3.3.0",
|
"gulp-pug": "3.3.0",
|
||||||
"gulp-rename": "1.2.2",
|
"gulp-rename": "1.2.2",
|
||||||
"gulp-replace": "0.6.1",
|
"gulp-replace": "0.6.1",
|
||||||
|
"gulp-stylus": "^2.6.0",
|
||||||
"gulp-tslint": "8.1.2",
|
"gulp-tslint": "8.1.2",
|
||||||
"gulp-typescript": "3.2.3",
|
"gulp-typescript": "3.2.3",
|
||||||
"gulp-uglify": "3.0.0",
|
"gulp-uglify": "3.0.0",
|
||||||
|
@ -122,6 +125,7 @@
|
||||||
"is-url": "1.2.2",
|
"is-url": "1.2.2",
|
||||||
"js-yaml": "3.10.0",
|
"js-yaml": "3.10.0",
|
||||||
"mecab-async": "0.1.2",
|
"mecab-async": "0.1.2",
|
||||||
|
"mkdirp": "^0.5.1",
|
||||||
"mocha": "4.0.1",
|
"mocha": "4.0.1",
|
||||||
"moji": "0.5.1",
|
"moji": "0.5.1",
|
||||||
"mongodb": "2.2.33",
|
"mongodb": "2.2.33",
|
||||||
|
|
|
@ -1,29 +1,4 @@
|
||||||
json('../../const.json')
|
@import "../style"
|
||||||
|
|
||||||
@charset 'utf-8'
|
|
||||||
|
|
||||||
$theme-color = themeColor
|
|
||||||
$theme-color-foreground = themeColorForeground
|
|
||||||
|
|
||||||
/*
|
|
||||||
::selection
|
|
||||||
background $theme-color
|
|
||||||
color #fff
|
|
||||||
*/
|
|
||||||
|
|
||||||
*
|
|
||||||
position relative
|
|
||||||
box-sizing border-box
|
|
||||||
background-clip padding-box !important
|
|
||||||
tap-highlight-color rgba($theme-color, 0.7)
|
|
||||||
-webkit-tap-highlight-color rgba($theme-color, 0.7)
|
|
||||||
|
|
||||||
html, body
|
|
||||||
margin 0
|
|
||||||
padding 0
|
|
||||||
scroll-behavior smooth
|
|
||||||
text-size-adjust 100%
|
|
||||||
font-family sans-serif
|
|
||||||
|
|
||||||
html
|
html
|
||||||
&.progress
|
&.progress
|
||||||
|
@ -96,17 +71,6 @@ body
|
||||||
100%
|
100%
|
||||||
transform rotate(360deg)
|
transform rotate(360deg)
|
||||||
|
|
||||||
a
|
|
||||||
text-decoration none
|
|
||||||
color $theme-color
|
|
||||||
cursor pointer
|
|
||||||
|
|
||||||
&:hover
|
|
||||||
text-decoration underline
|
|
||||||
|
|
||||||
*
|
|
||||||
cursor pointer
|
|
||||||
|
|
||||||
code
|
code
|
||||||
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||||
|
|
||||||
|
|
75
src/web/docs/api/endpoints/gulpfile.ts
Normal file
75
src/web/docs/api/endpoints/gulpfile.ts
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
/**
|
||||||
|
* Gulp tasks
|
||||||
|
*/
|
||||||
|
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as glob from 'glob';
|
||||||
|
import * as gulp from 'gulp';
|
||||||
|
import * as pug from 'pug';
|
||||||
|
import * as yaml from 'js-yaml';
|
||||||
|
import * as mkdirp from 'mkdirp';
|
||||||
|
|
||||||
|
import config from './../../../../conf';
|
||||||
|
|
||||||
|
const parseParam = param => {
|
||||||
|
const id = param.type.match(/^id\((.+?)\)/);
|
||||||
|
const object = param.type.match(/^object\((.+?)\)/);
|
||||||
|
const isArray = /\[\]$/.test(param.type);
|
||||||
|
if (id) {
|
||||||
|
param.kind = 'id';
|
||||||
|
param.type = 'string';
|
||||||
|
param.entity = id[1];
|
||||||
|
if (isArray) {
|
||||||
|
param.type += '[]';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (object) {
|
||||||
|
param.kind = 'object';
|
||||||
|
param.type = 'object';
|
||||||
|
param.def = object[1];
|
||||||
|
if (isArray) {
|
||||||
|
param.type += '[]';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return param;
|
||||||
|
};
|
||||||
|
|
||||||
|
gulp.task('doc:endpoints', () => {
|
||||||
|
glob('./src/web/docs/api/endpoints/**/*.yaml', (globErr, files) => {
|
||||||
|
if (globErr) {
|
||||||
|
console.error(globErr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//console.log(files);
|
||||||
|
files.forEach(file => {
|
||||||
|
const ep = yaml.safeLoad(fs.readFileSync(file, 'utf-8'));
|
||||||
|
const vars = {
|
||||||
|
endpoint: ep.endpoint,
|
||||||
|
url: `${config.api_url}/${ep.endpoint}`,
|
||||||
|
desc: ep.desc,
|
||||||
|
params: ep.params.map(p => parseParam(p)),
|
||||||
|
paramDefs: Object.keys(ep.paramDefs).map(key => ({
|
||||||
|
name: key,
|
||||||
|
params: ep.paramDefs[key].map(p => parseParam(p))
|
||||||
|
})),
|
||||||
|
res: ep.res.map(p => parseParam(p))
|
||||||
|
};
|
||||||
|
pug.renderFile('./src/web/docs/api/endpoints/view.pug', vars, (renderErr, html) => {
|
||||||
|
if (renderErr) {
|
||||||
|
console.error(renderErr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const htmlPath = `./built/web/docs/api/endpoints/${ep.endpoint}.html`;
|
||||||
|
mkdirp(path.dirname(htmlPath), (mkdirErr) => {
|
||||||
|
if (mkdirErr) {
|
||||||
|
console.error(mkdirErr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fs.writeFileSync(htmlPath, html, 'utf-8');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -7,31 +7,31 @@ desc:
|
||||||
params:
|
params:
|
||||||
- name: "text"
|
- name: "text"
|
||||||
type: "string"
|
type: "string"
|
||||||
required: true
|
optional: false
|
||||||
desc:
|
desc:
|
||||||
ja: "投稿の本文"
|
ja: "投稿の本文"
|
||||||
en: "Text of a post"
|
en: "Text of a post"
|
||||||
- name: "media_ids"
|
- name: "media_ids"
|
||||||
type: "id(DriveFile)[]"
|
type: "id(DriveFile)[]"
|
||||||
required: false
|
optional: true
|
||||||
desc:
|
desc:
|
||||||
ja: "添付するメディア"
|
ja: "添付するメディア"
|
||||||
en: "Media you want to attach"
|
en: "Media you want to attach"
|
||||||
- name: "reply_id"
|
- name: "reply_id"
|
||||||
type: "id(Post)"
|
type: "id(Post)"
|
||||||
required: false
|
optional: true
|
||||||
desc:
|
desc:
|
||||||
ja: "返信する投稿"
|
ja: "返信する投稿"
|
||||||
en: "A post you want to reply"
|
en: "A post you want to reply"
|
||||||
- name: "repost_id"
|
- name: "repost_id"
|
||||||
type: "id(Post)"
|
type: "id(Post)"
|
||||||
required: false
|
optional: true
|
||||||
desc:
|
desc:
|
||||||
ja: "引用する投稿"
|
ja: "引用する投稿"
|
||||||
en: "A post you want to quote"
|
en: "A post you want to quote"
|
||||||
- name: "poll"
|
- name: "poll"
|
||||||
type: "object(poll)"
|
type: "object(poll)"
|
||||||
required: false
|
optional: true
|
||||||
desc:
|
desc:
|
||||||
ja: "投票"
|
ja: "投票"
|
||||||
en: "A poll"
|
en: "A poll"
|
||||||
|
@ -40,7 +40,7 @@ paramDefs:
|
||||||
poll:
|
poll:
|
||||||
- name: "choices"
|
- name: "choices"
|
||||||
type: "string[]"
|
type: "string[]"
|
||||||
required: true
|
optional: false
|
||||||
desc:
|
desc:
|
||||||
ja: "投票の選択肢"
|
ja: "投票の選択肢"
|
||||||
en: "Choices of a poll"
|
en: "Choices of a poll"
|
||||||
|
@ -48,6 +48,7 @@ paramDefs:
|
||||||
res:
|
res:
|
||||||
- name: "created_post"
|
- name: "created_post"
|
||||||
type: "entity(Post)"
|
type: "entity(Post)"
|
||||||
|
optional: false
|
||||||
desc:
|
desc:
|
||||||
ja: "作成した投稿"
|
ja: "作成した投稿"
|
||||||
en: "A post that created"
|
en: "A post that created"
|
16
src/web/docs/api/endpoints/style.styl
Normal file
16
src/web/docs/api/endpoints/style.styl
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
@import "../../style"
|
||||||
|
|
||||||
|
#url
|
||||||
|
padding 8px 12px
|
||||||
|
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||||
|
color #fff
|
||||||
|
background #222e40
|
||||||
|
border-radius 4px
|
||||||
|
|
||||||
|
table
|
||||||
|
.name
|
||||||
|
font-weight bold
|
||||||
|
|
||||||
|
.type
|
||||||
|
font-family Consolas, 'Courier New', Courier, Monaco, monospace
|
||||||
|
|
60
src/web/docs/api/endpoints/view.pug
Normal file
60
src/web/docs/api/endpoints/view.pug
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
doctype html
|
||||||
|
|
||||||
|
mixin i18n(xs)
|
||||||
|
each text, lang in xs
|
||||||
|
span(class=`i18n ${lang}`)= text
|
||||||
|
|
||||||
|
mixin table(params)
|
||||||
|
table
|
||||||
|
thead: tr
|
||||||
|
th Name
|
||||||
|
th Type
|
||||||
|
th Optional
|
||||||
|
th Description
|
||||||
|
tbody
|
||||||
|
each param in params
|
||||||
|
tr
|
||||||
|
td.name= param.name
|
||||||
|
td.type
|
||||||
|
if param.kind == 'id'
|
||||||
|
| #{param.type} (ID of
|
||||||
|
= ' '
|
||||||
|
a(href=`/docs/api/entities/${param.entity}`)= param.entity
|
||||||
|
| )
|
||||||
|
else if param.kind == 'object'
|
||||||
|
| #{param.type} (
|
||||||
|
a(href=`#${param.def}`)= param.def
|
||||||
|
| )
|
||||||
|
else
|
||||||
|
= param.type
|
||||||
|
td.optional= param.optional.toString()
|
||||||
|
td.desc: +i18n(param.desc)
|
||||||
|
|
||||||
|
html
|
||||||
|
head
|
||||||
|
meta(charset="UTF-8")
|
||||||
|
title #{endpoint} | Misskey API
|
||||||
|
link(rel="stylesheet" href="/assets/docs/api/endpoints/style.css")
|
||||||
|
|
||||||
|
body
|
||||||
|
main
|
||||||
|
h1= endpoint
|
||||||
|
|
||||||
|
p#url= url
|
||||||
|
|
||||||
|
p#desc: +i18n(desc)
|
||||||
|
|
||||||
|
section
|
||||||
|
h2 Params
|
||||||
|
+table(params)
|
||||||
|
|
||||||
|
if paramDefs
|
||||||
|
each paramDef in paramDefs
|
||||||
|
section(id= paramDef.name)
|
||||||
|
h3= paramDef.name
|
||||||
|
+table(paramDef.params)
|
||||||
|
|
||||||
|
section
|
||||||
|
h2 Response
|
||||||
|
+table(res)
|
||||||
|
|
69
src/web/docs/style.styl
Normal file
69
src/web/docs/style.styl
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
@import "../style"
|
||||||
|
|
||||||
|
body
|
||||||
|
margin 0
|
||||||
|
color #34495e
|
||||||
|
|
||||||
|
main
|
||||||
|
padding 32px
|
||||||
|
width 100%
|
||||||
|
max-width 700px
|
||||||
|
|
||||||
|
footer
|
||||||
|
padding:32px 0 0 0
|
||||||
|
margin 32px 0 0 0
|
||||||
|
border-top solid 1px #eee
|
||||||
|
|
||||||
|
.copyright
|
||||||
|
margin 16px 0 0 0
|
||||||
|
color #aaa
|
||||||
|
|
||||||
|
section
|
||||||
|
margin 32px 0
|
||||||
|
|
||||||
|
h1
|
||||||
|
margin 0 0 24px 0
|
||||||
|
padding 16px 0
|
||||||
|
font-size 1.5em
|
||||||
|
border-bottom solid 2px #eee
|
||||||
|
|
||||||
|
h2
|
||||||
|
margin 0 0 24px 0
|
||||||
|
padding 0 0 16px 0
|
||||||
|
font-size 1.4em
|
||||||
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
|
h3
|
||||||
|
margin 0
|
||||||
|
padding 0
|
||||||
|
font-size 1.25em
|
||||||
|
|
||||||
|
h4
|
||||||
|
margin 0
|
||||||
|
|
||||||
|
p
|
||||||
|
margin 1em 0
|
||||||
|
line-height 1.6em
|
||||||
|
|
||||||
|
table
|
||||||
|
width 100%
|
||||||
|
border-spacing 0
|
||||||
|
border-collapse collapse
|
||||||
|
|
||||||
|
thead
|
||||||
|
font-weight bold
|
||||||
|
border-bottom solid 2px #eee
|
||||||
|
|
||||||
|
tr
|
||||||
|
th
|
||||||
|
text-align left
|
||||||
|
|
||||||
|
tbody
|
||||||
|
tr
|
||||||
|
border-bottom dashed 1px #eee
|
||||||
|
|
||||||
|
th, td
|
||||||
|
padding 8px 16px
|
||||||
|
|
||||||
|
.i18n:not(.ja)
|
||||||
|
display none
|
|
@ -63,6 +63,12 @@ app.get('/manifest.json', (req, res) =>
|
||||||
*/
|
*/
|
||||||
app.get(/\/api:url/, require('./service/url-preview'));
|
app.get(/\/api:url/, require('./service/url-preview'));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Docs
|
||||||
|
*/
|
||||||
|
app.get(/^\/docs\/([a-z_\-\/]+?)$/, (req, res) =>
|
||||||
|
res.sendFile(`${__dirname}/docs/${req.params[0]}.html`));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Routing
|
* Routing
|
||||||
*/
|
*/
|
||||||
|
|
38
src/web/style.styl
Normal file
38
src/web/style.styl
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
json('../const.json')
|
||||||
|
|
||||||
|
@charset 'utf-8'
|
||||||
|
|
||||||
|
$theme-color = themeColor
|
||||||
|
$theme-color-foreground = themeColorForeground
|
||||||
|
|
||||||
|
/*
|
||||||
|
::selection
|
||||||
|
background $theme-color
|
||||||
|
color #fff
|
||||||
|
*/
|
||||||
|
|
||||||
|
*
|
||||||
|
position relative
|
||||||
|
box-sizing border-box
|
||||||
|
background-clip padding-box !important
|
||||||
|
tap-highlight-color rgba($theme-color, 0.7)
|
||||||
|
-webkit-tap-highlight-color rgba($theme-color, 0.7)
|
||||||
|
|
||||||
|
html, body
|
||||||
|
margin 0
|
||||||
|
padding 0
|
||||||
|
scroll-behavior smooth
|
||||||
|
text-size-adjust 100%
|
||||||
|
font-family sans-serif
|
||||||
|
|
||||||
|
a
|
||||||
|
text-decoration none
|
||||||
|
color $theme-color
|
||||||
|
cursor pointer
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
text-decoration underline
|
||||||
|
|
||||||
|
*
|
||||||
|
cursor pointer
|
||||||
|
|
Loading…
Reference in a new issue