@tanstack/start-plugin-core 1.120.4-alpha.9 → 1.121.0-alpha.10
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/dist/cjs/build-sitemap.cjs +138 -0
- package/dist/cjs/build-sitemap.cjs.map +1 -0
- package/dist/cjs/build-sitemap.d.cts +31 -0
- package/dist/cjs/constants.cjs +10 -0
- package/dist/cjs/constants.cjs.map +1 -0
- package/dist/cjs/constants.d.cts +4 -0
- package/dist/cjs/index.cjs +2 -6
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +1 -5
- package/dist/cjs/nitro/dev-server-plugin.cjs +11 -3
- package/dist/cjs/nitro/dev-server-plugin.cjs.map +1 -1
- package/dist/cjs/nitro/nitro-plugin.cjs +78 -13
- package/dist/cjs/nitro/nitro-plugin.cjs.map +1 -1
- package/dist/cjs/plugin.cjs +88 -17
- package/dist/cjs/plugin.cjs.map +1 -1
- package/dist/cjs/plugin.d.cts +836 -615
- package/dist/cjs/prerender.cjs +23 -24
- package/dist/cjs/prerender.cjs.map +1 -1
- package/dist/cjs/routesManifestPlugin.cjs +6 -3
- package/dist/cjs/routesManifestPlugin.cjs.map +1 -1
- package/dist/cjs/schema.cjs +27 -6
- package/dist/cjs/schema.cjs.map +1 -1
- package/dist/cjs/schema.d.cts +2729 -2094
- package/dist/cjs/start-server-routes-plugin/plugin.cjs +2 -1
- package/dist/cjs/start-server-routes-plugin/plugin.cjs.map +1 -1
- package/dist/cjs/utils.cjs +18 -0
- package/dist/cjs/utils.cjs.map +1 -0
- package/dist/cjs/utils.d.cts +8 -0
- package/dist/esm/build-sitemap.d.ts +31 -0
- package/dist/esm/build-sitemap.js +138 -0
- package/dist/esm/build-sitemap.js.map +1 -0
- package/dist/esm/constants.d.ts +4 -0
- package/dist/esm/constants.js +10 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.d.ts +1 -5
- package/dist/esm/index.js +3 -7
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/nitro/dev-server-plugin.js +11 -3
- package/dist/esm/nitro/dev-server-plugin.js.map +1 -1
- package/dist/esm/nitro/nitro-plugin.js +62 -14
- package/dist/esm/nitro/nitro-plugin.js.map +1 -1
- package/dist/esm/plugin.d.ts +836 -615
- package/dist/esm/plugin.js +71 -17
- package/dist/esm/plugin.js.map +1 -1
- package/dist/esm/prerender.js +23 -24
- package/dist/esm/prerender.js.map +1 -1
- package/dist/esm/routesManifestPlugin.js +6 -3
- package/dist/esm/routesManifestPlugin.js.map +1 -1
- package/dist/esm/schema.d.ts +2729 -2094
- package/dist/esm/schema.js +28 -7
- package/dist/esm/schema.js.map +1 -1
- package/dist/esm/start-server-routes-plugin/plugin.js +6 -5
- package/dist/esm/start-server-routes-plugin/plugin.js.map +1 -1
- package/dist/esm/utils.d.ts +8 -0
- package/dist/esm/utils.js +18 -0
- package/dist/esm/utils.js.map +1 -0
- package/package.json +6 -4
- package/src/build-sitemap.ts +213 -0
- package/src/constants.ts +6 -0
- package/src/index.ts +1 -8
- package/src/nitro/dev-server-plugin.ts +14 -4
- package/src/nitro/nitro-plugin.ts +104 -30
- package/src/plugin.ts +88 -17
- package/src/prerender.ts +30 -30
- package/src/routesManifestPlugin.ts +7 -3
- package/src/schema.ts +37 -10
- package/src/start-server-routes-plugin/plugin.ts +2 -1
- package/src/utils.ts +14 -0
- package/dist/cjs/nitro/build-nitro.cjs +0 -18
- package/dist/cjs/nitro/build-nitro.cjs.map +0 -1
- package/dist/cjs/nitro/build-nitro.d.cts +0 -2
- package/dist/cjs/nitro/build-sitemap.cjs +0 -54
- package/dist/cjs/nitro/build-sitemap.cjs.map +0 -1
- package/dist/cjs/nitro/build-sitemap.d.cts +0 -9
- package/dist/esm/nitro/build-nitro.d.ts +0 -2
- package/dist/esm/nitro/build-nitro.js +0 -18
- package/dist/esm/nitro/build-nitro.js.map +0 -1
- package/dist/esm/nitro/build-sitemap.d.ts +0 -9
- package/dist/esm/nitro/build-sitemap.js +0 -54
- package/dist/esm/nitro/build-sitemap.js.map +0 -1
- package/src/nitro/build-nitro.ts +0 -27
- package/src/nitro/build-sitemap.ts +0 -79
package/src/prerender.ts
CHANGED
|
@@ -5,7 +5,8 @@ import { getRollupConfig } from 'nitropack/rollup'
|
|
|
5
5
|
import { build as buildNitro, createNitro } from 'nitropack'
|
|
6
6
|
import { joinURL, withBase, withoutBase } from 'ufo'
|
|
7
7
|
import { Queue } from './queue'
|
|
8
|
-
import {
|
|
8
|
+
import { VITE_ENVIRONMENT_NAMES } from './constants'
|
|
9
|
+
import { createLogger } from './utils'
|
|
9
10
|
import type { ViteBuilder } from 'vite'
|
|
10
11
|
import type { $Fetch, Nitro } from 'nitropack'
|
|
11
12
|
import type { TanStackStartOutputConfig } from './plugin'
|
|
@@ -20,7 +21,8 @@ export async function prerender({
|
|
|
20
21
|
nitro: Nitro
|
|
21
22
|
builder: ViteBuilder
|
|
22
23
|
}) {
|
|
23
|
-
|
|
24
|
+
const logger = createLogger('prerender')
|
|
25
|
+
logger.info('Prendering pages...')
|
|
24
26
|
|
|
25
27
|
// If prerender is enabled but no pages are provided, default to prerendering the root page
|
|
26
28
|
if (options.prerender?.enabled && !options.pages.length) {
|
|
@@ -31,10 +33,12 @@ export async function prerender({
|
|
|
31
33
|
]
|
|
32
34
|
}
|
|
33
35
|
|
|
34
|
-
const serverEnv = builder.environments[
|
|
36
|
+
const serverEnv = builder.environments[VITE_ENVIRONMENT_NAMES.server]
|
|
35
37
|
|
|
36
38
|
if (!serverEnv) {
|
|
37
|
-
throw new Error(
|
|
39
|
+
throw new Error(
|
|
40
|
+
`Vite's "${VITE_ENVIRONMENT_NAMES.server}" environment not found`,
|
|
41
|
+
)
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
const prerenderOutputDir = path.resolve(
|
|
@@ -69,7 +73,7 @@ export async function prerender({
|
|
|
69
73
|
},
|
|
70
74
|
}
|
|
71
75
|
|
|
72
|
-
await
|
|
76
|
+
await buildNitro(nodeNitro)
|
|
73
77
|
|
|
74
78
|
// Import renderer entry
|
|
75
79
|
const serverFilename =
|
|
@@ -90,14 +94,14 @@ export async function prerender({
|
|
|
90
94
|
// Crawl all pages
|
|
91
95
|
const pages = await prerenderPages()
|
|
92
96
|
|
|
93
|
-
|
|
97
|
+
logger.info(`Prerendered ${pages.length} pages:`)
|
|
94
98
|
pages.forEach((page) => {
|
|
95
|
-
|
|
99
|
+
logger.info(`- ${page}`)
|
|
96
100
|
})
|
|
97
101
|
|
|
98
102
|
// TODO: Write the prerendered pages to the output directory
|
|
99
103
|
} catch (error) {
|
|
100
|
-
|
|
104
|
+
logger.error(error)
|
|
101
105
|
} finally {
|
|
102
106
|
// Ensure server is always closed
|
|
103
107
|
// server.process.kill()
|
|
@@ -123,18 +127,10 @@ export async function prerender({
|
|
|
123
127
|
const seen = new Set<string>()
|
|
124
128
|
const retriesByPath = new Map<string, number>()
|
|
125
129
|
const concurrency = options.prerender?.concurrency ?? os.cpus().length
|
|
126
|
-
|
|
130
|
+
logger.info(`Concurrency: ${concurrency}`)
|
|
127
131
|
const queue = new Queue({ concurrency })
|
|
128
132
|
|
|
129
|
-
options.pages.forEach((
|
|
130
|
-
let page = _page as Page
|
|
131
|
-
|
|
132
|
-
if (typeof _page === 'string') {
|
|
133
|
-
page = { path: _page }
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
addCrawlPageTask(page)
|
|
137
|
-
})
|
|
133
|
+
options.pages.forEach((page) => addCrawlPageTask(page))
|
|
138
134
|
|
|
139
135
|
await queue.start()
|
|
140
136
|
|
|
@@ -165,7 +161,7 @@ export async function prerender({
|
|
|
165
161
|
|
|
166
162
|
// Add the task
|
|
167
163
|
queue.add(async () => {
|
|
168
|
-
|
|
164
|
+
logger.info(`Crawling: ${page.path}`)
|
|
169
165
|
const retries = retriesByPath.get(page.path) || 0
|
|
170
166
|
try {
|
|
171
167
|
// Fetch the route
|
|
@@ -179,23 +175,29 @@ export async function prerender({
|
|
|
179
175
|
)
|
|
180
176
|
|
|
181
177
|
if (!res.ok) {
|
|
182
|
-
throw new Error(`Failed to fetch ${page.path}: ${res.statusText}
|
|
178
|
+
throw new Error(`Failed to fetch ${page.path}: ${res.statusText}`, {
|
|
179
|
+
cause: res,
|
|
180
|
+
})
|
|
183
181
|
}
|
|
184
182
|
|
|
183
|
+
const cleanPagePath = (
|
|
184
|
+
prerenderOptions.outputPath || page.path
|
|
185
|
+
).split(/[?#]/)[0]!
|
|
186
|
+
|
|
185
187
|
// Guess route type and populate fileName
|
|
186
188
|
const contentType = res.headers.get('content-type') || ''
|
|
187
189
|
const isImplicitHTML =
|
|
188
|
-
!
|
|
190
|
+
!cleanPagePath.endsWith('.html') && contentType.includes('html')
|
|
189
191
|
// &&
|
|
190
192
|
// !JsonSigRx.test(dataBuff.subarray(0, 32).toString('utf8'))
|
|
191
|
-
const routeWithIndex =
|
|
192
|
-
?
|
|
193
|
-
:
|
|
193
|
+
const routeWithIndex = cleanPagePath.endsWith('/')
|
|
194
|
+
? cleanPagePath + 'index'
|
|
195
|
+
: cleanPagePath
|
|
194
196
|
|
|
195
197
|
const htmlPath =
|
|
196
|
-
|
|
197
|
-
? joinURL(
|
|
198
|
-
:
|
|
198
|
+
cleanPagePath.endsWith('/') || prerenderOptions.autoSubfolderIndex
|
|
199
|
+
? joinURL(cleanPagePath, 'index.html')
|
|
200
|
+
: cleanPagePath + '.html'
|
|
199
201
|
|
|
200
202
|
const filename = withoutBase(
|
|
201
203
|
isImplicitHTML ? htmlPath : routeWithIndex,
|
|
@@ -227,9 +229,7 @@ export async function prerender({
|
|
|
227
229
|
}
|
|
228
230
|
} catch (error) {
|
|
229
231
|
if (retries < (prerenderOptions.retryCount ?? 0)) {
|
|
230
|
-
|
|
231
|
-
`Encountered error, retrying: ${page.path} in 500ms`,
|
|
232
|
-
)
|
|
232
|
+
logger.warn(`Encountered error, retrying: ${page.path} in 500ms`)
|
|
233
233
|
await new Promise((resolve) =>
|
|
234
234
|
setTimeout(resolve, prerenderOptions.retryDelay),
|
|
235
235
|
)
|
|
@@ -2,6 +2,7 @@ import { readFileSync } from 'node:fs'
|
|
|
2
2
|
import path from 'node:path'
|
|
3
3
|
import { joinURL } from 'ufo'
|
|
4
4
|
import { rootRouteId } from '@tanstack/router-core'
|
|
5
|
+
import { resolveViteId } from './utils'
|
|
5
6
|
import type {
|
|
6
7
|
PluginOption,
|
|
7
8
|
ResolvedConfig,
|
|
@@ -16,6 +17,9 @@ export function startManifestPlugin(
|
|
|
16
17
|
): PluginOption {
|
|
17
18
|
let config: ResolvedConfig
|
|
18
19
|
|
|
20
|
+
const moduleId = 'tanstack-start-router-manifest:v'
|
|
21
|
+
const resolvedModuleId = resolveViteId(moduleId)
|
|
22
|
+
|
|
19
23
|
return {
|
|
20
24
|
name: 'tsr-routes-manifest',
|
|
21
25
|
enforce: 'pre',
|
|
@@ -27,13 +31,13 @@ export function startManifestPlugin(
|
|
|
27
31
|
// config = envConfig.
|
|
28
32
|
// },
|
|
29
33
|
resolveId(id) {
|
|
30
|
-
if (id ===
|
|
31
|
-
return
|
|
34
|
+
if (id === moduleId) {
|
|
35
|
+
return resolvedModuleId
|
|
32
36
|
}
|
|
33
37
|
return
|
|
34
38
|
},
|
|
35
39
|
load(id) {
|
|
36
|
-
if (id ===
|
|
40
|
+
if (id === resolvedModuleId) {
|
|
37
41
|
if (this.environment.config.consumer !== 'server') {
|
|
38
42
|
// this will ultimately fail the build if the plugin is used outside the server environment
|
|
39
43
|
// TODO: do we need special handling for `serve`?
|
package/src/schema.ts
CHANGED
|
@@ -4,9 +4,12 @@ import { z } from 'zod'
|
|
|
4
4
|
import { configSchema, getConfig } from '@tanstack/router-generator'
|
|
5
5
|
import type { NitroConfig } from 'nitropack'
|
|
6
6
|
|
|
7
|
-
const tsrConfig = configSchema
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
const tsrConfig = configSchema
|
|
8
|
+
.omit({ autoCodeSplitting: true })
|
|
9
|
+
.partial()
|
|
10
|
+
.extend({
|
|
11
|
+
srcDirectory: z.string().optional().default('src'),
|
|
12
|
+
})
|
|
10
13
|
|
|
11
14
|
export function createTanStackConfig<
|
|
12
15
|
TFrameworkPlugin extends Record<string, unknown>,
|
|
@@ -48,6 +51,14 @@ export function createTanStackConfig<
|
|
|
48
51
|
return path.join(srcDirectory, 'server.tsx')
|
|
49
52
|
}
|
|
50
53
|
|
|
54
|
+
if (existsSync(path.join(srcDirectory, 'server.ts'))) {
|
|
55
|
+
return path.join(srcDirectory, 'server.ts')
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (existsSync(path.join(srcDirectory, 'server.js'))) {
|
|
59
|
+
return path.join(srcDirectory, 'server.js')
|
|
60
|
+
}
|
|
61
|
+
|
|
51
62
|
return '/~start/default-server-entry'
|
|
52
63
|
})()
|
|
53
64
|
|
|
@@ -92,7 +103,7 @@ export function createTanStackStartOptionsSchema(
|
|
|
92
103
|
.default({}),
|
|
93
104
|
serverFns: z
|
|
94
105
|
.object({
|
|
95
|
-
base: z.string().optional().default('/
|
|
106
|
+
base: z.string().optional().default('/_serverFn'),
|
|
96
107
|
})
|
|
97
108
|
.optional()
|
|
98
109
|
.default({}),
|
|
@@ -103,13 +114,12 @@ export function createTanStackStartOptionsSchema(
|
|
|
103
114
|
})
|
|
104
115
|
.optional()
|
|
105
116
|
.default({}),
|
|
106
|
-
pages: z
|
|
107
|
-
|
|
108
|
-
.
|
|
109
|
-
|
|
110
|
-
sitemap: pagePrerenderOptionsSchema
|
|
111
|
-
.extend({
|
|
117
|
+
pages: z.array(pageSchema).optional().default([]),
|
|
118
|
+
sitemap: z
|
|
119
|
+
.object({
|
|
120
|
+
enabled: z.boolean().optional().default(true),
|
|
112
121
|
host: z.string().optional(),
|
|
122
|
+
outputPath: z.string().optional().default('sitemap.xml'),
|
|
113
123
|
})
|
|
114
124
|
.optional(),
|
|
115
125
|
prerender: z
|
|
@@ -121,6 +131,7 @@ export function createTanStackStartOptionsSchema(
|
|
|
121
131
|
})
|
|
122
132
|
.and(pagePrerenderOptionsSchema.optional())
|
|
123
133
|
.optional(),
|
|
134
|
+
spa: spaSchema.optional(),
|
|
124
135
|
})
|
|
125
136
|
.optional()
|
|
126
137
|
.default({})
|
|
@@ -170,6 +181,7 @@ const pageBaseSchema = z.object({
|
|
|
170
181
|
|
|
171
182
|
const pagePrerenderOptionsSchema = z.object({
|
|
172
183
|
enabled: z.boolean().optional(),
|
|
184
|
+
outputPath: z.string().optional(),
|
|
173
185
|
autoSubfolderIndex: z.boolean().optional(),
|
|
174
186
|
crawlLinks: z.boolean().optional(),
|
|
175
187
|
retryCount: z.number().optional(),
|
|
@@ -186,6 +198,21 @@ const pagePrerenderOptionsSchema = z.object({
|
|
|
186
198
|
.optional(),
|
|
187
199
|
})
|
|
188
200
|
|
|
201
|
+
const spaSchema = z.object({
|
|
202
|
+
enabled: z.boolean().optional().default(true),
|
|
203
|
+
maskPath: z.string().optional().default('/'),
|
|
204
|
+
prerender: pagePrerenderOptionsSchema
|
|
205
|
+
.optional()
|
|
206
|
+
.default({})
|
|
207
|
+
.transform((opts) => ({
|
|
208
|
+
outputPath: opts.outputPath ?? '/_shell',
|
|
209
|
+
crawlLinks: false,
|
|
210
|
+
retryCount: 0,
|
|
211
|
+
...opts,
|
|
212
|
+
enabled: true,
|
|
213
|
+
})),
|
|
214
|
+
})
|
|
215
|
+
|
|
189
216
|
export const pageSchema = pageBaseSchema.extend({
|
|
190
217
|
prerender: pagePrerenderOptionsSchema.optional(),
|
|
191
218
|
})
|
|
@@ -30,6 +30,7 @@ const setLock = (bool: boolean) => {
|
|
|
30
30
|
|
|
31
31
|
export function TanStackStartServerRoutesVite(config: Config): Plugin {
|
|
32
32
|
let ROOT: string = process.cwd()
|
|
33
|
+
const moduleId = 'tanstack-start-server-routes-manifest:v'
|
|
33
34
|
|
|
34
35
|
const getRoutesDirectoryPath = () => {
|
|
35
36
|
return isAbsolute(config.routesDirectory)
|
|
@@ -80,7 +81,7 @@ export function TanStackStartServerRoutesVite(config: Config): Plugin {
|
|
|
80
81
|
},
|
|
81
82
|
sharedDuringBuild: true,
|
|
82
83
|
resolveId(id) {
|
|
83
|
-
if (id ===
|
|
84
|
+
if (id === moduleId) {
|
|
84
85
|
const generatedRouteTreePath = getGeneratedRouteTreePath(ROOT)
|
|
85
86
|
return generatedRouteTreePath
|
|
86
87
|
}
|
package/src/utils.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function resolveViteId(id: string) {
|
|
2
|
+
return `\0${id}`
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export function createLogger(prefix: string) {
|
|
6
|
+
const label = `[${prefix}]`
|
|
7
|
+
return {
|
|
8
|
+
log: (...args: any) => console.log(label, ...args),
|
|
9
|
+
debug: (...args: any) => console.debug(label, ...args),
|
|
10
|
+
info: (...args: any) => console.info(label, ...args),
|
|
11
|
+
warn: (...args: any) => console.warn(label, ...args),
|
|
12
|
+
error: (...args: any) => console.error(label, ...args),
|
|
13
|
+
}
|
|
14
|
+
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const fs = require("node:fs");
|
|
4
|
-
const path = require("node:path");
|
|
5
|
-
const nitropack = require("nitropack");
|
|
6
|
-
async function buildNitroEnvironment(nitro, build) {
|
|
7
|
-
await nitropack.prepare(nitro);
|
|
8
|
-
await nitropack.copyPublicAssets(nitro);
|
|
9
|
-
await build();
|
|
10
|
-
const publicDir = nitro.options.output.publicDir;
|
|
11
|
-
const viteDir = path.resolve(publicDir, ".vite");
|
|
12
|
-
if (await fs.promises.stat(viteDir).catch(() => false)) {
|
|
13
|
-
await fs.promises.rm(viteDir, { recursive: true, force: true });
|
|
14
|
-
}
|
|
15
|
-
await nitro.close();
|
|
16
|
-
}
|
|
17
|
-
exports.buildNitroEnvironment = buildNitroEnvironment;
|
|
18
|
-
//# sourceMappingURL=build-nitro.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-nitro.cjs","sources":["../../../src/nitro/build-nitro.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport path from 'node:path'\nimport { copyPublicAssets, prepare } from 'nitropack'\nimport type { Nitro } from 'nitropack'\n\nexport async function buildNitroEnvironment(\n nitro: Nitro,\n build: () => Promise<any>,\n) {\n await prepare(nitro)\n await copyPublicAssets(nitro)\n await build()\n\n const publicDir = nitro.options.output.publicDir\n\n // As a part of the build process, the `.vite/` directory\n // is copied over from `.tanstack-start/build/client-dist/`\n // to the `publicDir` (e.g. `.output/public/`).\n // This directory (containing the vite manifest) should not be\n // included in the final build, so we remove it here.\n const viteDir = path.resolve(publicDir, '.vite')\n if (await fsp.stat(viteDir).catch(() => false)) {\n await fsp.rm(viteDir, { recursive: true, force: true })\n }\n\n await nitro.close()\n}\n"],"names":["prepare","copyPublicAssets","fsp"],"mappings":";;;;;AAKsB,eAAA,sBACpB,OACA,OACA;AACA,QAAMA,UAAAA,QAAQ,KAAK;AACnB,QAAMC,UAAAA,iBAAiB,KAAK;AAC5B,QAAM,MAAM;AAEN,QAAA,YAAY,MAAM,QAAQ,OAAO;AAOvC,QAAM,UAAU,KAAK,QAAQ,WAAW,OAAO;AAC3C,MAAA,MAAMC,YAAI,KAAK,OAAO,EAAE,MAAM,MAAM,KAAK,GAAG;AACxC,UAAAA,GAAA,SAAI,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,MAAM;AAAA,EAAA;AAGxD,QAAM,MAAM,MAAM;AACpB;;"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
-
const fs = require("node:fs");
|
|
4
|
-
const path = require("node:path");
|
|
5
|
-
const xmlbuilder2 = require("xmlbuilder2");
|
|
6
|
-
async function buildSitemap({
|
|
7
|
-
host,
|
|
8
|
-
routes,
|
|
9
|
-
outputDir
|
|
10
|
-
}) {
|
|
11
|
-
const routeList = await optionHasRoutes(routes);
|
|
12
|
-
if (routeList.length) {
|
|
13
|
-
const slash = checkSlash(host);
|
|
14
|
-
const sitemapData = routeList.map((page) => ({
|
|
15
|
-
page: `${host}${slash}${page.replace(/^\/+/g, "")}`,
|
|
16
|
-
lastMod: (/* @__PURE__ */ new Date()).toISOString().split("T")[0]
|
|
17
|
-
}));
|
|
18
|
-
const sitemap = createXml("urlset");
|
|
19
|
-
for (const item of sitemapData) {
|
|
20
|
-
const page = sitemap.ele("url");
|
|
21
|
-
page.ele("loc").txt(item.page);
|
|
22
|
-
page.ele("lastmod").txt(item.lastMod);
|
|
23
|
-
}
|
|
24
|
-
const mapPath = `${path.resolve(outputDir)}/sitemap.xml`;
|
|
25
|
-
try {
|
|
26
|
-
console.log(`Writing sitemap at ${mapPath}`);
|
|
27
|
-
fs.writeFileSync(mapPath, sitemap.end({ prettyPrint: true }));
|
|
28
|
-
} catch (e) {
|
|
29
|
-
console.error(`Unable to write file at ${mapPath}`, e);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function createXml(elementName) {
|
|
34
|
-
return xmlbuilder2.create({ version: "1.0", encoding: "UTF-8" }).ele(elementName, {
|
|
35
|
-
xmlns: "https://www.sitemaps.org/schemas/sitemap/0.9"
|
|
36
|
-
}).com(`This file was automatically generated by Analog.`);
|
|
37
|
-
}
|
|
38
|
-
function checkSlash(host) {
|
|
39
|
-
const finalChar = host.slice(-1);
|
|
40
|
-
return finalChar === "/" ? "" : "/";
|
|
41
|
-
}
|
|
42
|
-
async function optionHasRoutes(routes) {
|
|
43
|
-
let routeList;
|
|
44
|
-
if (typeof routes === "function") {
|
|
45
|
-
routeList = await routes();
|
|
46
|
-
} else if (Array.isArray(routes)) {
|
|
47
|
-
routeList = routes;
|
|
48
|
-
} else {
|
|
49
|
-
routeList = [];
|
|
50
|
-
}
|
|
51
|
-
return routeList.filter(Boolean);
|
|
52
|
-
}
|
|
53
|
-
exports.buildSitemap = buildSitemap;
|
|
54
|
-
//# sourceMappingURL=build-sitemap.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-sitemap.cjs","sources":["../../../src/nitro/build-sitemap.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { create } from 'xmlbuilder2'\nimport type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'\n\nexport type PagesJson = {\n page: string\n lastMod: string\n}\n\nexport async function buildSitemap({\n host,\n routes,\n outputDir,\n}: {\n host: string\n routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>)\n outputDir: string\n}) {\n const routeList: Array<string> = await optionHasRoutes(routes)\n\n if (routeList.length) {\n const slash = checkSlash(host)\n const sitemapData: Array<PagesJson> = routeList.map((page: string) => ({\n page: `${host}${slash}${page.replace(/^\\/+/g, '')}`,\n lastMod: new Date().toISOString().split('T')[0]!,\n }))\n\n const sitemap = createXml('urlset')\n\n for (const item of sitemapData) {\n const page = sitemap.ele('url')\n page.ele('loc').txt(item.page)\n page.ele('lastmod').txt(item.lastMod)\n }\n\n const mapPath = `${resolve(outputDir)}/sitemap.xml`\n try {\n console.log(`Writing sitemap at ${mapPath}`)\n writeFileSync(mapPath, sitemap.end({ prettyPrint: true }))\n } catch (e) {\n console.error(`Unable to write file at ${mapPath}`, e)\n }\n }\n}\n\nfunction createXml(elementName: 'urlset' | 'sitemapindex'): XMLBuilder {\n return create({ version: '1.0', encoding: 'UTF-8' })\n .ele(elementName, {\n xmlns: 'https://www.sitemaps.org/schemas/sitemap/0.9',\n })\n .com(`This file was automatically generated by Analog.`)\n}\n\nfunction checkSlash(host: string): string {\n const finalChar = host.slice(-1)\n return finalChar === '/' ? '' : '/'\n}\n\nasync function optionHasRoutes(\n routes:\n | Array<string | undefined>\n | (() => Promise<Array<string | undefined>>),\n): Promise<Array<string>> {\n let routeList: Array<string | undefined>\n\n if (typeof routes === 'function') {\n // returns an array or undefined\n routeList = await routes()\n } else if (Array.isArray(routes)) {\n // returns an array of strings\n routeList = routes\n } else {\n // default it to an empty of array\n routeList = []\n }\n\n return routeList.filter(Boolean) as Array<string>\n}\n"],"names":["resolve","writeFileSync","create"],"mappings":";;;;;AAUA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACK,QAAA,YAA2B,MAAM,gBAAgB,MAAM;AAE7D,MAAI,UAAU,QAAQ;AACd,UAAA,QAAQ,WAAW,IAAI;AAC7B,UAAM,cAAgC,UAAU,IAAI,CAAC,UAAkB;AAAA,MACrE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,MACjD,8BAAa,KAAK,GAAE,cAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IAAA,EAC9C;AAEI,UAAA,UAAU,UAAU,QAAQ;AAElC,eAAW,QAAQ,aAAa;AACxB,YAAA,OAAO,QAAQ,IAAI,KAAK;AAC9B,WAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI;AAC7B,WAAK,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO;AAAA,IAAA;AAGtC,UAAM,UAAU,GAAGA,KAAQ,QAAA,SAAS,CAAC;AACjC,QAAA;AACM,cAAA,IAAI,sBAAsB,OAAO,EAAE;AAC3CC,SAAA,cAAc,SAAS,QAAQ,IAAI,EAAE,aAAa,KAAA,CAAM,CAAC;AAAA,aAClD,GAAG;AACV,cAAQ,MAAM,2BAA2B,OAAO,IAAI,CAAC;AAAA,IAAA;AAAA,EACvD;AAEJ;AAEA,SAAS,UAAU,aAAoD;AAC9D,SAAAC,YAAA,OAAO,EAAE,SAAS,OAAO,UAAU,QAAS,CAAA,EAChD,IAAI,aAAa;AAAA,IAChB,OAAO;AAAA,EAAA,CACR,EACA,IAAI,kDAAkD;AAC3D;AAEA,SAAS,WAAW,MAAsB;AAClC,QAAA,YAAY,KAAK,MAAM,EAAE;AACxB,SAAA,cAAc,MAAM,KAAK;AAClC;AAEA,eAAe,gBACb,QAGwB;AACpB,MAAA;AAEA,MAAA,OAAO,WAAW,YAAY;AAEhC,gBAAY,MAAM,OAAO;AAAA,EAChB,WAAA,MAAM,QAAQ,MAAM,GAAG;AAEpB,gBAAA;AAAA,EAAA,OACP;AAEL,gBAAY,CAAC;AAAA,EAAA;AAGR,SAAA,UAAU,OAAO,OAAO;AACjC;;"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type PagesJson = {
|
|
2
|
-
page: string;
|
|
3
|
-
lastMod: string;
|
|
4
|
-
};
|
|
5
|
-
export declare function buildSitemap({ host, routes, outputDir, }: {
|
|
6
|
-
host: string;
|
|
7
|
-
routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>);
|
|
8
|
-
outputDir: string;
|
|
9
|
-
}): Promise<void>;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { promises } from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { prepare, copyPublicAssets } from "nitropack";
|
|
4
|
-
async function buildNitroEnvironment(nitro, build) {
|
|
5
|
-
await prepare(nitro);
|
|
6
|
-
await copyPublicAssets(nitro);
|
|
7
|
-
await build();
|
|
8
|
-
const publicDir = nitro.options.output.publicDir;
|
|
9
|
-
const viteDir = path.resolve(publicDir, ".vite");
|
|
10
|
-
if (await promises.stat(viteDir).catch(() => false)) {
|
|
11
|
-
await promises.rm(viteDir, { recursive: true, force: true });
|
|
12
|
-
}
|
|
13
|
-
await nitro.close();
|
|
14
|
-
}
|
|
15
|
-
export {
|
|
16
|
-
buildNitroEnvironment
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=build-nitro.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-nitro.js","sources":["../../../src/nitro/build-nitro.ts"],"sourcesContent":["import { promises as fsp } from 'node:fs'\nimport path from 'node:path'\nimport { copyPublicAssets, prepare } from 'nitropack'\nimport type { Nitro } from 'nitropack'\n\nexport async function buildNitroEnvironment(\n nitro: Nitro,\n build: () => Promise<any>,\n) {\n await prepare(nitro)\n await copyPublicAssets(nitro)\n await build()\n\n const publicDir = nitro.options.output.publicDir\n\n // As a part of the build process, the `.vite/` directory\n // is copied over from `.tanstack-start/build/client-dist/`\n // to the `publicDir` (e.g. `.output/public/`).\n // This directory (containing the vite manifest) should not be\n // included in the final build, so we remove it here.\n const viteDir = path.resolve(publicDir, '.vite')\n if (await fsp.stat(viteDir).catch(() => false)) {\n await fsp.rm(viteDir, { recursive: true, force: true })\n }\n\n await nitro.close()\n}\n"],"names":["fsp"],"mappings":";;;AAKsB,eAAA,sBACpB,OACA,OACA;AACA,QAAM,QAAQ,KAAK;AACnB,QAAM,iBAAiB,KAAK;AAC5B,QAAM,MAAM;AAEN,QAAA,YAAY,MAAM,QAAQ,OAAO;AAOvC,QAAM,UAAU,KAAK,QAAQ,WAAW,OAAO;AAC3C,MAAA,MAAMA,SAAI,KAAK,OAAO,EAAE,MAAM,MAAM,KAAK,GAAG;AACxC,UAAAA,SAAI,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,MAAM;AAAA,EAAA;AAGxD,QAAM,MAAM,MAAM;AACpB;"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type PagesJson = {
|
|
2
|
-
page: string;
|
|
3
|
-
lastMod: string;
|
|
4
|
-
};
|
|
5
|
-
export declare function buildSitemap({ host, routes, outputDir, }: {
|
|
6
|
-
host: string;
|
|
7
|
-
routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>);
|
|
8
|
-
outputDir: string;
|
|
9
|
-
}): Promise<void>;
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { writeFileSync } from "node:fs";
|
|
2
|
-
import { resolve } from "node:path";
|
|
3
|
-
import { create } from "xmlbuilder2";
|
|
4
|
-
async function buildSitemap({
|
|
5
|
-
host,
|
|
6
|
-
routes,
|
|
7
|
-
outputDir
|
|
8
|
-
}) {
|
|
9
|
-
const routeList = await optionHasRoutes(routes);
|
|
10
|
-
if (routeList.length) {
|
|
11
|
-
const slash = checkSlash(host);
|
|
12
|
-
const sitemapData = routeList.map((page) => ({
|
|
13
|
-
page: `${host}${slash}${page.replace(/^\/+/g, "")}`,
|
|
14
|
-
lastMod: (/* @__PURE__ */ new Date()).toISOString().split("T")[0]
|
|
15
|
-
}));
|
|
16
|
-
const sitemap = createXml("urlset");
|
|
17
|
-
for (const item of sitemapData) {
|
|
18
|
-
const page = sitemap.ele("url");
|
|
19
|
-
page.ele("loc").txt(item.page);
|
|
20
|
-
page.ele("lastmod").txt(item.lastMod);
|
|
21
|
-
}
|
|
22
|
-
const mapPath = `${resolve(outputDir)}/sitemap.xml`;
|
|
23
|
-
try {
|
|
24
|
-
console.log(`Writing sitemap at ${mapPath}`);
|
|
25
|
-
writeFileSync(mapPath, sitemap.end({ prettyPrint: true }));
|
|
26
|
-
} catch (e) {
|
|
27
|
-
console.error(`Unable to write file at ${mapPath}`, e);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function createXml(elementName) {
|
|
32
|
-
return create({ version: "1.0", encoding: "UTF-8" }).ele(elementName, {
|
|
33
|
-
xmlns: "https://www.sitemaps.org/schemas/sitemap/0.9"
|
|
34
|
-
}).com(`This file was automatically generated by Analog.`);
|
|
35
|
-
}
|
|
36
|
-
function checkSlash(host) {
|
|
37
|
-
const finalChar = host.slice(-1);
|
|
38
|
-
return finalChar === "/" ? "" : "/";
|
|
39
|
-
}
|
|
40
|
-
async function optionHasRoutes(routes) {
|
|
41
|
-
let routeList;
|
|
42
|
-
if (typeof routes === "function") {
|
|
43
|
-
routeList = await routes();
|
|
44
|
-
} else if (Array.isArray(routes)) {
|
|
45
|
-
routeList = routes;
|
|
46
|
-
} else {
|
|
47
|
-
routeList = [];
|
|
48
|
-
}
|
|
49
|
-
return routeList.filter(Boolean);
|
|
50
|
-
}
|
|
51
|
-
export {
|
|
52
|
-
buildSitemap
|
|
53
|
-
};
|
|
54
|
-
//# sourceMappingURL=build-sitemap.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"build-sitemap.js","sources":["../../../src/nitro/build-sitemap.ts"],"sourcesContent":["import { writeFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\nimport { create } from 'xmlbuilder2'\nimport type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'\n\nexport type PagesJson = {\n page: string\n lastMod: string\n}\n\nexport async function buildSitemap({\n host,\n routes,\n outputDir,\n}: {\n host: string\n routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>)\n outputDir: string\n}) {\n const routeList: Array<string> = await optionHasRoutes(routes)\n\n if (routeList.length) {\n const slash = checkSlash(host)\n const sitemapData: Array<PagesJson> = routeList.map((page: string) => ({\n page: `${host}${slash}${page.replace(/^\\/+/g, '')}`,\n lastMod: new Date().toISOString().split('T')[0]!,\n }))\n\n const sitemap = createXml('urlset')\n\n for (const item of sitemapData) {\n const page = sitemap.ele('url')\n page.ele('loc').txt(item.page)\n page.ele('lastmod').txt(item.lastMod)\n }\n\n const mapPath = `${resolve(outputDir)}/sitemap.xml`\n try {\n console.log(`Writing sitemap at ${mapPath}`)\n writeFileSync(mapPath, sitemap.end({ prettyPrint: true }))\n } catch (e) {\n console.error(`Unable to write file at ${mapPath}`, e)\n }\n }\n}\n\nfunction createXml(elementName: 'urlset' | 'sitemapindex'): XMLBuilder {\n return create({ version: '1.0', encoding: 'UTF-8' })\n .ele(elementName, {\n xmlns: 'https://www.sitemaps.org/schemas/sitemap/0.9',\n })\n .com(`This file was automatically generated by Analog.`)\n}\n\nfunction checkSlash(host: string): string {\n const finalChar = host.slice(-1)\n return finalChar === '/' ? '' : '/'\n}\n\nasync function optionHasRoutes(\n routes:\n | Array<string | undefined>\n | (() => Promise<Array<string | undefined>>),\n): Promise<Array<string>> {\n let routeList: Array<string | undefined>\n\n if (typeof routes === 'function') {\n // returns an array or undefined\n routeList = await routes()\n } else if (Array.isArray(routes)) {\n // returns an array of strings\n routeList = routes\n } else {\n // default it to an empty of array\n routeList = []\n }\n\n return routeList.filter(Boolean) as Array<string>\n}\n"],"names":[],"mappings":";;;AAUA,eAAsB,aAAa;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACK,QAAA,YAA2B,MAAM,gBAAgB,MAAM;AAE7D,MAAI,UAAU,QAAQ;AACd,UAAA,QAAQ,WAAW,IAAI;AAC7B,UAAM,cAAgC,UAAU,IAAI,CAAC,UAAkB;AAAA,MACrE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,MACjD,8BAAa,KAAK,GAAE,cAAc,MAAM,GAAG,EAAE,CAAC;AAAA,IAAA,EAC9C;AAEI,UAAA,UAAU,UAAU,QAAQ;AAElC,eAAW,QAAQ,aAAa;AACxB,YAAA,OAAO,QAAQ,IAAI,KAAK;AAC9B,WAAK,IAAI,KAAK,EAAE,IAAI,KAAK,IAAI;AAC7B,WAAK,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO;AAAA,IAAA;AAGtC,UAAM,UAAU,GAAG,QAAQ,SAAS,CAAC;AACjC,QAAA;AACM,cAAA,IAAI,sBAAsB,OAAO,EAAE;AAC3C,oBAAc,SAAS,QAAQ,IAAI,EAAE,aAAa,KAAA,CAAM,CAAC;AAAA,aAClD,GAAG;AACV,cAAQ,MAAM,2BAA2B,OAAO,IAAI,CAAC;AAAA,IAAA;AAAA,EACvD;AAEJ;AAEA,SAAS,UAAU,aAAoD;AAC9D,SAAA,OAAO,EAAE,SAAS,OAAO,UAAU,QAAS,CAAA,EAChD,IAAI,aAAa;AAAA,IAChB,OAAO;AAAA,EAAA,CACR,EACA,IAAI,kDAAkD;AAC3D;AAEA,SAAS,WAAW,MAAsB;AAClC,QAAA,YAAY,KAAK,MAAM,EAAE;AACxB,SAAA,cAAc,MAAM,KAAK;AAClC;AAEA,eAAe,gBACb,QAGwB;AACpB,MAAA;AAEA,MAAA,OAAO,WAAW,YAAY;AAEhC,gBAAY,MAAM,OAAO;AAAA,EAChB,WAAA,MAAM,QAAQ,MAAM,GAAG;AAEpB,gBAAA;AAAA,EAAA,OACP;AAEL,gBAAY,CAAC;AAAA,EAAA;AAGR,SAAA,UAAU,OAAO,OAAO;AACjC;"}
|
package/src/nitro/build-nitro.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { promises as fsp } from 'node:fs'
|
|
2
|
-
import path from 'node:path'
|
|
3
|
-
import { copyPublicAssets, prepare } from 'nitropack'
|
|
4
|
-
import type { Nitro } from 'nitropack'
|
|
5
|
-
|
|
6
|
-
export async function buildNitroEnvironment(
|
|
7
|
-
nitro: Nitro,
|
|
8
|
-
build: () => Promise<any>,
|
|
9
|
-
) {
|
|
10
|
-
await prepare(nitro)
|
|
11
|
-
await copyPublicAssets(nitro)
|
|
12
|
-
await build()
|
|
13
|
-
|
|
14
|
-
const publicDir = nitro.options.output.publicDir
|
|
15
|
-
|
|
16
|
-
// As a part of the build process, the `.vite/` directory
|
|
17
|
-
// is copied over from `.tanstack-start/build/client-dist/`
|
|
18
|
-
// to the `publicDir` (e.g. `.output/public/`).
|
|
19
|
-
// This directory (containing the vite manifest) should not be
|
|
20
|
-
// included in the final build, so we remove it here.
|
|
21
|
-
const viteDir = path.resolve(publicDir, '.vite')
|
|
22
|
-
if (await fsp.stat(viteDir).catch(() => false)) {
|
|
23
|
-
await fsp.rm(viteDir, { recursive: true, force: true })
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
await nitro.close()
|
|
27
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { writeFileSync } from 'node:fs'
|
|
2
|
-
import { resolve } from 'node:path'
|
|
3
|
-
import { create } from 'xmlbuilder2'
|
|
4
|
-
import type { XMLBuilder } from 'xmlbuilder2/lib/interfaces'
|
|
5
|
-
|
|
6
|
-
export type PagesJson = {
|
|
7
|
-
page: string
|
|
8
|
-
lastMod: string
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export async function buildSitemap({
|
|
12
|
-
host,
|
|
13
|
-
routes,
|
|
14
|
-
outputDir,
|
|
15
|
-
}: {
|
|
16
|
-
host: string
|
|
17
|
-
routes: Array<string | undefined> | (() => Promise<Array<string | undefined>>)
|
|
18
|
-
outputDir: string
|
|
19
|
-
}) {
|
|
20
|
-
const routeList: Array<string> = await optionHasRoutes(routes)
|
|
21
|
-
|
|
22
|
-
if (routeList.length) {
|
|
23
|
-
const slash = checkSlash(host)
|
|
24
|
-
const sitemapData: Array<PagesJson> = routeList.map((page: string) => ({
|
|
25
|
-
page: `${host}${slash}${page.replace(/^\/+/g, '')}`,
|
|
26
|
-
lastMod: new Date().toISOString().split('T')[0]!,
|
|
27
|
-
}))
|
|
28
|
-
|
|
29
|
-
const sitemap = createXml('urlset')
|
|
30
|
-
|
|
31
|
-
for (const item of sitemapData) {
|
|
32
|
-
const page = sitemap.ele('url')
|
|
33
|
-
page.ele('loc').txt(item.page)
|
|
34
|
-
page.ele('lastmod').txt(item.lastMod)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const mapPath = `${resolve(outputDir)}/sitemap.xml`
|
|
38
|
-
try {
|
|
39
|
-
console.log(`Writing sitemap at ${mapPath}`)
|
|
40
|
-
writeFileSync(mapPath, sitemap.end({ prettyPrint: true }))
|
|
41
|
-
} catch (e) {
|
|
42
|
-
console.error(`Unable to write file at ${mapPath}`, e)
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function createXml(elementName: 'urlset' | 'sitemapindex'): XMLBuilder {
|
|
48
|
-
return create({ version: '1.0', encoding: 'UTF-8' })
|
|
49
|
-
.ele(elementName, {
|
|
50
|
-
xmlns: 'https://www.sitemaps.org/schemas/sitemap/0.9',
|
|
51
|
-
})
|
|
52
|
-
.com(`This file was automatically generated by Analog.`)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function checkSlash(host: string): string {
|
|
56
|
-
const finalChar = host.slice(-1)
|
|
57
|
-
return finalChar === '/' ? '' : '/'
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
async function optionHasRoutes(
|
|
61
|
-
routes:
|
|
62
|
-
| Array<string | undefined>
|
|
63
|
-
| (() => Promise<Array<string | undefined>>),
|
|
64
|
-
): Promise<Array<string>> {
|
|
65
|
-
let routeList: Array<string | undefined>
|
|
66
|
-
|
|
67
|
-
if (typeof routes === 'function') {
|
|
68
|
-
// returns an array or undefined
|
|
69
|
-
routeList = await routes()
|
|
70
|
-
} else if (Array.isArray(routes)) {
|
|
71
|
-
// returns an array of strings
|
|
72
|
-
routeList = routes
|
|
73
|
-
} else {
|
|
74
|
-
// default it to an empty of array
|
|
75
|
-
routeList = []
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
return routeList.filter(Boolean) as Array<string>
|
|
79
|
-
}
|