Browse Source

fetch(repo-page): display readme from github

turned off with feature stapling. requires:
* styles to be improved (inline image links, respecting html img sizing, etc)
* intergration into its own tab (potentially sepearte routing
  for proposal, issues, readme)
* proxy to get readme via git for all git sources
master
DanConwayDev 2 years ago
parent
commit
33ecbc0578
No known key found for this signature in database
GPG Key ID: 68E15486D73F75E1
  1. 6
      package.json
  2. 12
      src/lib/components/repo/type.ts
  3. 86
      src/lib/stores/repo.ts
  4. 18
      src/routes/repo/[repo_id]/+page.svelte
  5. 91
      yarn.lock

6
package.json

@ -68,9 +68,7 @@ @@ -68,9 +68,7 @@
"dayjs": "^1.11.10",
"highlight.js": "^11.9.0",
"parse-diff": "^0.11.1",
"ramda": "^0.29.1"
},
"resolutions": {
"jackspeak": "2.1.1"
"ramda": "^0.29.1",
"svelte-markdown": "^0.4.1"
}
}

12
src/lib/components/repo/type.ts

@ -67,3 +67,15 @@ export const summary_defaults: RepoSummary = { @@ -67,3 +67,15 @@ export const summary_defaults: RepoSummary = {
loading: false,
created_at: 0,
}
export interface RepoReadme {
md: string
loading: boolean
failed: boolean
}
export const readme_defaults: RepoReadme = {
md: '',
loading: true,
failed: false,
}

86
src/lib/stores/repo.ts

@ -1,8 +1,17 @@ @@ -1,8 +1,17 @@
import { writable, type Unsubscriber, type Writable } from 'svelte/store'
import type { RepoCollection, RepoEvent } from '$lib/components/repo/type'
import { collection_defaults, event_defaults } from '$lib/components/repo/type'
import type {
RepoCollection,
RepoEvent,
RepoReadme,
} from '$lib/components/repo/type'
import {
collection_defaults,
event_defaults,
readme_defaults,
} from '$lib/components/repo/type'
import { ensureRepoCollection } from './repos'
import { selectRepoFromCollection } from '$lib/components/repo/utils'
import { get } from 'svelte/store'
export const selected_repo_collection: Writable<RepoCollection> = writable({
...collection_defaults,
@ -28,12 +37,19 @@ export const ensureSelectedRepoCollection = ( @@ -28,12 +37,19 @@ export const ensureSelectedRepoCollection = (
if (
selected_repo_unique_commit_or_identifier !== unique_commit_or_identifier
) {
let loading = true
selected_repo_unique_commit_or_identifier = unique_commit_or_identifier
if (selected_unsubscriber) selected_unsubscriber()
selected_unsubscriber = ensureRepoCollection(
unique_commit_or_identifier
).subscribe((repo_collection) => {
selected_repo_collection.set({ ...repo_collection })
if (loading && !repo_collection.loading) {
loading = false
const repo_event = selectRepoFromCollection(repo_collection)
if (repo_event)
ensureRepoReadme(repo_event.clone, repo_collection.identifier)
}
})
}
return selected_repo_collection
@ -59,3 +75,69 @@ export const awaitSelectedRepoCollection = async ( @@ -59,3 +75,69 @@ export const awaitSelectedRepoCollection = async (
})
})
}
export const selected_repo_readme: Writable<RepoReadme> = writable({
...readme_defaults,
})
const ensureRepoReadme = async (
clone: string,
unique_commit_or_identifier: string
): Promise<void> => {
selected_repo_readme.set({ ...readme_defaults })
/** update writable unless selected readme has changed */
const update = (md: string | undefined = undefined): void => {
const latest_collection = get(selected_repo_collection)
if (
[latest_collection.identifier, latest_collection.unique_commit].includes(
unique_commit_or_identifier
)
) {
selected_repo_readme.set({
md: md || '',
loading: false,
failed: !md,
})
}
}
try {
const github_details = extractGithubDetails(clone)
// feature stapled off
const feature_staple = false
if (github_details && feature_staple) {
const res = await fetch(
// `/git_proxy/readme?clone=${encodeURIComponent(clone)}`
`https://raw.githubusercontent.com/${github_details.org}/${github_details.repo_name}/HEAD/README.md`
)
if (!res.ok) {
throw 'api request error'
}
let text = ''
text = await res.text()
update(text)
} else {
// use proxy to get readme using 'git archive' or 'git clone'
}
} catch (e) {
update()
}
}
const extractGithubDetails = (
clone: string
): { org: string; repo_name: string } | undefined => {
if (clone.indexOf('github.') > -1) {
const g_split = clone.split('github.')
if (g_split.length > 0) {
const slash_split = g_split[1].split('/')
if (slash_split.length > 2) {
return {
org: slash_split[1],
repo_name: slash_split[2].split('.')[0],
}
}
}
}
return undefined
}

18
src/routes/repo/[repo_id]/+page.svelte

@ -4,6 +4,7 @@ @@ -4,6 +4,7 @@
ensureSelectedRepoCollection,
selected_repo_collection,
selected_repo_event,
selected_repo_readme,
} from '$lib/stores/repo'
import RepoHeader from '$lib/components/repo/RepoHeader.svelte'
import Container from '$lib/components/Container.svelte'
@ -13,6 +14,7 @@ @@ -13,6 +14,7 @@
} from '$lib/stores/Proposals'
import ProposalsList from '$lib/components/proposals/ProposalsList.svelte'
import { ensureIssueSummaries, issue_summaries } from '$lib/stores/Issues'
import SvelteMarkdown from 'svelte-markdown'
export let data: { repo_id: string }
let identifier = data.repo_id
@ -137,6 +139,22 @@ @@ -137,6 +139,22 @@
create issue
</a>
{/if}
{#if false}
<!-- feature stapled off - style improvements needed eg 'a img' need to be inline-block -->
{#if $selected_repo_readme.loading}
<div>loading readme...</div>
{:else if $selected_repo_readme.failed}
<div>failed to load readme from git server...</div>
{:else}
<h4>README.md</h4>
<article class="prose prose-sm">
<SvelteMarkdown
options={{ gfm: true }}
source={$selected_repo_readme.md}
/>
</article>
{/if}
{/if}
</div>
<div class="prose ml-2 hidden w-1/3 md:flex">
<RepoDetails repo_id={identifier} />

91
yarn.lock

@ -1487,6 +1487,18 @@ @@ -1487,6 +1487,18 @@
resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c"
integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==
"@isaacs/cliui@^8.0.2":
version "8.0.2"
resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
dependencies:
string-width "^5.1.2"
string-width-cjs "npm:string-width@^4.2.0"
strip-ansi "^7.0.1"
strip-ansi-cjs "npm:strip-ansi@^6.0.1"
wrap-ansi "^8.1.0"
wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
"@istanbuljs/load-nyc-config@^1.0.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
@ -3462,6 +3474,11 @@ @@ -3462,6 +3474,11 @@
resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8"
integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==
"@types/marked@^5.0.1":
version "5.0.2"
resolved "https://registry.yarnpkg.com/@types/marked/-/marked-5.0.2.tgz#ca6b0cd7a5c8799c8cd0963df0b3e1a9021dcdfa"
integrity sha512-OucS4KMHhFzhz27KxmWg7J+kIYqyqoW5kdIEI319hqARQQUTqhao3M/F+uFnDXD0Rg72iDDZxZNxq5gvctmLlg==
"@types/mdx@^2.0.0":
version "2.0.10"
resolved "https://registry.yarnpkg.com/@types/mdx/-/mdx-2.0.10.tgz#0d7b57fb1d83e27656156e4ee0dfba96532930e4"
@ -3911,6 +3928,11 @@ ansi-styles@^5.0.0: @@ -3911,6 +3928,11 @@ ansi-styles@^5.0.0:
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
ansi-styles@^6.1.0:
version "6.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5"
integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==
any-promise@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@ -5173,6 +5195,11 @@ duplexify@^3.5.0, duplexify@^3.6.0: @@ -5173,6 +5195,11 @@ duplexify@^3.5.0, duplexify@^3.6.0:
readable-stream "^2.0.0"
stream-shift "^1.0.0"
eastasianwidth@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -5200,6 +5227,11 @@ emoji-regex@^8.0.0: @@ -5200,6 +5227,11 @@ emoji-regex@^8.0.0:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
emoji-regex@^9.2.2:
version "9.2.2"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
encodeurl@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@ -7000,12 +7032,12 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.1.3: @@ -7000,12 +7032,12 @@ istanbul-reports@^3.0.2, istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
jackspeak@2.1.1, jackspeak@^2.3.5:
version "2.1.1"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.1.1.tgz#2a42db4cfbb7e55433c28b6f75d8b796af9669cd"
integrity sha512-juf9stUEwUaILepraGOWIJTLwg48bUnBmRqd2ln2Os1sW987zeoj/hzhbvRB95oMuS2ZTpjULmdwHNX4rzZIZw==
jackspeak@^2.3.5:
version "2.3.6"
resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8"
integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==
dependencies:
cliui "^8.0.1"
"@isaacs/cliui" "^8.0.2"
optionalDependencies:
"@pkgjs/parseargs" "^0.11.0"
@ -7827,6 +7859,11 @@ marked-mangle@^1.1.4: @@ -7827,6 +7859,11 @@ marked-mangle@^1.1.4:
resolved "https://registry.yarnpkg.com/marked-mangle/-/marked-mangle-1.1.6.tgz#b5364832eedec5eb18d630cb99551344a36ceb0a"
integrity sha512-4g4GevEeFE/RbB0Zue8k7e7RSDpEolb7yWVWzsAuuo2q4FMsVZiC+hqst762neHorCyjr32d5nNMZSWM/f27Ow==
marked@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/marked/-/marked-5.1.2.tgz#62b5ccfc75adf72ca3b64b2879b551d89e77677f"
integrity sha512-ahRPGXJpjMjwSOlBoTMZAK7ATXkli5qCPxZ21TG44rx1KEo44bii4ekgTDQPNRQ4Kh7JMb9Ub1PVk1NxRSsorg==
marked@^9.0.0:
version "9.1.6"
resolved "https://registry.yarnpkg.com/marked/-/marked-9.1.6.tgz#5d2a3f8180abfbc5d62e3258a38a1c19c0381695"
@ -9648,7 +9685,7 @@ string-length@^5.0.1: @@ -9648,7 +9685,7 @@ string-length@^5.0.1:
char-regex "^2.0.0"
strip-ansi "^7.0.1"
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -9657,6 +9694,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: @@ -9657,6 +9694,15 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
string-width@^5.0.1, string-width@^5.1.2:
version "5.1.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
dependencies:
eastasianwidth "^0.2.0"
emoji-regex "^9.2.2"
strip-ansi "^7.0.1"
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@ -9671,7 +9717,7 @@ string_decoder@~1.1.1: @@ -9671,7 +9717,7 @@ string_decoder@~1.1.1:
dependencies:
safe-buffer "~5.1.0"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -9788,6 +9834,14 @@ svelte-hmr@^0.15.3: @@ -9788,6 +9834,14 @@ svelte-hmr@^0.15.3:
resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.15.3.tgz#df54ccde9be3f091bf5f18fc4ef7b8eb6405fbe6"
integrity sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==
svelte-markdown@^0.4.1:
version "0.4.1"
resolved "https://registry.yarnpkg.com/svelte-markdown/-/svelte-markdown-0.4.1.tgz#ddf13cfd6e0f29a02a82854b48766b527ec90f8d"
integrity sha512-pOlLY6EruKJaWI9my/2bKX8PdTeP5CM0s4VMmwmC2prlOkjAf+AOmTM4wW/l19Y6WZ87YmP8+ZCJCCwBChWjYw==
dependencies:
"@types/marked" "^5.0.1"
marked "^5.1.2"
svelte-preprocess@^5.0.4, svelte-preprocess@^5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/svelte-preprocess/-/svelte-preprocess-5.1.2.tgz#f5edb71bb0cb662cd8342bd5c092834a99ab85f7"
@ -10688,6 +10742,15 @@ wordwrap@^1.0.0: @@ -10688,6 +10742,15 @@ wordwrap@^1.0.0:
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
@ -10697,14 +10760,14 @@ wrap-ansi@^6.2.0: @@ -10697,14 +10760,14 @@ wrap-ansi@^6.2.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
wrap-ansi@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
ansi-styles "^6.1.0"
string-width "^5.0.1"
strip-ansi "^7.0.1"
wrappy@1:
version "1.0.2"

Loading…
Cancel
Save