このコミットが含まれているのは:
@@ -12,23 +12,14 @@ const bytesize = (value: string): number =>
|
||||
new TextEncoder ().encode (value).length
|
||||
|
||||
|
||||
const normaliseImportUrl = (value: string): string | null => {
|
||||
const parseImportUrl = (value: string): URL | null => {
|
||||
const trimmed = value.trim ()
|
||||
if (!(trimmed))
|
||||
return null
|
||||
|
||||
try
|
||||
{
|
||||
const url = new URL (trimmed)
|
||||
if (!(url.protocol === 'http:' || url.protocol === 'https:'))
|
||||
return null
|
||||
if (!(url.host))
|
||||
return null
|
||||
|
||||
url.hostname = url.hostname.toLowerCase ()
|
||||
if (url.pathname.endsWith ('/'))
|
||||
url.pathname = url.pathname.replace (/\/+$/, '')
|
||||
return url.toString ()
|
||||
return new URL (trimmed)
|
||||
}
|
||||
catch
|
||||
{
|
||||
@@ -37,12 +28,23 @@ const normaliseImportUrl = (value: string): string | null => {
|
||||
}
|
||||
|
||||
|
||||
export const countImportSourceLines = (source: string): number =>
|
||||
const normaliseImportUrl = (url: URL): string => {
|
||||
url.hostname = url.hostname.toLowerCase ()
|
||||
if (url.pathname.endsWith ('/'))
|
||||
url.pathname = url.pathname.replace (/\/+$/, '')
|
||||
return url.toString ()
|
||||
}
|
||||
|
||||
|
||||
export const extractImportSourceUrls = (source: string): string[] =>
|
||||
source
|
||||
.split (/\r\n|\n|\r/)
|
||||
.map (line => line.trim ())
|
||||
.filter (line => line !== '')
|
||||
.length
|
||||
|
||||
|
||||
export const countImportSourceLines = (source: string): number =>
|
||||
extractImportSourceUrls (source).length
|
||||
|
||||
|
||||
export const validateImportSource = (
|
||||
@@ -61,7 +63,6 @@ export const validateImportSource = (
|
||||
++count
|
||||
const sourceRow = index + 1
|
||||
const displayUrl = truncateUrl (value)
|
||||
const normalised = normaliseImportUrl (value)
|
||||
if (count > MAX_ROWS)
|
||||
{
|
||||
issues.push ({
|
||||
@@ -70,14 +71,6 @@ export const validateImportSource = (
|
||||
url: displayUrl })
|
||||
return
|
||||
}
|
||||
if (!(value.startsWith ('http://') || value.startsWith ('https://')))
|
||||
{
|
||||
issues.push ({
|
||||
sourceRow,
|
||||
message: 'HTTP または HTTPS の URL ではありません.',
|
||||
url: displayUrl })
|
||||
return
|
||||
}
|
||||
if (bytesize (value) > MAX_URL_BYTES)
|
||||
{
|
||||
issues.push ({
|
||||
@@ -86,7 +79,8 @@ export const validateImportSource = (
|
||||
url: displayUrl })
|
||||
return
|
||||
}
|
||||
if (normalised == null)
|
||||
const parsed = parseImportUrl (value)
|
||||
if (parsed == null)
|
||||
{
|
||||
issues.push ({
|
||||
sourceRow,
|
||||
@@ -94,6 +88,23 @@ export const validateImportSource = (
|
||||
url: displayUrl })
|
||||
return
|
||||
}
|
||||
if (!(parsed.protocol === 'http:' || parsed.protocol === 'https:'))
|
||||
{
|
||||
issues.push ({
|
||||
sourceRow,
|
||||
message: 'HTTP または HTTPS の URL ではありません.',
|
||||
url: displayUrl })
|
||||
return
|
||||
}
|
||||
if (!(parsed.host))
|
||||
{
|
||||
issues.push ({
|
||||
sourceRow,
|
||||
message: 'URL の形式が不正です.',
|
||||
url: displayUrl })
|
||||
return
|
||||
}
|
||||
const normalised = normaliseImportUrl (parsed)
|
||||
const duplicateRow = seen.get (normalised)
|
||||
if (duplicateRow != null)
|
||||
{
|
||||
|
||||
新しいイシューから参照
ユーザーをブロックする