Versionable APIs #283
11 changed files with 81 additions and 80 deletions
|
@ -56,9 +56,10 @@ function syncWithApi(data) { // eslint-disable-line no-unused-vars
|
|||
const address = data.address;
|
||||
const code = data.code;
|
||||
|
||||
if (code === null)
|
||||
if (code === null) {
|
||||
document.querySelector("developer-program").innerHTML =
|
||||
"<p><strong>There was an issue with accessing GitHub's API. Please try again later.</strong></p>";
|
||||
}
|
||||
|
||||
fetch(`https://api.lbry.com/reward/new?github_token=${code}&reward_type=github_developer&wallet_address=${address}`)
|
||||
.then(response => response.json())
|
||||
|
|
|
@ -249,11 +249,11 @@ curl --header <span class="token string">"Content-Type: application/json"</span>
|
|||
}
|
||||
|
||||
const handleExamples = debounce(event => {
|
||||
let exampleNumber;
|
||||
const exampleNumber = parseInt(document.querySelector(".playground-navigation__example.active").dataset.example || 0);
|
||||
const data = event.dataset;
|
||||
|
||||
if (!parseInt(document.querySelector(".playground-navigation__example.active").dataset.example)) return;
|
||||
exampleNumber = parseInt(document.querySelector(".playground-navigation__example.active").dataset.example);
|
||||
if (!exampleNumber || exampleNumber === 0)
|
||||
return;
|
||||
|
||||
switch(data.action) {
|
||||
case "choose claim":
|
||||
|
@ -398,9 +398,9 @@ function updateCanvas(imageSource) {
|
|||
if (imageSource) {
|
||||
ctx.drawImage(imageSource, 0, 0, canvasWidth, canvasHeight);
|
||||
img.src = imageSource.src;
|
||||
} else {
|
||||
} else
|
||||
ctx.drawImage(img, 0, 0, canvasWidth, canvasHeight);
|
||||
}
|
||||
|
||||
|
||||
positionCanvasText(ctx, canvasHeight, canvasWidth);
|
||||
}
|
||||
|
|
|
@ -68,11 +68,3 @@ export default (state, emit) => {
|
|||
<script src="/assets/scripts/sockets.js"></script>
|
||||
`;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// H E L P E R
|
||||
|
||||
String.prototype.capitalize = function() {
|
||||
return this.charAt(0).toUpperCase() + this.slice(1);
|
||||
};
|
||||
|
|
|
@ -55,10 +55,10 @@ export default async(data, socket) => {
|
|||
let dataDetails = "";
|
||||
let explorerNotice = "";
|
||||
|
||||
if (data.example === 1 && !data.claim || !data.method) return;
|
||||
if (data.example === 1 && (!data.claim || !data.method)) return;
|
||||
if (data.example === 2 && !data.data) return;
|
||||
if (data.example === 2) dataDetails = data.data; // file upload
|
||||
if (data.example === 3 && !data.claim || !data.method) return;
|
||||
if (data.example === 3 && (!data.claim || !data.method)) return;
|
||||
|
||||
const claimAddress = data.claim;
|
||||
const resolveMethod = data.method;
|
||||
|
@ -155,9 +155,7 @@ export default async(data, socket) => {
|
|||
message: "show result",
|
||||
selector: `#example${data.example}-result`
|
||||
});
|
||||
}
|
||||
|
||||
catch(memePublishError) {
|
||||
} catch(memePublishError) {
|
||||
send(socket, {
|
||||
details: "Meme publish failed",
|
||||
message: "notification",
|
||||
|
@ -174,9 +172,7 @@ export default async(data, socket) => {
|
|||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
catch(imageUploadError) {
|
||||
} catch(imageUploadError) {
|
||||
send(socket, {
|
||||
details: "Image upload failed",
|
||||
message: "notification",
|
||||
|
@ -259,9 +255,7 @@ export default async(data, socket) => {
|
|||
}
|
||||
|
||||
return response.body.result[Object.keys(response.body.result)[0]].claim;
|
||||
}
|
||||
|
||||
catch(error) {
|
||||
} catch(error) {
|
||||
messageSlack({
|
||||
message: "```" + error + "```",
|
||||
pretext: "_Someone is going through the Playground and the daemon is not running_",
|
||||
|
|
|
@ -16,15 +16,15 @@ import relativeDate from "~module/relative-date";
|
|||
|
||||
let octokit;
|
||||
|
||||
String.prototype.escape = function() {
|
||||
const tagsToReplace = {
|
||||
"&": "&",
|
||||
"<": "<",
|
||||
">": ">"
|
||||
};
|
||||
// String.prototype.escape = function() {
|
||||
// const tagsToReplace = {
|
||||
// "&": "&",
|
||||
// "<": "<",
|
||||
// ">": ">"
|
||||
// };
|
||||
|
||||
return this.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
|
||||
};
|
||||
// return this.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
|
||||
// };
|
||||
|
||||
// R E D I S
|
||||
|
||||
|
@ -142,7 +142,7 @@ function generateEvent(event) {
|
|||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
title="View this comment on GitHub"
|
||||
>${event.payload.issue.title.escape()}</a></em> in
|
||||
>${escapeSpecialCharacters(event.payload.issue.title)}</a></em> in
|
||||
`;
|
||||
} else {
|
||||
return `
|
||||
|
@ -153,7 +153,7 @@ function generateEvent(event) {
|
|||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
title="View this comment on GitHub"
|
||||
>${event.payload.issue.title.escape()}</a></em> in
|
||||
>${escapeSpecialCharacters(event.payload.issue.title)}</a></em> in
|
||||
`;
|
||||
}
|
||||
|
||||
|
@ -171,7 +171,7 @@ function generateEvent(event) {
|
|||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
title="View this issue on GitHub"
|
||||
>${event.payload.issue.title.escape()}</a></em> in
|
||||
>${escapeSpecialCharacters(event.payload.issue.title)}</a></em> in
|
||||
`;
|
||||
|
||||
case "PullRequestEvent":
|
||||
|
@ -188,7 +188,7 @@ function generateEvent(event) {
|
|||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
title="View this pull request on GitHub"
|
||||
>${event.payload.pull_request.title.escape()}</a></em> in
|
||||
>${escapeSpecialCharacters(event.payload.pull_request.title)}</a></em> in
|
||||
`;
|
||||
|
||||
case "PullRequestReviewCommentEvent":
|
||||
|
@ -205,7 +205,7 @@ function generateEvent(event) {
|
|||
rel="noopener noreferrer"
|
||||
target="_blank"
|
||||
title="View this comment on GitHub"
|
||||
>${event.payload.pull_request.title.escape()}</a></em> in
|
||||
>${escapeSpecialCharacters(event.payload.pull_request.title)}</a></em> in
|
||||
`;
|
||||
|
||||
case "PushEvent":
|
||||
|
@ -346,6 +346,9 @@ function updateGithubFeed() {
|
|||
const eventString = JSON.stringify(item);
|
||||
|
||||
client.zrank("events", eventString, (err, reply) => {
|
||||
if (err)
|
||||
return;
|
||||
|
||||
if (reply === null)
|
||||
client.zadd("events", item.id, eventString, callback);
|
||||
else
|
||||
|
@ -366,6 +369,16 @@ function updateGithubFeed() {
|
|||
|
||||
// H E L P E R
|
||||
|
||||
function escapeSpecialCharacters(contentToEscape) {
|
||||
const tagsToReplace = {
|
||||
"&": "&",
|
||||
"<": "<",
|
||||
">": ">"
|
||||
};
|
||||
|
||||
return contentToEscape.replace(/[&<>]/g, tag => tagsToReplace[tag] || tag);
|
||||
}
|
||||
|
||||
function refToBranch(ref) {
|
||||
if (ref)
|
||||
return ref.replace("refs/heads/", "");
|
||||
|
|
|
@ -22,7 +22,7 @@ import redirects from "~data/redirects.json";
|
|||
const server = fastify({
|
||||
logger: {
|
||||
level: "warn",
|
||||
prettyPrint: process.env.NODE_ENV === "development" ? true : false,
|
||||
prettyPrint: process.env.NODE_ENV === "development",
|
||||
redact: ["req.headers.authorization"],
|
||||
serializers: {
|
||||
req(req) {
|
||||
|
|
|
@ -16,16 +16,20 @@ function superscript(state, silent) {
|
|||
const max = state.posMax;
|
||||
const start = state.pos;
|
||||
let found;
|
||||
let content;
|
||||
let token;
|
||||
|
||||
if (state.src.charCodeAt(start) !== 0x5E/* ^ */) return false;
|
||||
if (silent) return false; // do not run pairs in validation mode
|
||||
if (start + 2 >= max) return false;
|
||||
if (state.src.charCodeAt(start) !== 0x5E/* ^ */)
|
||||
return false;
|
||||
|
||||
if (silent)
|
||||
return false; // do not run pairs in validation mode
|
||||
|
||||
if (start + 2 >= max)
|
||||
return false;
|
||||
|
||||
state.pos = start + 1;
|
||||
|
||||
while (state.pos < max) {
|
||||
while(state.pos < max) {
|
||||
if (state.src.charCodeAt(state.pos) === 0x5E/* ^ */) {
|
||||
found = true;
|
||||
break;
|
||||
|
@ -39,7 +43,7 @@ function superscript(state, silent) {
|
|||
return false;
|
||||
}
|
||||
|
||||
content = state.src.slice(start + 1, state.pos);
|
||||
const content = state.src.slice(start + 1, state.pos);
|
||||
|
||||
// do not allow unescaped spaces/newlines inside
|
||||
if (content.match(/(^|[^\\])(\\\\)*\s/)) {
|
||||
|
@ -59,16 +63,14 @@ function superscript(state, silent) {
|
|||
|
||||
if (content.match(regexForIds)) {
|
||||
const theLink = supText.match(regexForIds)[0].replace("(#", "").replace(")", "");
|
||||
|
||||
token.attrPush([ "id", theLink ]);
|
||||
token.attrPush(["id", theLink]); // eslint-disable-line padding-line-between-statements
|
||||
}
|
||||
|
||||
token = state.push("text", "", 0);
|
||||
|
||||
if (content.match(regexForIds)) {
|
||||
const theText = supText.match(regexForTextBeforeLink)[0];
|
||||
|
||||
token.content = theText;
|
||||
token.content = theText; // eslint-disable-line padding-line-between-statements
|
||||
} else token.content = supText;
|
||||
|
||||
token = state.push("sup_close", "sup", -1);
|
||||
|
@ -84,6 +86,6 @@ function superscript(state, silent) {
|
|||
|
||||
// E X P O R T
|
||||
|
||||
module.exports = exports = function sup_plugin(md) {
|
||||
module.exports = exports = function sup_plugin(md) { // eslint-disable-line camelcase
|
||||
md.inline.ruler.after("emphasis", "sup", superscript);
|
||||
};
|
||||
|
|
|
@ -14,23 +14,23 @@ const relativeDate = (() => {
|
|||
const MONTH = YEAR / 12;
|
||||
|
||||
const formats = [
|
||||
[ 0.7 * MINUTE, "just now" ],
|
||||
[ 1.5 * MINUTE, "a minute ago" ],
|
||||
[ 60 * MINUTE, "minutes ago", MINUTE ],
|
||||
[ 1.5 * HOUR, "an hour ago" ],
|
||||
[ DAY, "hours ago", HOUR ],
|
||||
[ 2 * DAY, "yesterday" ],
|
||||
[ 7 * DAY, "days ago", DAY ],
|
||||
[ 1.5 * WEEK, "a week ago" ],
|
||||
[ MONTH, "weeks ago", WEEK ],
|
||||
[ 1.5 * MONTH, "a month ago" ],
|
||||
[ YEAR, "months ago", MONTH ],
|
||||
[ 1.5 * YEAR, "a year ago" ],
|
||||
[ Number.MAX_VALUE, "years ago", YEAR ]
|
||||
[0.7 * MINUTE, "just now"],
|
||||
[1.5 * MINUTE, "a minute ago"],
|
||||
[60 * MINUTE, "minutes ago", MINUTE],
|
||||
[1.5 * HOUR, "an hour ago"],
|
||||
[DAY, "hours ago", HOUR],
|
||||
[2 * DAY, "yesterday"],
|
||||
[7 * DAY, "days ago", DAY],
|
||||
[1.5 * WEEK, "a week ago"],
|
||||
[MONTH, "weeks ago", WEEK],
|
||||
[1.5 * MONTH, "a month ago"],
|
||||
[YEAR, "months ago", MONTH],
|
||||
[1.5 * YEAR, "a year ago"],
|
||||
[Number.MAX_VALUE, "years ago", YEAR]
|
||||
];
|
||||
|
||||
function relativeDate(input, reference) {
|
||||
!reference && (reference = (new Date).getTime());
|
||||
!reference && (reference = (new Date()).getTime());
|
||||
reference instanceof Date && (reference = reference.getTime());
|
||||
input instanceof Date && (input = input.getTime());
|
||||
|
||||
|
@ -40,9 +40,8 @@ const relativeDate = (() => {
|
|||
for (let i = -1; ++i < len;) {
|
||||
const format = formats[i];
|
||||
|
||||
if (delta < format[0]) {
|
||||
if (delta < format[0])
|
||||
return format[2] === undefined ? format[1] : Math.round(delta / format[2]) + " " + format[1];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -124,12 +124,13 @@ function generateContent(exampleNumber, displayTrendingContent) {
|
|||
const renderedContentCollection = [];
|
||||
const trendingContentData = response.data;
|
||||
|
||||
for (const data of trendingContentData)
|
||||
for (const data of trendingContentData) {
|
||||
rawContentCollection.push(fetchMetadata({
|
||||
claim: data.url,
|
||||
example: exampleNumber,
|
||||
method: "resolve"
|
||||
}));
|
||||
}
|
||||
|
||||
Promise.all(rawContentCollection).then(collection => {
|
||||
for (const part of collection) {
|
||||
|
|
|
@ -45,9 +45,10 @@ export default async(state) => {
|
|||
};
|
||||
|
||||
const tags = await getTags(repository);
|
||||
const currentTag = tag.length ? tag : tags[0];
|
||||
|
||||
try {
|
||||
const apiResponse = await parseApiFile({ repo: repository, tag: tag ? tag : tags[0] });
|
||||
const apiResponse = await parseApiFile({ repo: repository, tag: currentTag });
|
||||
|
||||
return asyncHtml`
|
||||
<div class="__slate">
|
||||
|
@ -75,7 +76,7 @@ export default async(state) => {
|
|||
${renderCodeLanguageToggles(wildcard)}
|
||||
</nav>
|
||||
|
||||
${createApiHeader(wildcard, tag ? tag : tags[0])}
|
||||
${createApiHeader(wildcard, currentTag)}
|
||||
${wildcard === "sdk" ? createSdkContent(apiResponse) : createApiContent(apiResponse)}
|
||||
</div>
|
||||
</section>
|
||||
|
@ -93,9 +94,7 @@ export default async(state) => {
|
|||
</script>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
catch(error) {
|
||||
} catch(error) {
|
||||
const redirectUrl = redirects[state.href];
|
||||
|
||||
return asyncHtml`
|
||||
|
@ -326,7 +325,7 @@ function renderArguments(args) {
|
|||
<li class="api-content__body-argument">
|
||||
<div class="left">
|
||||
<strong>${arg.name}</strong><br/>
|
||||
${arg.is_required === true ? "" : "<span>optional</span>" }<span>${arg.type}</span>
|
||||
${arg.is_required === true ? "" : "<span>optional</span>"}<span>${arg.type}</span>
|
||||
</div>
|
||||
|
||||
<div class="right">${typeof arg.description === "string" ? arg.description.replace(/</g, "<").replace(/>/g, ">") : ""}</div>
|
||||
|
|
14
package.json
14
package.json
|
@ -12,7 +12,7 @@
|
|||
"dependencies": {
|
||||
"@babel/polyfill": "^7.4.4",
|
||||
"@inc/fastify-ws": "^1.1.0",
|
||||
"@octokit/rest": "^16.28.2",
|
||||
"@octokit/rest": "^16.28.3",
|
||||
"@slack/client": "^5.0.1",
|
||||
"async": "^3.1.0",
|
||||
"async-es": "^3.1.0",
|
||||
|
@ -38,7 +38,7 @@
|
|||
"graceful-fs": "^4.2.0",
|
||||
"link-module-alias": "^1.2.0",
|
||||
"make-promises-safe": "^5.0.0",
|
||||
"markdown-it": "^8.4.2",
|
||||
"markdown-it": "^9.0.0",
|
||||
"markdown-it-anchor": "^5.2.4",
|
||||
"prismjs": "^1.15.0",
|
||||
"redis": "^2.8.0",
|
||||
|
@ -49,20 +49,20 @@
|
|||
"description": "Documentation for the LBRY protocol and associated projects",
|
||||
"devDependencies": {
|
||||
"@babel/cli": "^7.5.0",
|
||||
"@babel/core": "^7.5.0",
|
||||
"@babel/core": "^7.5.4",
|
||||
"@babel/plugin-external-helpers": "7.2.0",
|
||||
"@babel/plugin-proposal-class-properties": "7.5.0",
|
||||
"@babel/plugin-proposal-decorators": "7.4.4",
|
||||
"@babel/plugin-proposal-export-namespace-from": "7.2.0",
|
||||
"@babel/plugin-proposal-export-namespace-from": "7.5.2",
|
||||
"@babel/plugin-proposal-function-sent": "7.5.0",
|
||||
"@babel/plugin-proposal-json-strings": "7.2.0",
|
||||
"@babel/plugin-proposal-numeric-separator": "7.2.0",
|
||||
"@babel/plugin-proposal-throw-expressions": "7.2.0",
|
||||
"@babel/plugin-syntax-dynamic-import": "7.2.0",
|
||||
"@babel/plugin-syntax-import-meta": "7.2.0",
|
||||
"@babel/preset-env": "^7.5.0",
|
||||
"@babel/preset-env": "^7.5.4",
|
||||
"@babel/register": "^7.4.4",
|
||||
"@inc/eslint-config": "^1.1.3",
|
||||
"@inc/eslint-config": "^2019.7.11",
|
||||
"@inc/sasslint-config": "^2019.6.22",
|
||||
"@lbry/color": "^1.1.1",
|
||||
"@lbry/components": "^2.7.4",
|
||||
|
@ -74,7 +74,7 @@
|
|||
"sass": "^1.22.3",
|
||||
"sass-lint": "^1.13.1",
|
||||
"snazzy": "^8.0.0",
|
||||
"standardx": "^3.0.1",
|
||||
"standardx": "^4.0.0",
|
||||
"updates": "^8.2.1"
|
||||
},
|
||||
"engines": {
|
||||
|
|
Loading…
Reference in a new issue