diff --git a/generate_sitemap.js b/generate_sitemap.js deleted file mode 100644 index 0ede4094..00000000 --- a/generate_sitemap.js +++ /dev/null @@ -1,328 +0,0 @@ -import { simpleSitemapAndIndex } from 'sitemap' -import algoliasearch from 'algoliasearch' -import contentful from 'contentful' - -const PORTAL_BASE_URL = process.env.ROOL_URL || 'https://staging.sparc.science' - -// Algolia creds -const ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID -const ALGOLIA_API_KEY = process.env.ALGOLIA_API_KEY -const ALGOLIA_INDEX = process.env.ALGOLIA_INDEX || 'k-core_dev' - -const algoliaClient = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_API_KEY) -const algoliaIndex = algoliaClient.initIndex(ALGOLIA_INDEX) - -// Contentful -const CTF_SPACE_ID = process.env.CTF_SPACE_ID -const CTF_CDA_ACCESS_TOKEN = process.env.CTF_CDA_ACCESS_TOKEN -const CTF_API_HOST = process.env.CTF_API_HOST || 'preview.contentful.com' - -// Checking required variables -if ( - ![ - PORTAL_BASE_URL, - ALGOLIA_APP_ID, - ALGOLIA_API_KEY, - ALGOLIA_INDEX, - CTF_SPACE_ID, - CTF_CDA_ACCESS_TOKEN, - CTF_API_HOST - ].every(env => env) -) { - console.error('At least one required environment variable is missing.') - process.exit(9) -} - -const contentfulClient = contentful.createClient({ - space: CTF_SPACE_ID, - accessToken: CTF_CDA_ACCESS_TOKEN, - host: CTF_API_HOST -}) - -// Add static URLs here -const urls = new Set([ - '/data', - '/about', - '/contact-us', - '/share-data' -]) - -// DATA - -// Fetching DATASETS IDs -process.stdout.write('Fetching datasets from Algolia...') - -const datasetResp = await algoliaIndex.search('', { - hitsPerPage: 9999, - facets: '["*"]', - filters: '(NOT item.published.status:embargo OR item.published.status:embargo) AND item.types.name:Dataset' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) -process.stdout.write('Fetching datasets from Algolia... Done. Found ' + datasetResp.hits.length + ' URLs.\n') - -datasetResp.hits.forEach(dataset => { - urls.add(PORTAL_BASE_URL + '/datasets/' + dataset.objectID) -}) - -// Fetching ANATOMICAL MODELS IDs -process.stdout.write('Fetching anatomical models from Algolia...') - -const anatomicalResp = await algoliaIndex.search('', { - hitsPerPage: 9999, - facets: '["*"]', - filters: '(NOT item.published.status:embargo OR item.published.status:embargo) AND (NOT item.types.name:Dataset AND item.types.name:Scaffold)' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) -process.stdout.write('Fetching anatomical models from Algolia... Done. Found ' + anatomicalResp.hits.length + ' URLs.\n') - -anatomicalResp.hits.forEach(dataset => { - urls.add(PORTAL_BASE_URL + '/datasets/' + dataset.objectID) -}) - -// Fetching COMPUTATIONAL MODEL IDs -process.stdout.write('Fetching computational models from Algolia...') - -const computationalResp = await algoliaIndex.search('', { - hitsPerPage: 9999, - facets: '["*"]', - filters: '(NOT item.published.status:embargo OR item.published.status:embargo) AND (NOT item.types.name:Dataset AND NOT item.types.name:Scaffold)' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) -process.stdout.write('Fetching computational models from Algolia... Done. Found ' + computationalResp.hits.length + ' URLs.\n') - -computationalResp.hits.forEach(dataset => { - urls.add(PORTAL_BASE_URL + '/datasets/' + dataset.objectID) -}) - -// Fetching PROJECTS IDs -process.stdout.write('Fetching projects from Contentful...') - -const projectResp = await contentfulClient.getEntries({ - content_type: 'sparcAward', - limit: 1000 -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) -process.stdout.write('Fetching projects from Contentful... Done. Found ' + projectResp.items.length + ' URLs.\n') - -projectResp.items.forEach(project => { - urls.add(PORTAL_BASE_URL + '/about/projects/' + project.sys.id) -}) - -// TOOLS & RESOURCES - -// Fetching DATABASES IDs -process.stdout.write('Fetching databases from Contentful...') - -const databasesResp = await contentfulClient.getEntries({ - content_type: 'sparcPartners', - limit: 1000, - 'fields.resourceType[in]': 'Data and Models' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -let counter = 0 -databasesResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching databases from Contentful... Done. Found ' + counter + ' URLs.\n') - -// Fetching SOFTWARE IDs -process.stdout.write('Fetching software from Contentful...') - -const softwareResp = await contentfulClient.getEntries({ - content_type: 'sparcPartners', - limit: 1000, - 'fields.resourceType[in]': 'Software' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -softwareResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching software from Contentful... Done. Found ' + counter + ' URLs.\n') - -// Fetching INFORMATION SERVICES IDs -process.stdout.write('Fetching software from Contentful...') - -const infoResp = await contentfulClient.getEntries({ - content_type: 'sparcPartners', - limit: 1000, - 'fields.resourceType[in]': 'Information Services' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -infoResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching information services from Contentful... Done. Found ' + counter + ' URLs.\n') - -// Fetching DEVICES IDs -process.stdout.write('Fetching devices from Contentful...') - -const deviceResp = await contentfulClient.getEntries({ - content_type: 'sparcPartners', - limit: 1000, - 'fields.resourceType[in]': 'Devices' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -deviceResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching devices from Contentful... Done. Found ' + counter + ' URLs.\n') - -// Fetching BIOLOGICAL IDs -process.stdout.write('Fetching biological from Contentful...') - -const bioResp = await contentfulClient.getEntries({ - content_type: 'sparcPartners', - limit: 1000, - 'fields.resourceType[in]': 'Biologicals' -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -bioResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching biological from Contentful... Done. Found ' + counter + ' URLs.\n') - -// NEWS & EVENTS - -// Fetching NEWS IDs -process.stdout.write('Fetching news from Contentful...') - -const newsResp = await contentfulClient.getEntries({ - content_type: 'news', - limit: 1000 -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -newsResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching news from Contentful... Done. Found ' + counter + ' URLs.\n') - -// Fetching EVENTS IDs -process.stdout.write('Fetching events from Contentful...') - -const eventsResp = await contentfulClient.getEntries({ - content_type: 'event', - limit: 1000 -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -eventsResp.items.forEach(db => { - if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { - counter++ - urls.add(db.fields.url) - } -}) - -process.stdout.write('Fetching events from Contentful... Done. Found ' + counter + ' URLs.\n') - -// Fetching COMMUNITY SPOTLIGHT IDs -process.stdout.write('Fetching community spotlights from Contentful...') - -const commResp = await contentfulClient.getEntries({ - content_type: 'communitySpotlight', - limit: 1000, - 'fields.itemType[in]': undefined, - 'fields.anatomicalStructure[in]': undefined -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -commResp.items.forEach(db => { - if (db.fields.linkedItem && db.fields.linkedItem.fields.storyRoute) { - counter++ - urls.add(PORTAL_BASE_URL + '/news-and-events/community-spotlight/success-stories/' + db.fields.linkedItem.fields.storyRoute) - } -}) - -// Fetching ABOUT DETAILS IDs -process.stdout.write('Fetching about details from Contentful...') - -const aboutResp = await contentfulClient.getEntries({ - content_type: 'aboutPageSecondLevel', - limit: 1000 -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) - -counter = 0 -aboutResp.items.forEach(db => { - if (db.sys.id) { - counter++ - urls.add(PORTAL_BASE_URL + '/about/' + db.sys.id) - } -}) - -process.stdout.write('Fetching about details from Contentful... Done. Found ' + counter + ' URLs.\n') - -console.log('Finished scraping data. URLs found:', urls.size) -process.stdout.write('Generating sitemap...') - -simpleSitemapAndIndex({ - hostname: PORTAL_BASE_URL, - destinationDir: './public', - sourceData: Array.from(urls).map(url => ({ url })) -}) - -process.stdout.clearLine(0) -process.stdout.cursorTo(0) -console.log('Generating sitemap... Done. Sitemap and sitemap index can be found in ./public.') diff --git a/nuxt.config.ts b/nuxt.config.ts index 889fd9db..6803f7c8 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -57,7 +57,8 @@ export default defineNuxtConfig({ '@pinia-plugin-persistedstate/nuxt', '@zadigetvoltaire/nuxt-gtm', '@nuxtjs/turnstile', - '@nuxtjs/sitemap' + '@nuxtjs/sitemap', + "nuxt-simple-robots" ], turnstile: { siteKey: process.env.NUXT_PUBLIC_TURNSTILE_SITE_KEY || '0x4AAAAAAATLCwNJ5HNQWRsX' @@ -200,8 +201,29 @@ export default defineNuxtConfig({ */ css: ['sparc-design-system-components-2/dist/style.css', '@/assets/_base.scss'], sitemap: { + sources: [ + '/api/__sitemap__/urls' + ], xslColumns: [ { label: 'URL', width: '100%' } ], }, + robots: { + sitemap: 'https://sparc.science/sitemap.xml', + allow: ['/datasets'], + // provide simple disallow rules for all robots `user-agent: *` + // disallowing certain pages that are either redirects, authticated routes, or causing bots to recursively crawl + disallow: [ + '/welcome', + '/user', + '/data', + '/contact-us', + '/help', + '/signup', + '/maps', + '/news-and-events/submit', + '/news-and-events/community-spotlight/submit' + ], + blockNonSeoBots: true + } }) diff --git a/package.json b/package.json index e1d4ee6e..b8d6fef4 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@zadigetvoltaire/nuxt-gtm": "^0.0.13", "cypress": "13.9.0", "nuxt": "^3.8.2", + "nuxt-simple-robots": "^4.0.0-rc.19", "nuxt-svgo": "^3.5.6", "sass": "^1.66.1", "sitemap": "^7.1.1" diff --git a/pages/data/index.vue b/pages/data/index.vue index fa07b745..6a7510bd 100644 --- a/pages/data/index.vue +++ b/pages/data/index.vue @@ -6,6 +6,7 @@ +
diff --git a/server/api/__sitemap__/urls.js b/server/api/__sitemap__/urls.js new file mode 100644 index 00000000..753caa4c --- /dev/null +++ b/server/api/__sitemap__/urls.js @@ -0,0 +1,181 @@ +import algoliasearch from 'algoliasearch' +import contentful from 'contentful' +import { defineSitemapEventHandler } from '#imports' + +export default defineSitemapEventHandler(async () => { + try { + const PORTAL_BASE_URL = process.env.ROOL_URL || 'https://staging.sparc.science' + + // Algolia creds + const ALGOLIA_APP_ID = process.env.ALGOLIA_APP_ID + const ALGOLIA_API_KEY = process.env.ALGOLIA_API_KEY + const ALGOLIA_INDEX = process.env.ALGOLIA_INDEX || 'k-core_dev' + + const algoliaClient = algoliasearch(ALGOLIA_APP_ID, ALGOLIA_API_KEY) + const algoliaIndex = algoliaClient.initIndex(ALGOLIA_INDEX) + + // Contentful + const CTF_SPACE_ID = process.env.CTF_SPACE_ID + const CTF_CDA_ACCESS_TOKEN = process.env.CTF_CDA_ACCESS_TOKEN + const CTF_API_HOST = process.env.CTF_API_HOST || 'preview.contentful.com' + + const contentfulClient = contentful.createClient({ + space: CTF_SPACE_ID, + accessToken: CTF_CDA_ACCESS_TOKEN, + host: CTF_API_HOST + }) + + let urls = [] + + // Fetching Algolia records + + const datasetResp = await algoliaIndex.search('', { + hitsPerPage: 9999, + facets: '["*"]' + }) + + datasetResp.hits.forEach(dataset => { + urls.push(PORTAL_BASE_URL + '/datasets/' + dataset.objectID) + }) + + // Fetching PROJECTS IDs + const projectResp = await contentfulClient.getEntries({ + content_type: 'sparcAward', + limit: 1000 + }) + + projectResp.items.forEach(project => { + urls.push(PORTAL_BASE_URL + '/about/projects/' + project.sys.id) + }) + + // TOOLS & RESOURCES + + // Fetching DATABASES IDs + const databasesResp = await contentfulClient.getEntries({ + content_type: 'sparcPartners', + limit: 1000, + 'fields.resourceType[in]': 'Data and Models' + }) + + databasesResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // Fetching SOFTWARE IDs + + const softwareResp = await contentfulClient.getEntries({ + content_type: 'sparcPartners', + limit: 1000, + 'fields.resourceType[in]': 'Software' + }) + + softwareResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // Fetching INFORMATION SERVICES IDs + + const infoResp = await contentfulClient.getEntries({ + content_type: 'sparcPartners', + limit: 1000, + 'fields.resourceType[in]': 'Information Services' + }) + + infoResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // Fetching DEVICES IDs + const deviceResp = await contentfulClient.getEntries({ + content_type: 'sparcPartners', + limit: 1000, + 'fields.resourceType[in]': 'Devices' + }) + + deviceResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // Fetching BIOLOGICAL IDs + + const bioResp = await contentfulClient.getEntries({ + content_type: 'sparcPartners', + limit: 1000, + 'fields.resourceType[in]': 'Biologicals' + }) + + bioResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // NEWS & EVENTS + + // Fetching NEWS IDs + const newsResp = await contentfulClient.getEntries({ + content_type: 'news', + limit: 1000 + }) + + newsResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // Fetching EVENTS IDs + const eventsResp = await contentfulClient.getEntries({ + content_type: 'event', + limit: 1000 + }) + + eventsResp.items.forEach(db => { + if (db.fields.url && db.fields.url.includes(PORTAL_BASE_URL)) { + urls.push(db.fields.url) + } + }) + + // Fetching COMMUNITY SPOTLIGHT IDs + + const commResp = await contentfulClient.getEntries({ + content_type: 'communitySpotlight', + limit: 1000, + 'fields.itemType[in]': undefined, + 'fields.anatomicalStructure[in]': undefined + }) + + commResp.items.forEach(db => { + if (db.fields.linkedItem && db.fields.linkedItem.fields.storyRoute) { + urls.push(PORTAL_BASE_URL + '/news-and-events/community-spotlight/success-stories/' + db.fields.linkedItem.fields.storyRoute) + } + }) + + // Fetching ABOUT DETAILS IDs + + const aboutResp = await contentfulClient.getEntries({ + content_type: 'aboutPageSecondLevel', + limit: 1000 + }) + + aboutResp.items.forEach(db => { + if (db.sys.id) { + urls.push(PORTAL_BASE_URL + '/about/' + db.sys.id) + } + }) + + return urls.map((url) => { + return { loc: url } + }) + } catch (err) { + console.error('Error fetching dynamic routes:', err) + } +}) \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index f6012218..549047bf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4190,6 +4190,13 @@ dependencies: "@iconify/types" "*" +"@iconify/collections@^1.0.406": + version "1.0.437" + resolved "https://registry.yarnpkg.com/@iconify/collections/-/collections-1.0.437.tgz#8631066a82794b497441dc0d98a538ec65c134bd" + integrity sha512-eGY1y8dP94zAh0a8hslIsQ6GofWzNwXKXXMW5F+rEr+EL+yO0RrDxYJOKTnYYvqzNsCBbmNr9kgX17OGQWeaEA== + dependencies: + "@iconify/types" "*" + "@iconify/types@*", "@iconify/types@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@iconify/types/-/types-2.0.0.tgz#ab0e9ea681d6c8a1214f30cd741fe3a20cc57f57" @@ -4208,6 +4215,13 @@ local-pkg "^0.5.0" mlly "^1.6.1" +"@iconify/vue@^4.1.1": + version "4.1.2" + resolved "https://registry.yarnpkg.com/@iconify/vue/-/vue-4.1.2.tgz#b76135785ca366b29bf0736eee9cfefc1c2ef79e" + integrity sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA== + dependencies: + "@iconify/types" "^2.0.0" + "@ioredis/commands@^1.1.1": version "1.2.0" resolved "https://registry.yarnpkg.com/@ioredis/commands/-/commands-1.2.0.tgz#6d61b3097470af1fdbbe622795b8921d42018e11" @@ -4768,6 +4782,15 @@ "@nuxt/schema" "^3.11.2" execa "^7.2.0" +"@nuxt/devtools-kit@^1.1.1", "@nuxt/devtools-kit@^1.3.6": + version "1.3.9" + resolved "https://registry.yarnpkg.com/@nuxt/devtools-kit/-/devtools-kit-1.3.9.tgz#ad2dc18a76e2508913f1693105185051b45a1bd3" + integrity sha512-tgr/F+4BbI53/JxgaXl3cuV9dMuCXMsd4GEXN+JqtCdAkDbH3wL79GGWx0/6I9acGzRsB6UZ1H6U96nfgcIrAw== + dependencies: + "@nuxt/kit" "^3.12.2" + "@nuxt/schema" "^3.12.3" + execa "^7.2.0" + "@nuxt/devtools-ui-kit@^1.0.8", "@nuxt/devtools-ui-kit@^1.1.5": version "1.2.0" resolved "https://registry.yarnpkg.com/@nuxt/devtools-ui-kit/-/devtools-ui-kit-1.2.0.tgz#89fbda7e557ad675eeade2a59a05c2d7ccc005d9" @@ -4899,6 +4922,32 @@ unimport "^3.7.1" untyped "^1.4.2" +"@nuxt/kit@^3.11.1", "@nuxt/kit@^3.12.2": + version "3.12.3" + resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.12.3.tgz#71a8ea30feb54e0c6fb3b7df33b71aa08ba05f8f" + integrity sha512-5R8FZLDxBKlkDWYsqwU1tctGJ5vwMA96WBrNkpQ0LznB2/p+3MWWTO6vz+0P0F9xvZZfkk/KKyZ3uUhnG9VJOA== + dependencies: + "@nuxt/schema" "3.12.3" + c12 "^1.11.1" + consola "^3.2.3" + defu "^6.1.4" + destr "^2.0.3" + globby "^14.0.2" + hash-sum "^2.0.0" + ignore "^5.3.1" + jiti "^1.21.6" + klona "^2.0.6" + knitwork "^1.1.0" + mlly "^1.7.1" + pathe "^1.1.2" + pkg-types "^1.1.2" + scule "^1.3.0" + semver "^7.6.2" + ufo "^1.5.3" + unctx "^2.3.1" + unimport "^3.7.2" + untyped "^1.4.2" + "@nuxt/kit@^3.7.0": version "3.10.3" resolved "https://registry.yarnpkg.com/@nuxt/kit/-/kit-3.10.3.tgz#911bc431d9b7541a7269e9e63333f70c8ecb5fd6" @@ -4974,6 +5023,24 @@ unimport "^3.7.1" untyped "^1.4.2" +"@nuxt/schema@3.12.3", "@nuxt/schema@^3.12.3": + version "3.12.3" + resolved "https://registry.yarnpkg.com/@nuxt/schema/-/schema-3.12.3.tgz#da72479aea11a5136d1d08fe2889a4cac4ad3533" + integrity sha512-Zw/2stN5CWVOHQ6pKyewk3tvYW5ROBloTGyIbie7/TprJT5mL+E9tTgAxOZtkoKSFaYEQXZgE1K2OzMelhLRzw== + dependencies: + compatx "^0.1.8" + consola "^3.2.3" + defu "^6.1.4" + hookable "^5.5.3" + pathe "^1.1.2" + pkg-types "^1.1.2" + scule "^1.3.0" + std-env "^3.7.0" + ufo "^1.5.3" + uncrypto "^0.1.3" + unimport "^3.7.2" + untyped "^1.4.2" + "@nuxt/telemetry@^2.5.3": version "2.5.3" resolved "https://registry.yarnpkg.com/@nuxt/telemetry/-/telemetry-2.5.3.tgz#e702bbccfb5cc4ab9b0cfc8239e96ed9e2ccfc74" @@ -5497,6 +5564,11 @@ resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.3.0.tgz#5b93b51ddb8def1e3a1543107f9b5b0540f716f6" integrity sha512-7fedsBfuILDTBmrYZNFI8B6ATTxhQAasUHllHmjvSZPnoq4bULWoTpHwmuQvZ8Aq03/tAa2IGo6RXqWtHdWaCA== +"@shikijs/core@1.6.4": + version "1.6.4" + resolved "https://registry.yarnpkg.com/@shikijs/core/-/core-1.6.4.tgz#06bbb38f2cac7ee587be68586a9a9c0768a06194" + integrity sha512-WTU9rzZae1p2v6LOxMf6LhtmZOkIHYYW160IuahUyJy7YXPPjyWZLR1ag+SgD22ZMxZtz1gfU6Tccc8t0Il/XA== + "@sigstore/bundle@^2.1.1": version "2.1.1" resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-2.1.1.tgz#7fad9a1728939301607103722ac6f2a083d2f09a" @@ -7995,6 +8067,24 @@ c12@^1.10.0: pkg-types "^1.0.3" rc9 "^2.1.1" +c12@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/c12/-/c12-1.11.1.tgz#d5244e95407af450a523e44eb57e5b87b82f8677" + integrity sha512-KDU0TvSvVdaYcQKQ6iPHATGz/7p/KiVjPg4vQrB6Jg/wX9R0yl5RZxWm9IoZqaIHD2+6PZd81+KMGwRr/lRIUg== + dependencies: + chokidar "^3.6.0" + confbox "^0.1.7" + defu "^6.1.4" + dotenv "^16.4.5" + giget "^1.2.3" + jiti "^1.21.6" + mlly "^1.7.1" + ohash "^1.1.3" + pathe "^1.1.2" + perfect-debounce "^1.0.0" + pkg-types "^1.1.1" + rc9 "^2.1.2" + c12@^1.5.1, c12@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/c12/-/c12-1.6.1.tgz#e6d3198d214cce66f82101e58e30daf2a0f58737" @@ -8687,6 +8777,11 @@ commondir@^1.0.1: resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== +compatx@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/compatx/-/compatx-0.1.8.tgz#af6f61910ade6ce1073c0fdff23c786bcd75c026" + integrity sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw== + component-emitter@^1.2.1: version "1.3.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.1.tgz#ef1d5796f7d93f135ee6fb684340b26403c97d17" @@ -11167,6 +11262,11 @@ flatted@^3.2.9: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== +flatted@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" + integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== + flatten-vertex-data@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" @@ -11585,7 +11685,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -giget@^1.0.0: +giget@^1.0.0, giget@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/giget/-/giget-1.2.3.tgz#ef6845d1140e89adad595f7f3bb60aa31c672cb6" integrity sha512-8EHPljDvs7qKykr6uw8b+lqLiUc/vUg+KVTI0uND4s63TdsZM2Xus3mflvF0DDG9SiM4RlCkFGL+7aAjRmV7KA== @@ -11855,6 +11955,18 @@ globby@^14.0.1: slash "^5.1.0" unicorn-magic "^0.1.0" +globby@^14.0.2: + version "14.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-14.0.2.tgz#06554a54ccfe9264e5a9ff8eded46aa1e306482f" + integrity sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw== + dependencies: + "@sindresorhus/merge-streams" "^2.1.0" + fast-glob "^3.3.2" + ignore "^5.2.4" + path-type "^5.0.0" + slash "^5.1.0" + unicorn-magic "^0.1.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -13292,6 +13404,11 @@ jiti@^1.21.0: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +jiti@^1.21.6: + version "1.21.6" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.6.tgz#6c7f7398dd4b3142767f9a168af2f317a428d268" + integrity sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== + joycon@^2.2.3: version "2.2.5" resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615" @@ -13322,6 +13439,11 @@ js-tokens@^8.0.2: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-8.0.3.tgz#1c407ec905643603b38b6be6977300406ec48775" integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== +js-tokens@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-9.0.0.tgz#0f893996d6f3ed46df7f0a3b12a03f5fd84223c1" + integrity sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ== + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -14574,7 +14696,7 @@ mkdirp@^1.0.3: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mlly@1.4.0, mlly@^1.2.0, mlly@^1.3.0, mlly@^1.4.2, mlly@^1.5.0, mlly@^1.6.0, mlly@^1.6.1: +mlly@1.4.0, mlly@^1.2.0, mlly@^1.3.0, mlly@^1.4.2, mlly@^1.5.0, mlly@^1.6.0, mlly@^1.6.1, mlly@^1.7.0, mlly@^1.7.1: version "1.4.0" resolved "https://registry.yarnpkg.com/mlly/-/mlly-1.4.0.tgz#830c10d63f1f97bd8785377b24dc2a15d972832b" integrity sha512-ua8PAThnTwpprIaU47EPeZ/bPUVp2QYBbWMphUQpVdBI3Lgqzm5KZQ45Agm3YJedHXaIHl6pBGabaLSUPPSptg== @@ -15102,6 +15224,37 @@ nuxi@^3.10.0: optionalDependencies: fsevents "~2.3.3" +nuxt-icon@^0.6.10: + version "0.6.10" + resolved "https://registry.yarnpkg.com/nuxt-icon/-/nuxt-icon-0.6.10.tgz#a39afa47286a20dd78a9f9b4235ed143d9b44e1b" + integrity sha512-S9zHVA66ox4ZSpMWvCjqKZC4ZogC0s2z3vZs+M4D95YXGPEXwxDZu+insMKvkbe8+k7gvEmtTk0eq3KusKlxiw== + dependencies: + "@iconify/collections" "^1.0.406" + "@iconify/vue" "^4.1.1" + "@nuxt/devtools-kit" "^1.1.1" + "@nuxt/kit" "^3.11.1" + +nuxt-simple-robots@^4.0.0-rc.19: + version "4.0.0-rc.19" + resolved "https://registry.yarnpkg.com/nuxt-simple-robots/-/nuxt-simple-robots-4.0.0-rc.19.tgz#24303eed8c86427e9c613e33d9317e6932f07222" + integrity sha512-Q9ExiIPvvircFY8oDi/+7WZjTvVMu6acXberEQQwfIx6e+wXat7ZRR9POd2cucJxlxeFgPNqceHad+WGQ8YneA== + dependencies: + "@nuxt/devtools-kit" "^1.3.6" + "@nuxt/kit" "^3.12.2" + consola "^3.2.3" + defu "^6.1.4" + flatted "^3.3.1" + floating-vue "5.2.2" + nuxt-icon "^0.6.10" + nuxt-site-config "^2.2.12" + nuxt-site-config-kit "^2.2.12" + pathe "^1.1.2" + pkg-types "^1.1.1" + shiki "1.6.4" + sirv "^2.0.4" + std-env "^3.7.0" + ufo "^1.5.3" + nuxt-site-config-kit@2.2.12, nuxt-site-config-kit@^2.2.12: version "2.2.12" resolved "https://registry.yarnpkg.com/nuxt-site-config-kit/-/nuxt-site-config-kit-2.2.12.tgz#367b73afeab6248d45fcebf7aedfc8c853c0313d" @@ -16008,6 +16161,15 @@ pkg-types@^1.1.0: mlly "^1.6.1" pathe "^1.1.2" +pkg-types@^1.1.1, pkg-types@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/pkg-types/-/pkg-types-1.1.3.tgz#161bb1242b21daf7795036803f28e30222e476e3" + integrity sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA== + dependencies: + confbox "^0.1.7" + mlly "^1.7.1" + pathe "^1.1.2" + pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" @@ -16727,6 +16889,14 @@ rc9@^2.1.1: destr "^2.0.0" flat "^5.0.2" +rc9@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/rc9/-/rc9-2.1.2.tgz#6282ff638a50caa0a91a31d76af4a0b9cbd1080d" + integrity sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg== + dependencies: + defu "^6.1.4" + destr "^2.0.3" + rc@^1.0.1, rc@^1.1.6: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -17495,7 +17665,7 @@ semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.5.0, semve dependencies: lru-cache "^6.0.0" -semver@^7.3.7: +semver@^7.3.7, semver@^7.6.2: version "7.6.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== @@ -17677,6 +17847,13 @@ shiki@1.2.4: dependencies: "@shikijs/core" "1.2.4" +shiki@1.6.4: + version "1.6.4" + resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.6.4.tgz#7413d7425732fb603e0eafa33aeb7cd6a1b0da74" + integrity sha512-X88chM7w8jnadoZtjPTi5ahCJx9pc9f8GfEkZAEYUTlcUZIEw2D/RY86HI/LkkE7Nj8TQWkiBfaFTJ3VJT6ESg== + dependencies: + "@shikijs/core" "1.6.4" + shiki@^1.1.7: version "1.3.0" resolved "https://registry.yarnpkg.com/shiki/-/shiki-1.3.0.tgz#3eda35cb49f6f0a98525e9da48fc072e6c655a3f" @@ -18318,6 +18495,13 @@ strip-literal@^2.0.0: dependencies: js-tokens "^8.0.2" +strip-literal@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/strip-literal/-/strip-literal-2.1.0.tgz#6d82ade5e2e74f5c7e8739b6c84692bd65f0bd2a" + integrity sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw== + dependencies: + js-tokens "^9.0.0" + strip-outer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" @@ -19137,6 +19321,25 @@ unimport@^3.6.0, unimport@^3.7.1: strip-literal "^1.3.0" unplugin "^1.5.1" +unimport@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/unimport/-/unimport-3.7.2.tgz#36fead8bdeb2695b6026861318bf111ad0596a5b" + integrity sha512-91mxcZTadgXyj3lFWmrGT8GyoRHWuE5fqPOjg5RVtF6vj+OfM5G6WCzXjuYtSgELE5ggB34RY4oiCSEP8I3AHw== + dependencies: + "@rollup/pluginutils" "^5.1.0" + acorn "^8.11.3" + escape-string-regexp "^5.0.0" + estree-walker "^3.0.3" + fast-glob "^3.3.2" + local-pkg "^0.5.0" + magic-string "^0.30.10" + mlly "^1.7.0" + pathe "^1.1.2" + pkg-types "^1.1.1" + scule "^1.3.0" + strip-literal "^2.1.0" + unplugin "^1.10.1" + union-value@^1.0.0, union-value@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"