astro-pure 1.3.8 → 1.4.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/components/advanced/MediumZoom.astro +1 -4
- package/components/advanced/Quote.astro +1 -5
- package/components/basic/Footer.astro +24 -29
- package/components/basic/Header.astro +0 -4
- package/components/pages/BackToTop.astro +0 -4
- package/components/pages/Copyright.astro +1 -0
- package/components/pages/PFSearch.astro +1 -1
- package/components/pages/PostPreview.astro +4 -22
- package/components/pages/TOC.astro +3 -3
- package/components/user/Tabs.astro +7 -4
- package/index.ts +15 -9
- package/package.json +3 -3
- package/plugins/override-svg-attributes.ts +1 -1
- package/plugins/rehype-steps.ts +1 -17
- package/plugins/rehype-tabs.ts +1 -1
- package/plugins/remark-plugins.ts +7 -9
- package/plugins/virtual-user-config.ts +2 -2
- package/schemas/social.ts +3 -1
- package/scripts/check.mjs +1 -1
- package/scripts/index.js +11 -9
- package/scripts/libs/minimist.cjs +33 -34
- package/scripts/libs/slugify.cjs +7 -7
- package/scripts/new.mjs +7 -8
- package/types/index.ts +2 -2
- package/types/integrations-config.ts +2 -0
- package/types/theme-config.ts +1 -5
- package/utils/class-merge.ts +4 -2
- package/utils/error-map.ts +18 -11
- package/utils/mdast-util-to-string.ts +2 -0
- package/utils/reading-time.ts +1 -3
- package/utils/server.ts +2 -2
|
@@ -27,22 +27,19 @@ const { selector = config.integ.mediumZoom.selector, background = 'hsl(var(--bac
|
|
|
27
27
|
will-change: opacity;
|
|
28
28
|
}
|
|
29
29
|
.medium-zoom--opened .medium-zoom-overlay {
|
|
30
|
-
cursor: pointer;
|
|
31
30
|
cursor: zoom-out;
|
|
32
31
|
opacity: 1;
|
|
33
32
|
z-index: 999;
|
|
34
33
|
}
|
|
35
34
|
.medium-zoom-image {
|
|
36
|
-
cursor: pointer;
|
|
37
35
|
cursor: zoom-in;
|
|
38
|
-
transition: transform 0.3s cubic-bezier(0.2, 0, 0.2, 1)
|
|
36
|
+
transition: transform 0.3s cubic-bezier(0.2, 0, 0.2, 1);
|
|
39
37
|
}
|
|
40
38
|
.medium-zoom-image--hidden {
|
|
41
39
|
visibility: hidden;
|
|
42
40
|
}
|
|
43
41
|
.medium-zoom-image--opened {
|
|
44
42
|
position: relative;
|
|
45
|
-
cursor: pointer;
|
|
46
43
|
cursor: zoom-out;
|
|
47
44
|
will-change: transform;
|
|
48
45
|
z-index: 999;
|
|
@@ -22,10 +22,6 @@ const { class: className } = Astro.props
|
|
|
22
22
|
const { quote } = config.integ
|
|
23
23
|
|
|
24
24
|
class Quote extends HTMLElement {
|
|
25
|
-
constructor() {
|
|
26
|
-
super()
|
|
27
|
-
}
|
|
28
|
-
|
|
29
25
|
render(sentence: string) {
|
|
30
26
|
const quoteEl = this.querySelector('#quote-sentence') as HTMLElement
|
|
31
27
|
if (!quoteEl) return
|
|
@@ -34,7 +30,7 @@ const { class: className } = Astro.props
|
|
|
34
30
|
|
|
35
31
|
connectedCallback() {
|
|
36
32
|
// Because virtual:config can only be accessed using json string, function cannot work, so we need to use new Function
|
|
37
|
-
const targetFunction = new Function('data',
|
|
33
|
+
const targetFunction = new Function('data', `return (${quote.target})(data)`)
|
|
38
34
|
fetch(quote.server)
|
|
39
35
|
.then((response) => response.json())
|
|
40
36
|
.then((data) => this.render(targetFunction(data)))
|
|
@@ -7,10 +7,11 @@ const footerConf = config.footer
|
|
|
7
7
|
let social = footerConf.social || {}
|
|
8
8
|
|
|
9
9
|
// If the list does not contain rss, add it
|
|
10
|
-
social.rss
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
if (!social.rss)
|
|
11
|
+
social.rss = {
|
|
12
|
+
label: 'RSS',
|
|
13
|
+
url: '/rss.xml'
|
|
14
|
+
}
|
|
14
15
|
|
|
15
16
|
const footerLink1 = footerConf.links?.filter(({ pos }) => pos === 1) || []
|
|
16
17
|
---
|
|
@@ -18,20 +19,16 @@ const footerLink1 = footerConf.links?.filter(({ pos }) => pos === 1) || []
|
|
|
18
19
|
<footer class='mx-auto mb-5 mt-16 w-full'>
|
|
19
20
|
<div class='border-t pt-5'>
|
|
20
21
|
<div class='flex items-center gap-y-3 max-sm:flex-col sm:justify-between sm:gap-y-0'>
|
|
21
|
-
<div
|
|
22
|
-
|
|
23
|
-
>
|
|
24
|
-
{/* Position 1 */}
|
|
25
|
-
{
|
|
22
|
+
<div class='flex items-center gap-x-4 gap-y-2 text-muted-foreground max-sm:flex-col'>
|
|
23
|
+
{ /* Position 1 */
|
|
26
24
|
footerLink1.length > 0 && (
|
|
27
25
|
<div>
|
|
28
26
|
{footerLink1.map(({ title, link, style }, index) => (
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
</span>
|
|
27
|
+
<>
|
|
28
|
+
<!- prettier-ignore -->
|
|
29
|
+
<a href={link} target='_blank' class={style}>{title}</a>
|
|
30
|
+
{index < footerLink1.length - 1 && <span class='mx-1'>•</span>}
|
|
31
|
+
</>
|
|
35
32
|
))}
|
|
36
33
|
</div>
|
|
37
34
|
)
|
|
@@ -49,9 +46,7 @@ const footerLink1 = footerConf.links?.filter(({ pos }) => pos === 1) || []
|
|
|
49
46
|
.filter(({ pos }) => pos === 2)
|
|
50
47
|
.map(({ title, link, style }) => (
|
|
51
48
|
<span>
|
|
52
|
-
<a href={link} target='_blank' class={style}>
|
|
53
|
-
{title}
|
|
54
|
-
</a>
|
|
49
|
+
<a href={link} target='_blank' class={style}>{title}</a>
|
|
55
50
|
</span>
|
|
56
51
|
))}
|
|
57
52
|
</span>
|
|
@@ -62,13 +57,9 @@ const footerLink1 = footerConf.links?.filter(({ pos }) => pos === 1) || []
|
|
|
62
57
|
{
|
|
63
58
|
footerConf.credits && (
|
|
64
59
|
<span>
|
|
65
|
-
<a href='https://github.com/withastro/astro' target='_blank'>
|
|
66
|
-
Astro
|
|
67
|
-
</a>
|
|
60
|
+
<a href='https://github.com/withastro/astro' target='_blank'>Astro</a>
|
|
68
61
|
&
|
|
69
|
-
<a href='https://github.com/cworld1/astro-theme-pure' target='_blank'>
|
|
70
|
-
Pure
|
|
71
|
-
</a>
|
|
62
|
+
<a href='https://github.com/cworld1/astro-theme-pure' target='_blank'>Pure</a>
|
|
72
63
|
theme powered
|
|
73
64
|
</span>
|
|
74
65
|
)
|
|
@@ -80,11 +71,7 @@ const footerLink1 = footerConf.links?.filter(({ pos }) => pos === 1) || []
|
|
|
80
71
|
{
|
|
81
72
|
footerConf.social &&
|
|
82
73
|
Object.entries(footerConf.social).map(([platform, { label, url }]) => (
|
|
83
|
-
<a
|
|
84
|
-
class='inline-block text-muted-foreground transition-all hover:text-muted-foreground/75'
|
|
85
|
-
href={url}
|
|
86
|
-
aria-label={label}
|
|
87
|
-
>
|
|
74
|
+
<a href={url} aria-label={label}>
|
|
88
75
|
<Icon name={platform as keyof typeof footerConf.social} />
|
|
89
76
|
</a>
|
|
90
77
|
))
|
|
@@ -93,3 +80,11 @@ const footerLink1 = footerConf.links?.filter(({ pos }) => pos === 1) || []
|
|
|
93
80
|
</div>
|
|
94
81
|
</div>
|
|
95
82
|
</footer>
|
|
83
|
+
|
|
84
|
+
<style>
|
|
85
|
+
footer a {
|
|
86
|
+
color: hsl(var(--foreground) / var(--un-text-opacity, 1));
|
|
87
|
+
text-decoration: underline;
|
|
88
|
+
font-weight: 500;
|
|
89
|
+
}
|
|
90
|
+
</style>
|
|
@@ -39,10 +39,6 @@ const { header: headerName, content: contentName, needPercent = true } = Astro.p
|
|
|
39
39
|
ticking = false
|
|
40
40
|
needPercent = true
|
|
41
41
|
|
|
42
|
-
constructor() {
|
|
43
|
-
super()
|
|
44
|
-
}
|
|
45
|
-
|
|
46
42
|
calculateScrollPercent() {
|
|
47
43
|
const scrollTop = Math.max(0, window.scrollY || document.documentElement.scrollTop)
|
|
48
44
|
// Before article
|
|
@@ -34,7 +34,7 @@ import '@pagefind/default-ui/css/ui.css'
|
|
|
34
34
|
new PagefindUI({
|
|
35
35
|
element: '#site-search',
|
|
36
36
|
baseUrl: import.meta.env.BASE_URL,
|
|
37
|
-
bundlePath: import.meta.env.BASE_URL.replace(/\/$/, '')
|
|
37
|
+
bundlePath: `${import.meta.env.BASE_URL.replace(/\/$/, '')}/pagefind/`,
|
|
38
38
|
showImages: false,
|
|
39
39
|
showSubResults: true,
|
|
40
40
|
processResult: (result: { url: string; sub_results: Array<{ url: string }> }) => {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
import { Image } from 'astro:assets'
|
|
3
|
-
import {
|
|
4
|
-
import type { HTMLTag, Polymorphic } from 'astro/types'
|
|
3
|
+
import { type CollectionEntry, type CollectionKey, render } from 'astro:content'
|
|
5
4
|
|
|
6
5
|
import { cn } from '../../utils'
|
|
7
6
|
import { Button, FormattedDate, Icon } from '../user'
|
|
@@ -105,7 +104,7 @@ const postDate = data.updatedDate ?? data.publishDate
|
|
|
105
104
|
)}
|
|
106
105
|
</div>
|
|
107
106
|
{data.tags.length > 0 && (
|
|
108
|
-
<object>
|
|
107
|
+
<object title='Tags' aria-label='Tags' aria-labelledby='Tags'>
|
|
109
108
|
<ul class='tag-list mt-1 flex gap-2'>
|
|
110
109
|
{data.tags.map((tag: string) => (
|
|
111
110
|
<li>
|
|
@@ -123,18 +122,13 @@ const postDate = data.updatedDate ?? data.publishDate
|
|
|
123
122
|
|
|
124
123
|
<style>
|
|
125
124
|
.post-preview {
|
|
126
|
-
--preview-highlight-final: var(
|
|
127
|
-
--preview-highlight,
|
|
128
|
-
hsl(var(--primary) / var(--un-text-opacity, 1))
|
|
125
|
+
--preview-highlight-final: var( --preview-highlight, hsl(var(--primary) / var(--un-text-opacity, 1))
|
|
129
126
|
);
|
|
130
127
|
}
|
|
131
128
|
.post-preview:hover {
|
|
132
129
|
& > a,
|
|
133
130
|
& .tag-list a {
|
|
134
|
-
background-color: var(
|
|
135
|
-
--preview-highlight-bg,
|
|
136
|
-
hsl(var(--muted) / var(--un-bg-opacity, 1))
|
|
137
|
-
) !important;
|
|
131
|
+
background-color: var( --preview-highlight-bg, hsl(var(--muted) / var(--un-bg-opacity, 1))) !important;
|
|
138
132
|
}
|
|
139
133
|
& > a,
|
|
140
134
|
& .tag-list a:hover {
|
|
@@ -146,23 +140,11 @@ const postDate = data.updatedDate ?? data.publishDate
|
|
|
146
140
|
}
|
|
147
141
|
.cover-image {
|
|
148
142
|
mask-image: linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
|
|
149
|
-
-ms-mask-image: -ms-linear-gradient(to right, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
|
|
150
|
-
-webkit-mask-image: -webkit-linear-gradient(
|
|
151
|
-
to right,
|
|
152
|
-
rgba(0, 0, 0, 0) 0%,
|
|
153
|
-
rgba(0, 0, 0, 1) 100%
|
|
154
|
-
);
|
|
155
143
|
}
|
|
156
144
|
|
|
157
145
|
@media (max-width: 768px) {
|
|
158
146
|
.cover-image {
|
|
159
147
|
mask-image: linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
|
|
160
|
-
-ms-mask-image: -ms-linear-gradient(to top, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%);
|
|
161
|
-
-webkit-mask-image: -webkit-linear-gradient(
|
|
162
|
-
to top,
|
|
163
|
-
rgba(0, 0, 0, 0) 0%,
|
|
164
|
-
rgba(0, 0, 0, 1) 100%
|
|
165
|
-
);
|
|
166
148
|
}
|
|
167
149
|
}
|
|
168
150
|
</style>
|
|
@@ -83,15 +83,15 @@ const toc = generateToc(headings)
|
|
|
83
83
|
el.classList.toggle('highlight-bg-translucent', inView)
|
|
84
84
|
el.classList.toggle(
|
|
85
85
|
'rounded-t-2xl',
|
|
86
|
-
inView && (i
|
|
86
|
+
inView && (i === 0 || !this.headingProgress[this.tocLinks[i - 1]?.slug].inView)
|
|
87
87
|
)
|
|
88
88
|
el.classList.toggle(
|
|
89
89
|
'rounded-b-2xl',
|
|
90
90
|
inView &&
|
|
91
|
-
(i
|
|
91
|
+
(i === this.tocLinks.length - 1 ||
|
|
92
92
|
!this.headingProgress[this.tocLinks[i + 1]?.slug].inView)
|
|
93
93
|
)
|
|
94
|
-
bar.classList.toggle('is-read', !inView && progress
|
|
94
|
+
bar.classList.toggle('is-read', !inView && progress === 1)
|
|
95
95
|
bar.classList.toggle('highlight-bg', inView)
|
|
96
96
|
bar.style.setProperty('height', `${progress * 90}%`)
|
|
97
97
|
}
|
|
@@ -32,8 +32,9 @@ const isSynced = syncKey !== undefined
|
|
|
32
32
|
const didRenderSyncedTabsRestoreScriptSymbol = Symbol.for(
|
|
33
33
|
'starlight:did-render-synced-tabs-restore-script'
|
|
34
34
|
)
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
const shouldRenderSyncedTabsRestoreScript =
|
|
36
|
+
// @ts-expect-error - See above
|
|
37
|
+
isSynced && Astro.locals[didRenderSyncedTabsRestoreScriptSymbol] !== true
|
|
37
38
|
|
|
38
39
|
if (isSynced) {
|
|
39
40
|
// @ts-expect-error - See above
|
|
@@ -41,8 +42,8 @@ if (isSynced) {
|
|
|
41
42
|
}
|
|
42
43
|
---
|
|
43
44
|
|
|
44
|
-
{/* Inlined to avoid a flash of invalid active tab. */
|
|
45
|
-
|
|
45
|
+
{ /* Inlined to avoid a flash of invalid active tab. */
|
|
46
|
+
shouldRenderSyncedTabsRestoreScript && (
|
|
46
47
|
<script is:inline>
|
|
47
48
|
class StarlightTabsRestore extends HTMLElement {
|
|
48
49
|
connectedCallback() {
|
|
@@ -81,6 +82,7 @@ if (isSynced) {
|
|
|
81
82
|
<li role='presentation' class='tab'>
|
|
82
83
|
<a
|
|
83
84
|
role='tab'
|
|
85
|
+
draggable="false"
|
|
84
86
|
href={'#' + panelId}
|
|
85
87
|
id={tabId}
|
|
86
88
|
aria-selected={idx === 0 ? 'true' : 'false'}
|
|
@@ -127,6 +129,7 @@ if (isSynced) {
|
|
|
127
129
|
color: hsl(var(--foreground) / var(--un-text-opacity, 1));
|
|
128
130
|
outline-offset: -0.1875rem;
|
|
129
131
|
overflow-wrap: initial;
|
|
132
|
+
white-space: nowrap;
|
|
130
133
|
}
|
|
131
134
|
.tab [role='tab'][aria-selected='true'] {
|
|
132
135
|
color: hsl(var(--primary) / var(--un-text-opacity, 1));
|
package/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { dirname, relative } from 'node:path'
|
|
|
3
3
|
import { fileURLToPath } from 'node:url'
|
|
4
4
|
// Astro
|
|
5
5
|
import type { AstroIntegration, RehypePlugins, RemarkPlugins } from 'astro'
|
|
6
|
+
import { AstroError } from 'astro/errors'
|
|
6
7
|
// Integrations
|
|
7
8
|
import mdx from '@astrojs/mdx'
|
|
8
9
|
import sitemap from '@astrojs/sitemap'
|
|
@@ -16,15 +17,20 @@ import { UserConfigSchema, type UserInputConfig } from './types/user-config'
|
|
|
16
17
|
import { parseWithFriendlyErrors } from './utils/error-map'
|
|
17
18
|
|
|
18
19
|
export default function AstroPureIntegration(opts: UserInputConfig): AstroIntegration {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
if (typeof opts !== 'object' || opts === null || Array.isArray(opts))
|
|
21
|
+
throw new AstroError(
|
|
22
|
+
'Invalid config passed to astro-pure integration',
|
|
23
|
+
'The astro-pure integration expects a right configuration object with at least a `title` property.\n\n'
|
|
24
|
+
)
|
|
25
|
+
const integrations: AstroIntegration[] = []
|
|
26
|
+
const remarkPlugins: RemarkPlugins = []
|
|
27
|
+
const rehypePlugins: RehypePlugins = []
|
|
28
|
+
|
|
22
29
|
return {
|
|
23
30
|
name: 'astro-pure',
|
|
24
31
|
hooks: {
|
|
25
32
|
'astro:config:setup': async ({ config, updateConfig }) => {
|
|
26
|
-
|
|
27
|
-
// @ts-ignore
|
|
33
|
+
const userConfig = parseWithFriendlyErrors(
|
|
28
34
|
UserConfigSchema,
|
|
29
35
|
opts,
|
|
30
36
|
'Invalid config passed to astro-pure integration'
|
|
@@ -52,14 +58,13 @@ export default function AstroPureIntegration(opts: UserInputConfig): AstroIntegr
|
|
|
52
58
|
rehypePlugins.push([
|
|
53
59
|
rehypeExternalLinks,
|
|
54
60
|
{
|
|
55
|
-
content: {
|
|
56
|
-
type: 'text',
|
|
57
|
-
value: userConfig.content.externalLinks.content
|
|
58
|
-
},
|
|
61
|
+
content: { type: 'text', value: userConfig.content.externalLinks.content },
|
|
59
62
|
contentProperties: userConfig.content.externalLinks.properties
|
|
60
63
|
}
|
|
61
64
|
])
|
|
65
|
+
// Make table scrollable on overflow
|
|
62
66
|
rehypePlugins.push(rehypeTable)
|
|
67
|
+
|
|
63
68
|
// Add Starlight directives restoration integration at the end of the list so that remark
|
|
64
69
|
// plugins injected by Starlight plugins through Astro integrations can handle text and
|
|
65
70
|
// leaf directives before they are transformed back to their original form.
|
|
@@ -72,6 +77,7 @@ export default function AstroPureIntegration(opts: UserInputConfig): AstroIntegr
|
|
|
72
77
|
|
|
73
78
|
updateConfig({
|
|
74
79
|
vite: {
|
|
80
|
+
// biome-ignore lint/suspicious/noTsIgnore: expects error for local, but expects no error when build
|
|
75
81
|
// @ts-ignore
|
|
76
82
|
plugins: [vitePluginUserConfig(userConfig, config)]
|
|
77
83
|
},
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "astro-pure",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"description": "A simple, clean but powerful blog theme build by astro.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.4.0",
|
|
6
6
|
"homepage": "https://astro-pure.js.org/",
|
|
7
7
|
"author": "CWorld",
|
|
8
8
|
"license": "Apache-2.0",
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
"./libs": "./libs/index.ts"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@astrojs/mdx": "^4.3.
|
|
40
|
+
"@astrojs/mdx": "^4.3.13",
|
|
41
41
|
"@astrojs/sitemap": "^3.6.0",
|
|
42
42
|
"@pagefind/default-ui": "^1.4.0",
|
|
43
43
|
"@unocss/reset": "^66.5.10",
|
|
44
|
-
"astro": "^5.16.
|
|
44
|
+
"astro": "^5.16.6",
|
|
45
45
|
"hast-util-select": "^6.0.4",
|
|
46
46
|
"node-html-parser": "^7.0.1",
|
|
47
47
|
"pagefind": "^1.4.0",
|
package/plugins/rehype-steps.ts
CHANGED
|
@@ -41,15 +41,10 @@ const stepsProcessor = rehype()
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
// Ensure `role="list"` is set on the ordered list.
|
|
44
|
-
|
|
45
44
|
// We use `list-style: none` in the styles for this component and need to ensure the list
|
|
46
|
-
|
|
47
45
|
// retains its semantics in Safari, which will remove them otherwise.
|
|
48
|
-
|
|
49
46
|
rootElement.properties.role = 'list'
|
|
50
|
-
|
|
51
47
|
// Add the required CSS class name, preserving existing classes if present.
|
|
52
|
-
|
|
53
48
|
if (!Array.isArray(rootElement.properties.className)) {
|
|
54
49
|
rootElement.properties.className = ['sl-steps']
|
|
55
50
|
} else {
|
|
@@ -57,30 +52,21 @@ const stepsProcessor = rehype()
|
|
|
57
52
|
}
|
|
58
53
|
|
|
59
54
|
// Add the `start` attribute as a CSS custom property so we can use it as the starting index
|
|
60
|
-
|
|
61
55
|
// of the steps custom counter.
|
|
62
|
-
|
|
63
56
|
if (typeof rootElement.properties.start === 'number') {
|
|
64
57
|
const styles = [`--sl-steps-start: ${rootElement.properties.start - 1}`]
|
|
65
|
-
|
|
66
58
|
if (rootElement.properties.style) styles.push(String(rootElement.properties.style))
|
|
67
|
-
|
|
68
59
|
rootElement.properties.style = styles.join(';')
|
|
69
60
|
}
|
|
70
61
|
}
|
|
71
62
|
})
|
|
72
63
|
|
|
73
64
|
/**
|
|
74
|
-
|
|
75
65
|
* Process steps children: validates the HTML and adds `role="list"` to the ordered list.
|
|
76
|
-
|
|
77
66
|
* @param html Inner HTML passed to the `<Steps>` component.
|
|
78
|
-
|
|
79
67
|
*/
|
|
80
|
-
|
|
81
68
|
export const processSteps = (html: string | undefined) => {
|
|
82
69
|
const file = stepsProcessor.processSync({ value: html })
|
|
83
|
-
|
|
84
70
|
return { html: file.toString() }
|
|
85
71
|
}
|
|
86
72
|
|
|
@@ -88,11 +74,9 @@ class StepsError extends AstroError {
|
|
|
88
74
|
constructor(message: string, html?: string) {
|
|
89
75
|
let hint =
|
|
90
76
|
'To learn more about the `<Steps>` component, see https://starlight.astro.build/components/steps/'
|
|
91
|
-
|
|
92
77
|
if (html) {
|
|
93
|
-
hint +=
|
|
78
|
+
hint += `\n\nFull HTML passed to \`<Steps>\`:\n${prettyPrintHtml(html)}`
|
|
94
79
|
}
|
|
95
|
-
|
|
96
80
|
super(message, hint)
|
|
97
81
|
}
|
|
98
82
|
}
|
package/plugins/rehype-tabs.ts
CHANGED
|
@@ -6,25 +6,23 @@ import { visit } from 'unist-util-visit'
|
|
|
6
6
|
import mdastToString from '../utils/mdast-util-to-string'
|
|
7
7
|
import getReadingTime from '../utils/reading-time'
|
|
8
8
|
|
|
9
|
-
export const remarkAddZoomable: Plugin<[{ className?: string }], Root> =
|
|
10
|
-
className = 'zoomable'
|
|
11
|
-
|
|
12
|
-
return function (tree) {
|
|
9
|
+
export const remarkAddZoomable: Plugin<[{ className?: string }], Root> =
|
|
10
|
+
({ className = 'zoomable' }) =>
|
|
11
|
+
(tree) => {
|
|
13
12
|
visit(tree, 'image', (node: Node) => {
|
|
14
13
|
node.data = { hProperties: { class: className } }
|
|
15
14
|
})
|
|
16
15
|
}
|
|
17
|
-
}
|
|
18
16
|
|
|
19
|
-
export const remarkReadingTime: Plugin<[], Root> =
|
|
20
|
-
|
|
17
|
+
export const remarkReadingTime: Plugin<[], Root> =
|
|
18
|
+
() =>
|
|
19
|
+
(tree, { data }) => {
|
|
21
20
|
const textOnPage = mdastToString(tree)
|
|
22
21
|
const readingTime = getReadingTime(textOnPage)
|
|
23
22
|
// readingTime.text will give us minutes read as a friendly string,
|
|
24
23
|
// i.e. "3 min"
|
|
25
|
-
if (data.astro
|
|
24
|
+
if (data.astro?.frontmatter) {
|
|
26
25
|
data.astro.frontmatter.minutesRead = readingTime.text
|
|
27
26
|
data.astro.frontmatter.words = readingTime.words
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
|
-
}
|
|
@@ -88,10 +88,10 @@ export function vitePluginUserConfig(
|
|
|
88
88
|
|
|
89
89
|
return {
|
|
90
90
|
name: 'vite-plugin-starlight-user-config',
|
|
91
|
-
resolveId(id): string |
|
|
91
|
+
resolveId(id): string | undefined {
|
|
92
92
|
if (id in modules) return resolveVirtualModuleId(id)
|
|
93
93
|
},
|
|
94
|
-
load(id): string |
|
|
94
|
+
load(id): string | undefined {
|
|
95
95
|
const resolution = resolutionMap[id]
|
|
96
96
|
if (resolution) return modules[resolution]
|
|
97
97
|
}
|
package/schemas/social.ts
CHANGED
|
@@ -7,7 +7,9 @@ export const SocialLinksSchema = () =>
|
|
|
7
7
|
.record(
|
|
8
8
|
z.enum(socialLinks),
|
|
9
9
|
// Link to the respective social profile for this site
|
|
10
|
-
z
|
|
10
|
+
z
|
|
11
|
+
.string()
|
|
12
|
+
.url()
|
|
11
13
|
)
|
|
12
14
|
.transform((links) => {
|
|
13
15
|
const labelledLinks: Partial<Record<keyof typeof links, { label: string; url: string }>> = {}
|
package/scripts/check.mjs
CHANGED
package/scripts/index.js
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
import { dirname, join } from 'path'
|
|
6
|
-
import { fileURLToPath } from 'url'
|
|
2
|
+
import { readFileSync } from 'node:fs'
|
|
3
|
+
import { dirname, join } from 'node:path'
|
|
4
|
+
import { fileURLToPath } from 'node:url'
|
|
7
5
|
|
|
8
6
|
import checkFunc from './check.mjs'
|
|
9
7
|
import minimist from './libs/minimist.cjs'
|
|
@@ -15,11 +13,12 @@ switch (args._[0]) {
|
|
|
15
13
|
case 'check':
|
|
16
14
|
await checkFunc()
|
|
17
15
|
break
|
|
18
|
-
case 'new':
|
|
16
|
+
case 'new': {
|
|
19
17
|
const newArgs = process.argv.slice(3)
|
|
20
18
|
newFunc(newArgs)
|
|
21
19
|
break
|
|
22
|
-
|
|
20
|
+
}
|
|
21
|
+
case 'info': {
|
|
23
22
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
24
23
|
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'))
|
|
25
24
|
console.log()
|
|
@@ -29,14 +28,17 @@ switch (args._[0]) {
|
|
|
29
28
|
console.log(`- Node.js:\t${process.version}`)
|
|
30
29
|
console.log(`- Platform:\t${process.platform}`)
|
|
31
30
|
break
|
|
32
|
-
|
|
31
|
+
}
|
|
32
|
+
case 'help': {
|
|
33
33
|
console.log('Usage:')
|
|
34
34
|
console.log(' check - Check envirionment and run corresponding adaption code')
|
|
35
35
|
console.log(' new [args] - Create new post on blog collection')
|
|
36
36
|
console.log(' info - Show this info message')
|
|
37
37
|
console.log(' help - Show this help message')
|
|
38
38
|
break
|
|
39
|
-
|
|
39
|
+
}
|
|
40
|
+
default: {
|
|
40
41
|
console.log('Unknown command. Use "help" to see the available commands.')
|
|
41
42
|
break
|
|
43
|
+
}
|
|
42
44
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
function hasKey(obj, keys) {
|
|
4
4
|
var o = obj
|
|
5
|
-
keys.slice(0, -1).forEach(
|
|
5
|
+
keys.slice(0, -1).forEach((key) => {
|
|
6
6
|
o = o[key] || {}
|
|
7
7
|
})
|
|
8
8
|
|
|
@@ -24,7 +24,7 @@ function isConstructorOrProto(obj, key) {
|
|
|
24
24
|
return (key === 'constructor' && typeof obj[key] === 'function') || key === '__proto__'
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
module.exports =
|
|
27
|
+
module.exports = (args, opts) => {
|
|
28
28
|
if (!opts) {
|
|
29
29
|
opts = {}
|
|
30
30
|
}
|
|
@@ -45,7 +45,7 @@ module.exports = function (args, opts) {
|
|
|
45
45
|
;[]
|
|
46
46
|
.concat(opts.boolean)
|
|
47
47
|
.filter(Boolean)
|
|
48
|
-
.forEach(
|
|
48
|
+
.forEach((key) => {
|
|
49
49
|
flags.bools[key] = true
|
|
50
50
|
})
|
|
51
51
|
}
|
|
@@ -53,29 +53,23 @@ module.exports = function (args, opts) {
|
|
|
53
53
|
var aliases = {}
|
|
54
54
|
|
|
55
55
|
function aliasIsBoolean(key) {
|
|
56
|
-
return aliases[key].some(
|
|
57
|
-
return flags.bools[x]
|
|
58
|
-
})
|
|
56
|
+
return aliases[key].some((x) => flags.bools[x])
|
|
59
57
|
}
|
|
60
58
|
|
|
61
|
-
Object.keys(opts.alias || {}).forEach(
|
|
59
|
+
Object.keys(opts.alias || {}).forEach((key) => {
|
|
62
60
|
aliases[key] = [].concat(opts.alias[key])
|
|
63
|
-
aliases[key].forEach(
|
|
64
|
-
aliases[x] = [key].concat(
|
|
65
|
-
aliases[key].filter(function (y) {
|
|
66
|
-
return x !== y
|
|
67
|
-
})
|
|
68
|
-
)
|
|
61
|
+
aliases[key].forEach((x) => {
|
|
62
|
+
aliases[x] = [key].concat(aliases[key].filter((y) => x !== y))
|
|
69
63
|
})
|
|
70
64
|
})
|
|
71
65
|
|
|
72
66
|
;[]
|
|
73
67
|
.concat(opts.string)
|
|
74
68
|
.filter(Boolean)
|
|
75
|
-
.forEach(
|
|
69
|
+
.forEach((key) => {
|
|
76
70
|
flags.strings[key] = true
|
|
77
71
|
if (aliases[key]) {
|
|
78
|
-
;[].concat(aliases[key]).forEach(
|
|
72
|
+
;[].concat(aliases[key]).forEach((k) => {
|
|
79
73
|
flags.strings[k] = true
|
|
80
74
|
})
|
|
81
75
|
}
|
|
@@ -95,9 +89,11 @@ module.exports = function (args, opts) {
|
|
|
95
89
|
}
|
|
96
90
|
|
|
97
91
|
function setKey(obj, keys, value) {
|
|
98
|
-
var o = obj
|
|
99
|
-
|
|
100
|
-
|
|
92
|
+
var o = obj,
|
|
93
|
+
i,
|
|
94
|
+
key
|
|
95
|
+
for (i = 0; i < keys.length - 1; i++) {
|
|
96
|
+
key = keys[i]
|
|
101
97
|
if (isConstructorOrProto(o, key)) {
|
|
102
98
|
return
|
|
103
99
|
}
|
|
@@ -144,14 +140,16 @@ module.exports = function (args, opts) {
|
|
|
144
140
|
}
|
|
145
141
|
|
|
146
142
|
var value = !flags.strings[key] && isNumber(val) ? Number(val) : val
|
|
147
|
-
setKey(
|
|
148
|
-
|
|
149
|
-
|
|
143
|
+
setKey(
|
|
144
|
+
argv,
|
|
145
|
+
key.split('.'),
|
|
146
|
+
value
|
|
147
|
+
)(aliases[key] || []).forEach((x) => {
|
|
150
148
|
setKey(argv, x.split('.'), value)
|
|
151
149
|
})
|
|
152
150
|
}
|
|
153
151
|
|
|
154
|
-
Object.keys(flags.bools).forEach(
|
|
152
|
+
Object.keys(flags.bools).forEach((key) => {
|
|
155
153
|
setArg(key, defaults[key] === undefined ? false : defaults[key])
|
|
156
154
|
})
|
|
157
155
|
|
|
@@ -162,18 +160,19 @@ module.exports = function (args, opts) {
|
|
|
162
160
|
args = args.slice(0, args.indexOf('--'))
|
|
163
161
|
}
|
|
164
162
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
163
|
+
var i, arg, key, next, m, value, letters, broken, j
|
|
164
|
+
for (i = 0; i < args.length; i++) {
|
|
165
|
+
arg = args[i]
|
|
166
|
+
key
|
|
167
|
+
next
|
|
169
168
|
|
|
170
169
|
if (/^--.+=/.test(arg)) {
|
|
171
170
|
// Using [\s\S] instead of . because js doesn't support the
|
|
172
171
|
// 'dotall' regex modifier. See:
|
|
173
172
|
// http://stackoverflow.com/a/1068308/13216
|
|
174
|
-
|
|
173
|
+
m = arg.match(/^--([^=]+)=([\s\S]*)$/)
|
|
175
174
|
key = m[1]
|
|
176
|
-
|
|
175
|
+
value = m[2]
|
|
177
176
|
if (flags.bools[key]) {
|
|
178
177
|
value = value !== 'false'
|
|
179
178
|
}
|
|
@@ -200,10 +199,10 @@ module.exports = function (args, opts) {
|
|
|
200
199
|
setArg(key, flags.strings[key] ? '' : true, arg)
|
|
201
200
|
}
|
|
202
201
|
} else if (/^-[^-]+/.test(arg)) {
|
|
203
|
-
|
|
202
|
+
letters = arg.slice(1, -1).split('')
|
|
204
203
|
|
|
205
|
-
|
|
206
|
-
for (
|
|
204
|
+
broken = false
|
|
205
|
+
for (j = 0; j < letters.length; j++) {
|
|
207
206
|
next = arg.slice(j + 2)
|
|
208
207
|
|
|
209
208
|
if (next === '-') {
|
|
@@ -260,11 +259,11 @@ module.exports = function (args, opts) {
|
|
|
260
259
|
}
|
|
261
260
|
}
|
|
262
261
|
|
|
263
|
-
Object.keys(defaults).forEach(
|
|
262
|
+
Object.keys(defaults).forEach((k) => {
|
|
264
263
|
if (!hasKey(argv, k.split('.'))) {
|
|
265
264
|
setKey(argv, k.split('.'), defaults[k])
|
|
266
265
|
|
|
267
|
-
;(aliases[k] || []).forEach(
|
|
266
|
+
;(aliases[k] || []).forEach((x) => {
|
|
268
267
|
setKey(argv, x.split('.'), defaults[k])
|
|
269
268
|
})
|
|
270
269
|
}
|
|
@@ -273,7 +272,7 @@ module.exports = function (args, opts) {
|
|
|
273
272
|
if (opts['--']) {
|
|
274
273
|
argv['--'] = notFlags.slice()
|
|
275
274
|
} else {
|
|
276
|
-
notFlags.forEach(
|
|
275
|
+
notFlags.forEach((k) => {
|
|
277
276
|
argv._.push(k)
|
|
278
277
|
})
|
|
279
278
|
}
|
package/scripts/libs/slugify.cjs
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
;(
|
|
1
|
+
;((name, root, factory) => {
|
|
2
2
|
if (typeof exports === 'object') {
|
|
3
3
|
module.exports = factory()
|
|
4
|
-
module.exports
|
|
4
|
+
module.exports.default = factory()
|
|
5
5
|
} else if (typeof define === 'function' && define.amd) {
|
|
6
|
-
|
|
6
|
+
/* istanbul ignore next */
|
|
7
7
|
define(factory)
|
|
8
8
|
} else {
|
|
9
9
|
root[name] = factory()
|
|
10
10
|
}
|
|
11
|
-
})('slugify', this,
|
|
11
|
+
})('slugify', this, () => {
|
|
12
12
|
var charMap = JSON.parse(
|
|
13
|
-
'{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E\'","Ը":"Y\'","Թ":"T\'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C\'","Կ":"K","Հ":"H","Ձ":"D\'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R\'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P\'","Ք":"Q\'","Օ":"O\'\'","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"\'","’":"\'","“":"
|
|
13
|
+
'{"$":"dollar","%":"percent","&":"and","<":"less",">":"greater","|":"or","¢":"cent","£":"pound","¤":"currency","¥":"yen","©":"(c)","ª":"a","®":"(r)","º":"o","À":"A","Á":"A","Â":"A","Ã":"A","Ä":"A","Å":"A","Æ":"AE","Ç":"C","È":"E","É":"E","Ê":"E","Ë":"E","Ì":"I","Í":"I","Î":"I","Ï":"I","Ð":"D","Ñ":"N","Ò":"O","Ó":"O","Ô":"O","Õ":"O","Ö":"O","Ø":"O","Ù":"U","Ú":"U","Û":"U","Ü":"U","Ý":"Y","Þ":"TH","ß":"ss","à":"a","á":"a","â":"a","ã":"a","ä":"a","å":"a","æ":"ae","ç":"c","è":"e","é":"e","ê":"e","ë":"e","ì":"i","í":"i","î":"i","ï":"i","ð":"d","ñ":"n","ò":"o","ó":"o","ô":"o","õ":"o","ö":"o","ø":"o","ù":"u","ú":"u","û":"u","ü":"u","ý":"y","þ":"th","ÿ":"y","Ā":"A","ā":"a","Ă":"A","ă":"a","Ą":"A","ą":"a","Ć":"C","ć":"c","Č":"C","č":"c","Ď":"D","ď":"d","Đ":"DJ","đ":"dj","Ē":"E","ē":"e","Ė":"E","ė":"e","Ę":"e","ę":"e","Ě":"E","ě":"e","Ğ":"G","ğ":"g","Ģ":"G","ģ":"g","Ĩ":"I","ĩ":"i","Ī":"i","ī":"i","Į":"I","į":"i","İ":"I","ı":"i","Ķ":"k","ķ":"k","Ļ":"L","ļ":"l","Ľ":"L","ľ":"l","Ł":"L","ł":"l","Ń":"N","ń":"n","Ņ":"N","ņ":"n","Ň":"N","ň":"n","Ō":"O","ō":"o","Ő":"O","ő":"o","Œ":"OE","œ":"oe","Ŕ":"R","ŕ":"r","Ř":"R","ř":"r","Ś":"S","ś":"s","Ş":"S","ş":"s","Š":"S","š":"s","Ţ":"T","ţ":"t","Ť":"T","ť":"t","Ũ":"U","ũ":"u","Ū":"u","ū":"u","Ů":"U","ů":"u","Ű":"U","ű":"u","Ų":"U","ų":"u","Ŵ":"W","ŵ":"w","Ŷ":"Y","ŷ":"y","Ÿ":"Y","Ź":"Z","ź":"z","Ż":"Z","ż":"z","Ž":"Z","ž":"z","Ə":"E","ƒ":"f","Ơ":"O","ơ":"o","Ư":"U","ư":"u","Lj":"LJ","lj":"lj","Nj":"NJ","nj":"nj","Ș":"S","ș":"s","Ț":"T","ț":"t","ə":"e","˚":"o","Ά":"A","Έ":"E","Ή":"H","Ί":"I","Ό":"O","Ύ":"Y","Ώ":"W","ΐ":"i","Α":"A","Β":"B","Γ":"G","Δ":"D","Ε":"E","Ζ":"Z","Η":"H","Θ":"8","Ι":"I","Κ":"K","Λ":"L","Μ":"M","Ν":"N","Ξ":"3","Ο":"O","Π":"P","Ρ":"R","Σ":"S","Τ":"T","Υ":"Y","Φ":"F","Χ":"X","Ψ":"PS","Ω":"W","Ϊ":"I","Ϋ":"Y","ά":"a","έ":"e","ή":"h","ί":"i","ΰ":"y","α":"a","β":"b","γ":"g","δ":"d","ε":"e","ζ":"z","η":"h","θ":"8","ι":"i","κ":"k","λ":"l","μ":"m","ν":"n","ξ":"3","ο":"o","π":"p","ρ":"r","ς":"s","σ":"s","τ":"t","υ":"y","φ":"f","χ":"x","ψ":"ps","ω":"w","ϊ":"i","ϋ":"y","ό":"o","ύ":"y","ώ":"w","Ё":"Yo","Ђ":"DJ","Є":"Ye","І":"I","Ї":"Yi","Ј":"J","Љ":"LJ","Њ":"NJ","Ћ":"C","Џ":"DZ","А":"A","Б":"B","В":"V","Г":"G","Д":"D","Е":"E","Ж":"Zh","З":"Z","И":"I","Й":"J","К":"K","Л":"L","М":"M","Н":"N","О":"O","П":"P","Р":"R","С":"S","Т":"T","У":"U","Ф":"F","Х":"H","Ц":"C","Ч":"Ch","Ш":"Sh","Щ":"Sh","Ъ":"U","Ы":"Y","Ь":"","Э":"E","Ю":"Yu","Я":"Ya","а":"a","б":"b","в":"v","г":"g","д":"d","е":"e","ж":"zh","з":"z","и":"i","й":"j","к":"k","л":"l","м":"m","н":"n","о":"o","п":"p","р":"r","с":"s","т":"t","у":"u","ф":"f","х":"h","ц":"c","ч":"ch","ш":"sh","щ":"sh","ъ":"u","ы":"y","ь":"","э":"e","ю":"yu","я":"ya","ё":"yo","ђ":"dj","є":"ye","і":"i","ї":"yi","ј":"j","љ":"lj","њ":"nj","ћ":"c","ѝ":"u","џ":"dz","Ґ":"G","ґ":"g","Ғ":"GH","ғ":"gh","Қ":"KH","қ":"kh","Ң":"NG","ң":"ng","Ү":"UE","ү":"ue","Ұ":"U","ұ":"u","Һ":"H","һ":"h","Ә":"AE","ә":"ae","Ө":"OE","ө":"oe","Ա":"A","Բ":"B","Գ":"G","Դ":"D","Ե":"E","Զ":"Z","Է":"E\'","Ը":"Y\'","Թ":"T\'","Ժ":"JH","Ի":"I","Լ":"L","Խ":"X","Ծ":"C\'","Կ":"K","Հ":"H","Ձ":"D\'","Ղ":"GH","Ճ":"TW","Մ":"M","Յ":"Y","Ն":"N","Շ":"SH","Չ":"CH","Պ":"P","Ջ":"J","Ռ":"R\'","Ս":"S","Վ":"V","Տ":"T","Ր":"R","Ց":"C","Փ":"P\'","Ք":"Q\'","Օ":"O\'\'","Ֆ":"F","և":"EV","ء":"a","آ":"aa","أ":"a","ؤ":"u","إ":"i","ئ":"e","ا":"a","ب":"b","ة":"h","ت":"t","ث":"th","ج":"j","ح":"h","خ":"kh","د":"d","ذ":"th","ر":"r","ز":"z","س":"s","ش":"sh","ص":"s","ض":"dh","ط":"t","ظ":"z","ع":"a","غ":"gh","ف":"f","ق":"q","ك":"k","ل":"l","م":"m","ن":"n","ه":"h","و":"w","ى":"a","ي":"y","ً":"an","ٌ":"on","ٍ":"en","َ":"a","ُ":"u","ِ":"e","ْ":"","٠":"0","١":"1","٢":"2","٣":"3","٤":"4","٥":"5","٦":"6","٧":"7","٨":"8","٩":"9","پ":"p","چ":"ch","ژ":"zh","ک":"k","گ":"g","ی":"y","۰":"0","۱":"1","۲":"2","۳":"3","۴":"4","۵":"5","۶":"6","۷":"7","۸":"8","۹":"9","฿":"baht","ა":"a","ბ":"b","გ":"g","დ":"d","ე":"e","ვ":"v","ზ":"z","თ":"t","ი":"i","კ":"k","ლ":"l","მ":"m","ნ":"n","ო":"o","პ":"p","ჟ":"zh","რ":"r","ს":"s","ტ":"t","უ":"u","ფ":"f","ქ":"k","ღ":"gh","ყ":"q","შ":"sh","ჩ":"ch","ც":"ts","ძ":"dz","წ":"ts","ჭ":"ch","ხ":"kh","ჯ":"j","ჰ":"h","Ṣ":"S","ṣ":"s","Ẁ":"W","ẁ":"w","Ẃ":"W","ẃ":"w","Ẅ":"W","ẅ":"w","ẞ":"SS","Ạ":"A","ạ":"a","Ả":"A","ả":"a","Ấ":"A","ấ":"a","Ầ":"A","ầ":"a","Ẩ":"A","ẩ":"a","Ẫ":"A","ẫ":"a","Ậ":"A","ậ":"a","Ắ":"A","ắ":"a","Ằ":"A","ằ":"a","Ẳ":"A","ẳ":"a","Ẵ":"A","ẵ":"a","Ặ":"A","ặ":"a","Ẹ":"E","ẹ":"e","Ẻ":"E","ẻ":"e","Ẽ":"E","ẽ":"e","Ế":"E","ế":"e","Ề":"E","ề":"e","Ể":"E","ể":"e","Ễ":"E","ễ":"e","Ệ":"E","ệ":"e","Ỉ":"I","ỉ":"i","Ị":"I","ị":"i","Ọ":"O","ọ":"o","Ỏ":"O","ỏ":"o","Ố":"O","ố":"o","Ồ":"O","ồ":"o","Ổ":"O","ổ":"o","Ỗ":"O","ỗ":"o","Ộ":"O","ộ":"o","Ớ":"O","ớ":"o","Ờ":"O","ờ":"o","Ở":"O","ở":"o","Ỡ":"O","ỡ":"o","Ợ":"O","ợ":"o","Ụ":"U","ụ":"u","Ủ":"U","ủ":"u","Ứ":"U","ứ":"u","Ừ":"U","ừ":"u","Ử":"U","ử":"u","Ữ":"U","ữ":"u","Ự":"U","ự":"u","Ỳ":"Y","ỳ":"y","Ỵ":"Y","ỵ":"y","Ỷ":"Y","ỷ":"y","Ỹ":"Y","ỹ":"y","–":"-","‘":"\'","’":"\'","“":"\\"","”":"\\"","„":"\\"","†":"+","•":"*","…":"...","₠":"ecu","₢":"cruzeiro","₣":"french franc","₤":"lira","₥":"mill","₦":"naira","₧":"peseta","₨":"rupee","₩":"won","₪":"new shequel","₫":"dong","€":"euro","₭":"kip","₮":"tugrik","₯":"drachma","₰":"penny","₱":"peso","₲":"guarani","₳":"austral","₴":"hryvnia","₵":"cedi","₸":"kazakhstani tenge","₹":"indian rupee","₺":"turkish lira","₽":"russian ruble","₿":"bitcoin","℠":"sm","™":"tm","∂":"d","∆":"delta","∑":"sum","∞":"infinity","♥":"love","元":"yuan","円":"yen","﷼":"rial","ﻵ":"laa","ﻷ":"laa","ﻹ":"lai","ﻻ":"la"}'
|
|
14
14
|
)
|
|
15
15
|
var locales = JSON.parse(
|
|
16
16
|
'{"bg":{"Й":"Y","Ц":"Ts","Щ":"Sht","Ъ":"A","Ь":"Y","й":"y","ц":"ts","щ":"sht","ъ":"a","ь":"y"},"de":{"Ä":"AE","ä":"ae","Ö":"OE","ö":"oe","Ü":"UE","ü":"ue","ß":"ss","%":"prozent","&":"und","|":"oder","∑":"summe","∞":"unendlich","♥":"liebe"},"es":{"%":"por ciento","&":"y","<":"menor que",">":"mayor que","|":"o","¢":"centavos","£":"libras","¤":"moneda","₣":"francos","∑":"suma","∞":"infinito","♥":"amor"},"fr":{"%":"pourcent","&":"et","<":"plus petit",">":"plus grand","|":"ou","¢":"centime","£":"livre","¤":"devise","₣":"franc","∑":"somme","∞":"infini","♥":"amour"},"pt":{"%":"porcento","&":"e","<":"menor",">":"maior","|":"ou","¢":"centavo","∑":"soma","£":"libra","∞":"infinito","♥":"amor"},"uk":{"И":"Y","и":"y","Й":"Y","й":"y","Ц":"Ts","ц":"ts","Х":"Kh","х":"kh","Щ":"Shch","щ":"shch","Г":"H","г":"h"},"vi":{"Đ":"D","đ":"d"},"da":{"Ø":"OE","ø":"oe","Å":"AA","å":"aa","%":"procent","&":"og","|":"eller","$":"dollar","<":"mindre end",">":"større end"},"nb":{"&":"og","Å":"AA","Æ":"AE","Ø":"OE","å":"aa","æ":"ae","ø":"oe"},"it":{"&":"e"},"nl":{"&":"en"},"sv":{"&":"och","Å":"AA","Ä":"AE","Ö":"OE","å":"aa","ä":"ae","ö":"oe"}}'
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
.normalize()
|
|
34
34
|
.split('')
|
|
35
35
|
// replace characters based on charMap
|
|
36
|
-
.reduce(
|
|
36
|
+
.reduce((result, ch) => {
|
|
37
37
|
var appendChar = locale[ch]
|
|
38
38
|
if (appendChar === undefined) appendChar = charMap[ch]
|
|
39
39
|
if (appendChar === undefined) appendChar = ch
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
return slug
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
replace.extend =
|
|
68
|
+
replace.extend = (customMap) => {
|
|
69
69
|
Object.assign(charMap, customMap)
|
|
70
70
|
}
|
|
71
71
|
|
package/scripts/new.mjs
CHANGED
|
@@ -89,20 +89,19 @@ export default function main(args) {
|
|
|
89
89
|
|
|
90
90
|
const fileExtension = parsedArgs.mdx ? '.mdx' : '.md'
|
|
91
91
|
const fileName = getPostSlug(postTitle) + fileExtension
|
|
92
|
-
|
|
92
|
+
|
|
93
93
|
let fullPath
|
|
94
94
|
if (parsedArgs.folder) {
|
|
95
|
-
const folderName = getPostSlug(postTitle)
|
|
96
|
-
const folderPath = path.join(TARGET_DIR, folderName)
|
|
95
|
+
const folderName = getPostSlug(postTitle)
|
|
96
|
+
const folderPath = path.join(TARGET_DIR, folderName)
|
|
97
97
|
if (!fs.existsSync(folderPath)) {
|
|
98
|
-
fs.mkdirSync(folderPath, { recursive: true })
|
|
98
|
+
fs.mkdirSync(folderPath, { recursive: true })
|
|
99
99
|
}
|
|
100
|
-
const fileName =
|
|
101
|
-
fullPath = path.join(folderPath, fileName)
|
|
100
|
+
const fileName = `index${fileExtension}`
|
|
101
|
+
fullPath = path.join(folderPath, fileName)
|
|
102
102
|
} else {
|
|
103
|
-
fullPath = path.join(TARGET_DIR, fileName)
|
|
103
|
+
fullPath = path.join(TARGET_DIR, fileName)
|
|
104
104
|
}
|
|
105
|
-
|
|
106
105
|
|
|
107
106
|
console.log('Full path:', fullPath)
|
|
108
107
|
|
package/types/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { Icons } from '../libs/icons'
|
|
1
|
+
import type { Icons } from '../libs/icons'
|
|
2
2
|
|
|
3
3
|
export type { IntegrationUserConfig } from './integrations-config'
|
|
4
4
|
export type { ThemeUserConfig } from './theme-config'
|
|
5
|
-
export type {
|
|
5
|
+
export type { UserConfig as ConfigOutput, UserInputConfig as Config } from './user-config'
|
|
6
6
|
|
|
7
7
|
export interface SiteMeta {
|
|
8
8
|
title: string
|
|
@@ -52,6 +52,8 @@ export const IntegrationConfigSchema = () =>
|
|
|
52
52
|
enable: z.boolean().default(false),
|
|
53
53
|
/** The server to use for the Waline comment system. */
|
|
54
54
|
server: z.string().optional(),
|
|
55
|
+
/** Show meta info for comments */
|
|
56
|
+
showMeta: z.boolean().default(true),
|
|
55
57
|
/** The emoji to use for the Waline comment system. */
|
|
56
58
|
emoji: z.array(z.string()).optional(),
|
|
57
59
|
/** Additional configurations for the Waline comment system. */
|
package/types/theme-config.ts
CHANGED
|
@@ -172,11 +172,7 @@ export const ThemeConfigSchema = () =>
|
|
|
172
172
|
content: z.object({
|
|
173
173
|
externalLinks: z.object({
|
|
174
174
|
/** Content to show for external links */
|
|
175
|
-
content: z
|
|
176
|
-
.string()
|
|
177
|
-
.optional()
|
|
178
|
-
.default(' ↗')
|
|
179
|
-
.describe('Content to show for external links'),
|
|
175
|
+
content: z.string().optional().default(' ↗').describe('Content to show for external links'),
|
|
180
176
|
/** Properties for the external links element */
|
|
181
177
|
properties: z
|
|
182
178
|
.record(z.string())
|
package/utils/class-merge.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ClassValue, clsx } from './clsx'
|
|
2
2
|
|
|
3
3
|
export function simpleMerge(...classes: string[]): string {
|
|
4
4
|
const uniqueClasses = new Set<string>()
|
|
5
5
|
|
|
6
6
|
classes.forEach((cls) => {
|
|
7
7
|
if (cls) {
|
|
8
|
-
cls.split(' ').forEach((c) =>
|
|
8
|
+
cls.split(' ').forEach((c) => {
|
|
9
|
+
uniqueClasses.add(c)
|
|
10
|
+
})
|
|
9
11
|
}
|
|
10
12
|
})
|
|
11
13
|
|
package/utils/error-map.ts
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* source: https://github.com/withastro/astro/blob/main/packages/astro/src/content/error-map.ts
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { z } from 'astro:content'
|
|
7
6
|
import { AstroError } from 'astro/errors'
|
|
7
|
+
import type { z } from 'astro:content'
|
|
8
8
|
|
|
9
9
|
type TypeOrLiteralErrByPathEntry = {
|
|
10
10
|
code: 'invalid_type' | 'invalid_literal'
|
|
@@ -45,7 +45,10 @@ export async function parseAsyncWithFriendlyErrors<T extends z.Schema>(
|
|
|
45
45
|
return processParsedData(await schema.safeParseAsync(input, { errorMap }), message)
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
function processParsedData
|
|
48
|
+
function processParsedData<TSchema extends z.Schema>(
|
|
49
|
+
parsedData: z.SafeParseReturnType<z.output<TSchema>, z.input<TSchema>>,
|
|
50
|
+
message: string
|
|
51
|
+
): z.output<TSchema> {
|
|
49
52
|
if (!parsedData.success) {
|
|
50
53
|
throw new AstroError(message, parsedData.error.issues.map((i) => i.message).join('\n'))
|
|
51
54
|
}
|
|
@@ -60,17 +63,20 @@ const errorMap: z.ZodErrorMap = (baseError, ctx) => {
|
|
|
60
63
|
// raise a single error when `key` does not match:
|
|
61
64
|
// > Did not match union.
|
|
62
65
|
// > key: Expected `'tutorial' | 'blog'`, received 'foo'
|
|
63
|
-
|
|
64
|
-
for (const unionError of baseError.unionErrors.
|
|
66
|
+
const typeOrLiteralErrByPath: Map<string, TypeOrLiteralErrByPathEntry> = new Map()
|
|
67
|
+
for (const unionError of baseError.unionErrors.flatMap((e) => e.errors)) {
|
|
65
68
|
if (unionError.code === 'invalid_type' || unionError.code === 'invalid_literal') {
|
|
66
69
|
const flattenedErrorPath = flattenErrorPath(unionError.path)
|
|
67
70
|
if (typeOrLiteralErrByPath.has(flattenedErrorPath)) {
|
|
68
|
-
typeOrLiteralErrByPath
|
|
71
|
+
typeOrLiteralErrByPath
|
|
72
|
+
.get(flattenedErrorPath)
|
|
73
|
+
?.expected.push((unionError as { expected: unknown }).expected)
|
|
69
74
|
} else {
|
|
70
75
|
typeOrLiteralErrByPath.set(flattenedErrorPath, {
|
|
71
76
|
code: unionError.code,
|
|
72
|
-
received:
|
|
73
|
-
|
|
77
|
+
received:
|
|
78
|
+
'received' in unionError ? (unionError as { received: unknown }).received : undefined,
|
|
79
|
+
expected: [(unionError as { expected: unknown }).expected]
|
|
74
80
|
})
|
|
75
81
|
}
|
|
76
82
|
}
|
|
@@ -114,8 +120,8 @@ const errorMap: z.ZodErrorMap = (baseError, ctx) => {
|
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
122
|
if (expectedShapes.length) {
|
|
117
|
-
details.push(
|
|
118
|
-
details.push(
|
|
123
|
+
details.push(`> Expected type \`${expectedShapes.join(' | ')}\``)
|
|
124
|
+
details.push(`> Received \`${stringify(ctx.data)}\``)
|
|
119
125
|
}
|
|
120
126
|
}
|
|
121
127
|
|
|
@@ -128,8 +134,9 @@ const errorMap: z.ZodErrorMap = (baseError, ctx) => {
|
|
|
128
134
|
baseErrorPath,
|
|
129
135
|
getTypeOrLiteralMsg({
|
|
130
136
|
code: baseError.code,
|
|
131
|
-
received:
|
|
132
|
-
|
|
137
|
+
received:
|
|
138
|
+
'received' in baseError ? (baseError as { received: unknown }).received : undefined,
|
|
139
|
+
expected: [(baseError as { expected: unknown }).expected]
|
|
133
140
|
})
|
|
134
141
|
)
|
|
135
142
|
}
|
|
@@ -16,6 +16,8 @@ type Options = {
|
|
|
16
16
|
* @returns {string}
|
|
17
17
|
* Serialized `value`.
|
|
18
18
|
*/
|
|
19
|
+
|
|
20
|
+
// biome-ignore lint/suspicious/noShadowRestrictedNames: this is the original package expression
|
|
19
21
|
export default function toString(value: unknown, options?: Options): string {
|
|
20
22
|
const { includeImageAlt = true, includeHtml = true } = options || {}
|
|
21
23
|
return serialize(value, includeImageAlt, includeHtml)
|
package/utils/reading-time.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
1
|
// Tks for issue https://github.com/cworld1/astro-theme-pure/issues/36
|
|
4
2
|
// CJK character ranges
|
|
5
3
|
const CJK_RANGES = [
|
|
@@ -67,7 +65,7 @@ export function getReadingTime(text: string, wordsPerMinute: number = 200): Read
|
|
|
67
65
|
const displayed = Math.ceil(minutes)
|
|
68
66
|
|
|
69
67
|
return {
|
|
70
|
-
text: displayed
|
|
68
|
+
text: `${displayed} min`,
|
|
71
69
|
minutes,
|
|
72
70
|
time,
|
|
73
71
|
words
|
package/utils/server.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type CollectionEntry, type CollectionKey, getCollection } from 'astro:content'
|
|
2
2
|
|
|
3
3
|
type Collections = CollectionEntry<CollectionKey>[]
|
|
4
4
|
|
|
@@ -27,7 +27,7 @@ export function groupCollectionsByYear<T extends CollectionKey>(
|
|
|
27
27
|
if (!acc.has(year)) {
|
|
28
28
|
acc.set(year, [])
|
|
29
29
|
}
|
|
30
|
-
acc.get(year)
|
|
30
|
+
acc.get(year)?.push(collection)
|
|
31
31
|
}
|
|
32
32
|
return acc
|
|
33
33
|
}, new Map<number, Collections>())
|