Merge branch 'main' of git.learnjsthehardway.com:learn-javascript-the-hard-way/bandolier-template

main
Zed A. Shaw 11 months ago
commit 9e1fe951c8
  1. 8
      admin/bando/Bandolier.svelte
  2. 17
      admin/pages/Errors.svelte
  3. 71
      commands/indexnow.js
  4. 10
      static/djenterator/command.js

@ -109,7 +109,13 @@
</a>
<ul>
{#each errors as error, i}
<li>{ error.location.file}</li>
{#if error.location}
<li>{ error.location.file}</li>
{:else if error.filename}
<li>{ error.filename }</li>
{:else}
<li>Weird error, check console.</li>
{/if}
{/each}
</ul>
</bando>

@ -66,7 +66,7 @@
</top>
<items>
{#each errors as error}
<a on:click={ () => error_selected = error }>{ error.location.file}</a>
<a on:click={ () => error_selected = error }>{ error.location ? error.location.file : error.filename}</a>
{:else}
<h3>No Errors</h3>
<span>You currently have no errors that are shown. Try refreshing.</span>
@ -75,7 +75,8 @@
</sidebar>
<display>
{#if error_selected}
{#if error_selected}
{#if error_selected.location}
<h1>{error_selected.location.file} <Icon name="alert-circle" size="36" /></h1>
<h3>{ error_selected.text }</h3>
<pre>
@ -96,7 +97,17 @@
</code>
</pre>
{/each}
{/if}
{:else if error_selected.filename}
<h1>{error_selected.filename} <Icon name="alert-circle" size="36" /></h1>
<h3>{ error_selected.message }</h3>
<pre><code>{error_selected.code}</code></pre>
<h1>Stack</h1>
<pre><code>{ error_selected.stack }</code></pre>
{:else}
<p>Unknown error I've never seen before. Look in console and in `debug/` for error output files.</p>
{/if}
{/if}
</display>
</content>
{/await}

@ -0,0 +1,71 @@
// you may not need all of these but they come up a lot
import fs from "fs";
import logging from '../lib/logging.js';
import { og_base_host } from "../client/config.js";
import axios from "axios";
import crypto from "crypto";
import { glob, write } from "../lib/builderator.js";
const log = logging.create(import.meta.url);
const KEY_SIZE = 32;
const DEFAULT_ENGINE = "https://yandex.com";
export const description = "Uses IndexNow.org to submit your site for reindex. You'll need to configure your IndexNow.org account before doing this."
// your command uses the npm package commander's options format
export const options = [
["--gen-key", "If you don't have a key this will generate one."],
["--key-size <size>", "Key size to use with --gen-key", KEY_SIZE],
["--key <string>", "key to use"],
["--url <string>", "URL to submit", og_base_host],
["--key-path <path>", "Path to where the [key].txt should be stored. Command will ensure it's there or create it if not."],
["--search-engine <string>", "Company to notify, they're required to tell others.", DEFAULT_ENGINE],
]
const random_hex = (size) => {
return crypto.randomBytes(size).toString("hex");
}
// handy function for checking things are good and aborting
const check = (test, fail_message) => {
if(!test) {
log.error(fail_message);
process.exit(1);
}
}
export const main = async (opts) => {
if(opts.genKey) {
console.log(random_hex(parseInt(opts.keySize, 10)));
} else {
check(opts.key, "--key is required.");
check(opts.url, "--url is required.");
const keyfile = `${opts.keyPath}/${opts.key}.txt`;
// confirm the key file is in the right place
if(opts.keyPath && !fs.existsSync(keyfile)) {
console.log("WRITING KEY FILE", keyfile);
write(keyfile, opts.key);
}
const in_url = `${opts.searchEngine}/indexnow`;
const request = {
method: 'get', url: in_url,
data: { url: opts.url, key: opts.key}
};
try {
const result = await axios(request);
console.log("STATUS", result.status, "TEXT", result.statusText);
} catch(error) {
console.error(error.message, "REQUEST", request);
process.exit(1);
}
}
process.exit(0);
}

@ -32,6 +32,16 @@ const check = (test, fail_message) => {
}
}
/*
+ FOOTGUN: commander tries to be "fancy" and if you don't have
an `arguments` setting for positional arguments then you
have to change this to `(opts)` instead of `(arg, opts)`.
The reason is if your command doesn't have an argument, then
commander will call your main with only opts, and if it does
then it calls your main with arg, and opts. If you get weird
errors and `opts` looks like a `Command` object then this is
what happened.
*/
export const main = async (arg, opts) => {
// if they give an numeric option this is how you can convert it
// yes, this is annoying and commander should handle it but oh well

Loading…
Cancel
Save