sourcemonkey 0.0.0-stage → 0.5.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 +21 -0
- package/README.md +87 -2
- package/dist/bytes.js +37 -0
- package/dist/channel-placeholder.js +5 -0
- package/dist/collection-scan.js +17 -0
- package/dist/collections.html +353 -0
- package/dist/compare.html +358 -0
- package/dist/composed-source.js +205 -0
- package/dist/connect-prompt.html +47 -0
- package/dist/debug/icons.html +211 -0
- package/dist/debug/storage.html +163 -0
- package/dist/debug-log.js +75 -0
- package/dist/diagnostic-location.js +64 -0
- package/dist/eval-hook.js +308 -0
- package/dist/extension/background.js +5263 -0
- package/dist/extension/channel.js +133 -0
- package/dist/extension/code-links.js +187 -0
- package/dist/extension/code-tabs.js +460 -0
- package/dist/extension/collection-dialog.js +619 -0
- package/dist/extension/collection-display.js +322 -0
- package/dist/extension/collections.js +2905 -0
- package/dist/extension/compare.js +867 -0
- package/dist/extension/concurrency.js +186 -0
- package/dist/extension/connect-grants.js +109 -0
- package/dist/extension/connect-prompt-page.js +70 -0
- package/dist/extension/connect-prompt.js +266 -0
- package/dist/extension/copy-button.js +63 -0
- package/dist/extension/copy-dialog.js +502 -0
- package/dist/extension/copy-preference.js +66 -0
- package/dist/extension/debug/icons.js +203 -0
- package/dist/extension/debug/storage.js +365 -0
- package/dist/extension/deep-link.js +77 -0
- package/dist/extension/delete-dialog.js +432 -0
- package/dist/extension/delete-icon.js +40 -0
- package/dist/extension/details-tooltips.js +66 -0
- package/dist/extension/directories.js +679 -0
- package/dist/extension/export-backup.js +407 -0
- package/dist/extension/export-dialog.js +142 -0
- package/dist/extension/file-access.js +74 -0
- package/dist/extension/file-changes.js +346 -0
- package/dist/extension/frame-info.js +85 -0
- package/dist/extension/github-provider.js +336 -0
- package/dist/extension/glyph.js +84 -0
- package/dist/extension/gm-bindings.js +601 -0
- package/dist/extension/gm-download.js +419 -0
- package/dist/extension/gm-menu.js +228 -0
- package/dist/extension/gm-notification.js +141 -0
- package/dist/extension/gm-originator-map.js +23 -0
- package/dist/extension/gm-tab-data.js +121 -0
- package/dist/extension/gm-tab.js +160 -0
- package/dist/extension/gm-url-change.js +111 -0
- package/dist/extension/gm-url-scheme.js +27 -0
- package/dist/extension/gm-values.js +176 -0
- package/dist/extension/gm-window-control.js +104 -0
- package/dist/extension/gm-xhr-headers.js +333 -0
- package/dist/extension/gm-xhr.js +584 -0
- package/dist/extension/injector.js +3145 -0
- package/dist/extension/install-capture.js +277 -0
- package/dist/extension/line-diff.js +233 -0
- package/dist/extension/local-copy.js +560 -0
- package/dist/extension/local-delete.js +276 -0
- package/dist/extension/location-kinds.js +108 -0
- package/dist/extension/log-format.js +158 -0
- package/dist/extension/managed-changes.js +361 -0
- package/dist/extension/managed-items.js +57 -0
- package/dist/extension/match-index.js +375 -0
- package/dist/extension/missing-scripts.js +66 -0
- package/dist/extension/more-menu.js +109 -0
- package/dist/extension/move-dialog.js +197 -0
- package/dist/extension/offscreen.js +37 -0
- package/dist/extension/options.js +504 -0
- package/dist/extension/page-heading.js +170 -0
- package/dist/extension/page-links.js +199 -0
- package/dist/extension/parse-check-client.js +70 -0
- package/dist/extension/parse-check.js +161 -0
- package/dist/extension/parse-sandbox-host.js +172 -0
- package/dist/extension/parse-sandbox.js +175 -0
- package/dist/extension/popup-commands-open.js +41 -0
- package/dist/extension/popup-view.js +387 -0
- package/dist/extension/popup.js +703 -0
- package/dist/extension/prism-userscript.js +53 -0
- package/dist/extension/refresh-error.js +136 -0
- package/dist/extension/refresh-targets.js +160 -0
- package/dist/extension/related-versions.js +1144 -0
- package/dist/extension/resize-observer-loop.js +19 -0
- package/dist/extension/row-cache.js +387 -0
- package/dist/extension/script-blobs.js +413 -0
- package/dist/extension/script-details.js +658 -0
- package/dist/extension/script-enablement.js +285 -0
- package/dist/extension/script-identity.js +310 -0
- package/dist/extension/script-keys.js +54 -0
- package/dist/extension/script-log-id.js +155 -0
- package/dist/extension/script-log.js +290 -0
- package/dist/extension/script-rejection.js +104 -0
- package/dist/extension/script-sites.js +158 -0
- package/dist/extension/script-store.js +3507 -0
- package/dist/extension/script-updater.js +991 -0
- package/dist/extension/script-url-hash.js +61 -0
- package/dist/extension/select-all.js +37 -0
- package/dist/extension/select-open-guard.js +90 -0
- package/dist/extension/site-icon.js +1261 -0
- package/dist/extension/sm-dev-link.js +302 -0
- package/dist/extension/solo-click.js +58 -0
- package/dist/extension/sticky-numbers.js +188 -0
- package/dist/extension/storage-breakdown.js +253 -0
- package/dist/extension/storage-scan.js +86 -0
- package/dist/extension/storage-usage.js +194 -0
- package/dist/extension/structural-keys.js +29 -0
- package/dist/extension/sw-teardown.js +36 -0
- package/dist/extension/tab-status.js +403 -0
- package/dist/extension/toolbar-summary.js +105 -0
- package/dist/extension/user-scripts-access.js +43 -0
- package/dist/extension/userscript.js +3672 -0
- package/dist/extension/value-store.js +204 -0
- package/dist/extension/version-probe-fetch.js +68 -0
- package/dist/extension/worker-client.js +109 -0
- package/dist/extension/worker-ops.js +171 -0
- package/dist/extension/zip-writer.js +24 -0
- package/dist/external-files.js +878 -0
- package/dist/file-loader.js +436 -0
- package/dist/file-locations.js +439 -0
- package/dist/generated-wrappers.js +5 -0
- package/dist/github-auth.js +148 -0
- package/dist/github-urls.js +46 -0
- package/dist/gm-api-catalog.js +217 -0
- package/dist/gm-connect.js +273 -0
- package/dist/gm-xhr-types.js +5 -0
- package/dist/http-read.js +142 -0
- package/dist/icons/icon-128.png +0 -0
- package/dist/icons/icon-16.png +0 -0
- package/dist/icons/icon-48.png +0 -0
- package/dist/local-file-overrides.js +558 -0
- package/dist/manifest.json +38 -0
- package/dist/markup-response.js +126 -0
- package/dist/match-targets.js +305 -0
- package/dist/menu-captions.js +22 -0
- package/dist/offscreen.html +39 -0
- package/dist/options.html +197 -0
- package/dist/parse-check-protocol.js +51 -0
- package/dist/parse-location.js +171 -0
- package/dist/parse-sandbox.html +56 -0
- package/dist/phase-timing.js +155 -0
- package/dist/popup.html +197 -0
- package/dist/public-suffixes.js +6957 -0
- package/dist/run-context.js +31 -0
- package/dist/runtime-messages.js +34 -0
- package/dist/sandboxed-page.js +35 -0
- package/dist/script-build.js +787 -0
- package/dist/script-display.js +383 -0
- package/dist/script-icon.js +43 -0
- package/dist/script-links.js +204 -0
- package/dist/script-source-url.js +214 -0
- package/dist/script-world.js +65 -0
- package/dist/sm-dev-protocol.js +84 -0
- package/dist/source-map.js +177 -0
- package/dist/stack-link.js +138 -0
- package/dist/styles.css +825 -0
- package/dist/unsafe-window-use.js +229 -0
- package/dist/url-match.js +734 -0
- package/dist/userscript-header.js +248 -0
- package/dist/userscript.html +1165 -0
- package/dist/vendor/fflate.LICENSE +21 -0
- package/dist/vendor/fflate.js +2692 -0
- package/dist/vendor/prism/prism-line-numbers.css +1 -0
- package/dist/vendor/prism/prism-line-numbers.js +1 -0
- package/dist/vendor/prism/prism.css +1 -0
- package/dist/vendor/prism/prism.js +1946 -0
- package/dist/version-compare.js +141 -0
- package/dist/version-probe.js +120 -0
- package/lib/build-info.json +1 -0
- package/lib/bytes.d.ts +3 -0
- package/lib/bytes.js +37 -0
- package/lib/channel-placeholder.d.ts +1 -0
- package/lib/channel-placeholder.js +5 -0
- package/lib/collection-scan.d.ts +8 -0
- package/lib/collection-scan.js +17 -0
- package/lib/composed-source.d.ts +28 -0
- package/lib/composed-source.js +205 -0
- package/lib/debug-log.d.ts +9 -0
- package/lib/debug-log.js +75 -0
- package/lib/diagnostic-location.d.ts +8 -0
- package/lib/diagnostic-location.js +64 -0
- package/lib/eval-hook.d.ts +34 -0
- package/lib/eval-hook.js +308 -0
- package/lib/external-files.d.ts +111 -0
- package/lib/external-files.js +878 -0
- package/lib/file-loader.d.ts +48 -0
- package/lib/file-loader.js +436 -0
- package/lib/file-locations.d.ts +44 -0
- package/lib/file-locations.js +439 -0
- package/lib/generated-wrappers.d.ts +11 -0
- package/lib/generated-wrappers.js +5 -0
- package/lib/github-auth.d.ts +12 -0
- package/lib/github-auth.js +148 -0
- package/lib/github-urls.d.ts +1 -0
- package/lib/github-urls.js +46 -0
- package/lib/gm-api-catalog.d.ts +24 -0
- package/lib/gm-api-catalog.js +217 -0
- package/lib/gm-connect.d.ts +34 -0
- package/lib/gm-connect.js +273 -0
- package/lib/gm-xhr-types.d.ts +68 -0
- package/lib/gm-xhr-types.js +5 -0
- package/lib/harness/browser-extensions.d.ts +73 -0
- package/lib/harness/browser-extensions.js +285 -0
- package/lib/harness/browser-lang.d.ts +20 -0
- package/lib/harness/browser-lang.js +86 -0
- package/lib/harness/browser-launch.d.ts +14 -0
- package/lib/harness/browser-launch.js +184 -0
- package/lib/harness/checks.d.ts +110 -0
- package/lib/harness/checks.js +321 -0
- package/lib/harness/cli.d.ts +2 -0
- package/lib/harness/cli.js +2259 -0
- package/lib/harness/command-args.d.ts +91 -0
- package/lib/harness/command-args.js +369 -0
- package/lib/harness/command-lines.d.ts +80 -0
- package/lib/harness/command-lines.js +180 -0
- package/lib/harness/command-list.d.ts +206 -0
- package/lib/harness/command-list.js +1475 -0
- package/lib/harness/console-commands.d.ts +463 -0
- package/lib/harness/console-commands.js +3216 -0
- package/lib/harness/download-watch.d.ts +21 -0
- package/lib/harness/download-watch.js +156 -0
- package/lib/harness/extension-backend.d.ts +41 -0
- package/lib/harness/extension-backend.js +100 -0
- package/lib/harness/extension-host.d.ts +112 -0
- package/lib/harness/extension-host.js +552 -0
- package/lib/harness/extension-launch.d.ts +67 -0
- package/lib/harness/extension-launch.js +285 -0
- package/lib/harness/extension-link.d.ts +315 -0
- package/lib/harness/extension-link.js +607 -0
- package/lib/harness/external-manager.d.ts +146 -0
- package/lib/harness/external-manager.js +414 -0
- package/lib/harness/fixture.d.ts +165 -0
- package/lib/harness/fixture.js +461 -0
- package/lib/harness/frame-sessions.d.ts +71 -0
- package/lib/harness/frame-sessions.js +248 -0
- package/lib/harness/frames.d.ts +68 -0
- package/lib/harness/frames.js +216 -0
- package/lib/harness/help-format.d.ts +17 -0
- package/lib/harness/help-format.js +127 -0
- package/lib/harness/host.d.ts +352 -0
- package/lib/harness/host.js +423 -0
- package/lib/harness/index.d.ts +8 -0
- package/lib/harness/index.js +10 -0
- package/lib/harness/input-file.d.ts +18 -0
- package/lib/harness/input-file.js +61 -0
- package/lib/harness/json-output.d.ts +565 -0
- package/lib/harness/json-output.js +71 -0
- package/lib/harness/manager-actions.d.ts +21 -0
- package/lib/harness/manager-actions.js +129 -0
- package/lib/harness/manager-commands.d.ts +142 -0
- package/lib/harness/manager-commands.js +1196 -0
- package/lib/harness/manager-fetch.d.ts +33 -0
- package/lib/harness/manager-fetch.js +239 -0
- package/lib/harness/managers.d.ts +24 -0
- package/lib/harness/managers.js +27 -0
- package/lib/harness/output-style.d.ts +125 -0
- package/lib/harness/output-style.js +322 -0
- package/lib/harness/page-commands.d.ts +134 -0
- package/lib/harness/page-commands.js +1141 -0
- package/lib/harness/page-output.d.ts +67 -0
- package/lib/harness/page-output.js +139 -0
- package/lib/harness/page-watch.d.ts +171 -0
- package/lib/harness/page-watch.js +607 -0
- package/lib/harness/parse-check-node.d.ts +3 -0
- package/lib/harness/parse-check-node.js +132 -0
- package/lib/harness/path-args.d.ts +22 -0
- package/lib/harness/path-args.js +148 -0
- package/lib/harness/playwright-chromium.d.ts +16 -0
- package/lib/harness/playwright-chromium.js +86 -0
- package/lib/harness/prepare.d.ts +168 -0
- package/lib/harness/prepare.js +364 -0
- package/lib/harness/prompt-editor.d.ts +17 -0
- package/lib/harness/prompt-editor.js +354 -0
- package/lib/harness/prompt-history.d.ts +13 -0
- package/lib/harness/prompt-history.js +89 -0
- package/lib/harness/rebuild-advice.d.ts +6 -0
- package/lib/harness/rebuild-advice.js +39 -0
- package/lib/harness/run-log.d.ts +47 -0
- package/lib/harness/run-log.js +140 -0
- package/lib/harness/run-logs.d.ts +132 -0
- package/lib/harness/run-logs.js +241 -0
- package/lib/harness/run.d.ts +194 -0
- package/lib/harness/run.js +1973 -0
- package/lib/harness/runs.d.ts +229 -0
- package/lib/harness/runs.js +726 -0
- package/lib/harness/save-html.d.ts +39 -0
- package/lib/harness/save-html.js +89 -0
- package/lib/harness/saved-pages.d.ts +120 -0
- package/lib/harness/saved-pages.js +275 -0
- package/lib/harness/script-mark.d.ts +17 -0
- package/lib/harness/script-mark.js +56 -0
- package/lib/harness/snapshot.d.ts +143 -0
- package/lib/harness/snapshot.js +474 -0
- package/lib/harness/stuck-tabs.d.ts +19 -0
- package/lib/harness/stuck-tabs.js +131 -0
- package/lib/harness/tab-refs.d.ts +20 -0
- package/lib/harness/tab-refs.js +80 -0
- package/lib/harness/tampermonkey.d.ts +71 -0
- package/lib/harness/tampermonkey.js +356 -0
- package/lib/harness/tm-ids.d.ts +18 -0
- package/lib/harness/tm-ids.js +88 -0
- package/lib/harness/violentmonkey.d.ts +34 -0
- package/lib/harness/violentmonkey.js +162 -0
- package/lib/harness/wait.d.ts +77 -0
- package/lib/harness/wait.js +458 -0
- package/lib/http-read.d.ts +30 -0
- package/lib/http-read.js +142 -0
- package/lib/local-file-overrides.d.ts +35 -0
- package/lib/local-file-overrides.js +558 -0
- package/lib/manifest.json +38 -0
- package/lib/markup-response.d.ts +11 -0
- package/lib/markup-response.js +126 -0
- package/lib/match-targets.d.ts +18 -0
- package/lib/match-targets.js +305 -0
- package/lib/menu-captions.d.ts +1 -0
- package/lib/menu-captions.js +22 -0
- package/lib/parse-check-protocol.d.ts +27 -0
- package/lib/parse-check-protocol.js +51 -0
- package/lib/parse-location.d.ts +12 -0
- package/lib/parse-location.js +171 -0
- package/lib/phase-timing.d.ts +12 -0
- package/lib/phase-timing.js +155 -0
- package/lib/public-suffixes.d.ts +1 -0
- package/lib/public-suffixes.js +6957 -0
- package/lib/run-context.d.ts +2 -0
- package/lib/run-context.js +31 -0
- package/lib/runtime-messages.d.ts +10 -0
- package/lib/runtime-messages.js +34 -0
- package/lib/sandboxed-page.d.ts +5 -0
- package/lib/sandboxed-page.js +35 -0
- package/lib/script-build.d.ts +111 -0
- package/lib/script-build.js +787 -0
- package/lib/script-display.d.ts +51 -0
- package/lib/script-display.js +383 -0
- package/lib/script-icon.d.ts +16 -0
- package/lib/script-icon.js +43 -0
- package/lib/script-links.d.ts +24 -0
- package/lib/script-links.js +204 -0
- package/lib/script-source-url.d.ts +8 -0
- package/lib/script-source-url.js +214 -0
- package/lib/script-world.d.ts +6 -0
- package/lib/script-world.js +65 -0
- package/lib/sm-dev-protocol.d.ts +251 -0
- package/lib/sm-dev-protocol.js +84 -0
- package/lib/source-map.d.ts +32 -0
- package/lib/source-map.js +177 -0
- package/lib/stack-link.d.ts +15 -0
- package/lib/stack-link.js +138 -0
- package/lib/unsafe-window-use.d.ts +1 -0
- package/lib/unsafe-window-use.js +229 -0
- package/lib/url-match.d.ts +40 -0
- package/lib/url-match.js +734 -0
- package/lib/userscript-header.d.ts +33 -0
- package/lib/userscript-header.js +248 -0
- package/lib/version-compare.d.ts +6 -0
- package/lib/version-compare.js +141 -0
- package/lib/version-probe.d.ts +17 -0
- package/lib/version-probe.js +120 -0
- package/package.json +55 -3
- package/skills/SourceMonkey-dev/SKILL.md +868 -0
- package/skills/SourceMonkey-dev/references/cdp.md +293 -0
- package/skills/SourceMonkey-dev/references/commands.md +297 -0
- package/skills/SourceMonkey-dev/references/other-managers.md +63 -0
- package/skills/SourceMonkey-dev/references/specs.md +46 -0
- package/skills/SourceMonkey-friction/SKILL.md +103 -0
- package/skills/SourceMonkey-friction/references/template.md +59 -0
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// Maps a script's URL on a userscript-hosting site back to the
|
|
2
|
+
// human-facing page it was published on.
|
|
3
|
+
//
|
|
4
|
+
// Why this exists: what we store and fetch from these sites is the
|
|
5
|
+
// *raw code* URL, which is not a page a person would want to open —
|
|
6
|
+
// the listing page with the description, version history, and comments
|
|
7
|
+
// is a sibling URL. Each site encodes the script's identity in its
|
|
8
|
+
// code URL, so the page URL is a pure rewrite: no network call, no
|
|
9
|
+
// stored field.
|
|
10
|
+
//
|
|
11
|
+
// The per-site URL shapes live in `SITE_RULES` below and nowhere else;
|
|
12
|
+
// `docs/script-viewer.md` tabulates them for readers who aren't in
|
|
13
|
+
// this file.
|
|
14
|
+
//
|
|
15
|
+
// Pure string/URL logic, no DOM and no chrome.* calls, so the table is
|
|
16
|
+
// unit testable.
|
|
17
|
+
// Greasy Fork and its adult-content sibling Sleazy Fork run the same
|
|
18
|
+
// software, so one rule builder serves both:
|
|
19
|
+
//
|
|
20
|
+
// https://greasyfork.org/en/scripts/12345-my-script/code/my%20script.user.js
|
|
21
|
+
// https://greasyfork.org/en/scripts/12345-my-script (page)
|
|
22
|
+
// → https://greasyfork.org/en/scripts/12345-my-script
|
|
23
|
+
// https://update.greasyfork.org/scripts/12345/my%20script.user.js
|
|
24
|
+
// → https://greasyfork.org/scripts/12345
|
|
25
|
+
//
|
|
26
|
+
// The numeric id alone resolves the page and is the whole identity, so
|
|
27
|
+
// the `-<slug>` tail and the locale prefix are display-only and stay
|
|
28
|
+
// out of the key. The locale (`/en/`, `/zh-CN/`, `/es-419/`) is
|
|
29
|
+
// matched loosely on purpose: an unrecognised shape would fail the
|
|
30
|
+
// whole match and drop the row, rather than fall back to the
|
|
31
|
+
// locale-less page.
|
|
32
|
+
//
|
|
33
|
+
// The path is read WITHOUT `decodeURI`: both captures are
|
|
34
|
+
// encoding-agnostic, and decoding would splice a raw space or a
|
|
35
|
+
// decoded CJK slug into the href, disagreeing with every other URL
|
|
36
|
+
// the panel prints.
|
|
37
|
+
const FORK_PATH_RE = /^\/(?:([A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,})?)\/)?scripts\/(\d+)(-[^/]*)?(?:\/|$)/;
|
|
38
|
+
function forkRule(siteName, host) {
|
|
39
|
+
return {
|
|
40
|
+
siteName,
|
|
41
|
+
hosts: [host, `www.${host}`, `update.${host}`],
|
|
42
|
+
page: (url) => {
|
|
43
|
+
const m = FORK_PATH_RE.exec(url.pathname);
|
|
44
|
+
if (!m)
|
|
45
|
+
return null;
|
|
46
|
+
const locale = m[1] ? `/${m[1]}` : '';
|
|
47
|
+
return {
|
|
48
|
+
url: `https://${host}${locale}/scripts/${m[2]}${m[3] ?? ''}`,
|
|
49
|
+
key: `${host}:${m[2]}`,
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
// GitHub proper is deliberately absent: `raw.githubusercontent.com`
|
|
55
|
+
// URLs are already rewritten to their `github.com/<o>/<r>/blob/...`
|
|
56
|
+
// page form before they reach the viewer (see `githubRawToBlobUrl` in
|
|
57
|
+
// `github-provider.ts`), so the Location row is the page link. Gists get
|
|
58
|
+
// a rule because that rewrite doesn't cover them.
|
|
59
|
+
const SITE_RULES = [
|
|
60
|
+
forkRule('Greasy Fork', 'greasyfork.org'),
|
|
61
|
+
forkRule('Sleazy Fork', 'sleazyfork.org'),
|
|
62
|
+
{
|
|
63
|
+
// https://openuserjs.org/install/User/Script_Name.user.js
|
|
64
|
+
// https://openuserjs.org/src/scripts/User/Script_Name.user.js
|
|
65
|
+
// https://openuserjs.org/scripts/User/Script_Name (page)
|
|
66
|
+
// → https://openuserjs.org/scripts/User/Script_Name
|
|
67
|
+
siteName: 'OpenUserJS',
|
|
68
|
+
hosts: ['openuserjs.org', 'www.openuserjs.org'],
|
|
69
|
+
page: (url) => {
|
|
70
|
+
const code = /^\/(?:install|src\/scripts)\/([^/]+)\/(.+?)\.user\.js$/.exec(url.pathname);
|
|
71
|
+
// The page form may carry trailing sections (`/issues`), which
|
|
72
|
+
// name the same script.
|
|
73
|
+
const page = /^\/scripts\/([^/]+)\/([^/]+)(?:\/.*)?$/.exec(url.pathname);
|
|
74
|
+
const m = code ?? page;
|
|
75
|
+
if (!m)
|
|
76
|
+
return null;
|
|
77
|
+
return {
|
|
78
|
+
url: `https://openuserjs.org/scripts/${m[1]}/${m[2]}`,
|
|
79
|
+
key: `openuserjs.org:${m[1]}/${m[2]}`,
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
// https://gist.githubusercontent.com/user/<id>/raw/<sha>/file.user.js
|
|
85
|
+
// https://gist.github.com/user/<id> (page)
|
|
86
|
+
// → https://gist.github.com/user/<id>
|
|
87
|
+
// The gist id is unique on its own, and the user segment's case
|
|
88
|
+
// can differ between spellings, so only the id goes in the key.
|
|
89
|
+
siteName: 'GitHub Gist',
|
|
90
|
+
hosts: ['gist.githubusercontent.com', 'gist.github.com'],
|
|
91
|
+
page: (url) => {
|
|
92
|
+
const m = /^\/([^/]+)\/([0-9a-fA-F]+)(?:\/raw(?:\/|$)|\/?$)/.exec(url.pathname);
|
|
93
|
+
if (!m)
|
|
94
|
+
return null;
|
|
95
|
+
return {
|
|
96
|
+
url: `https://gist.github.com/${m[1]}/${m[2]}`,
|
|
97
|
+
key: `gist.github.com:${m[2].toLowerCase()}`,
|
|
98
|
+
};
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
// The publishing site's page for a script URL, or null when the URL
|
|
103
|
+
// isn't from a site we know how to rewrite — the common case (a local
|
|
104
|
+
// file, a plain web server, a GitHub blob).
|
|
105
|
+
export function scriptSitePage(scriptUrl) {
|
|
106
|
+
let url;
|
|
107
|
+
try {
|
|
108
|
+
url = new URL(scriptUrl);
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:')
|
|
114
|
+
return null;
|
|
115
|
+
const host = url.hostname.toLowerCase();
|
|
116
|
+
for (const rule of SITE_RULES) {
|
|
117
|
+
if (!rule.hosts.includes(host))
|
|
118
|
+
continue;
|
|
119
|
+
const page = rule.page(url);
|
|
120
|
+
return page ? { siteName: rule.siteName, url: page.url, key: page.key } : null;
|
|
121
|
+
}
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
// The details panel's whole decision about the hosting-site row, kept
|
|
125
|
+
// here (rather than in the DOM builder) so the interesting part is
|
|
126
|
+
// unit testable: which label, which URL, and when NOT to show a row.
|
|
127
|
+
//
|
|
128
|
+
// No row when it would only repeat something already on screen: the
|
|
129
|
+
// script's own `@homepage` names the same script (the Homepage row
|
|
130
|
+
// above already links it), or the Location row is itself the page URL
|
|
131
|
+
// (possible when a script was installed from a page-shaped URL).
|
|
132
|
+
export function sitePageRow(locationUrl, declaredHomepage) {
|
|
133
|
+
const site = scriptSitePage(locationUrl);
|
|
134
|
+
if (!site)
|
|
135
|
+
return null;
|
|
136
|
+
if (samePageUrl(site.url, locationUrl))
|
|
137
|
+
return null;
|
|
138
|
+
if (declaredHomepage && scriptSitePage(declaredHomepage)?.key === site.key)
|
|
139
|
+
return null;
|
|
140
|
+
return { label: `${site.siteName} page`, url: site.url };
|
|
141
|
+
}
|
|
142
|
+
// True when two URLs point at the same page: a literal comparison
|
|
143
|
+
// modulo trailing slash, host case, and fragment. Only used for the
|
|
144
|
+
// location-is-already-the-page check — for "same script?" across
|
|
145
|
+
// spellings, compare `ScriptSitePage.key` instead.
|
|
146
|
+
function samePageUrl(a, b) {
|
|
147
|
+
const norm = (s) => {
|
|
148
|
+
try {
|
|
149
|
+
const u = new URL(s);
|
|
150
|
+
return `${u.protocol}//${u.host.toLowerCase()}${u.pathname.replace(/\/+$/, '')}${u.search}`;
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
const na = norm(a);
|
|
157
|
+
return na !== null && na === norm(b);
|
|
158
|
+
}
|