2022-03-26 18:06:02 +01:00
|
|
|
import fs_ from 'fs'
|
2022-02-09 18:58:16 +01:00
|
|
|
import path from 'path'
|
2022-03-26 18:06:02 +01:00
|
|
|
import axios from 'axios'
|
2022-06-17 12:02:09 +02:00
|
|
|
import { designsByType } from '../../../config/software/index.mjs'
|
2022-02-09 18:58:16 +01:00
|
|
|
|
2022-03-26 18:06:02 +01:00
|
|
|
const fs = fs_.promises
|
2022-02-09 18:58:16 +01:00
|
|
|
|
2022-03-26 18:06:02 +01:00
|
|
|
const header = `/*
|
|
|
|
*
|
|
|
|
* This page was auto-generated by the prebuild script
|
2022-02-09 18:58:16 +01:00
|
|
|
* Any changes you make to it will be lost on the next (pre)build.
|
|
|
|
*
|
|
|
|
* If you want to make changes, update the pageTemplate in:
|
|
|
|
*
|
2022-06-17 12:02:09 +02:00
|
|
|
* sites/shared/prebuild/lab.mjs
|
2022-02-09 18:58:16 +01:00
|
|
|
*
|
|
|
|
*/
|
2022-03-26 18:06:02 +01:00
|
|
|
`
|
|
|
|
const loadFromUnpkg = (design, version) => {
|
|
|
|
const start = Date.now()
|
|
|
|
return axios
|
|
|
|
.get(`https://unpkg.com/@freesewing/${design}@${version}/dist/index.mjs`)
|
|
|
|
.then(res => {
|
|
|
|
if (res.data) {
|
|
|
|
console.log(`Downloaded @freesewing/${design}@${version} in ${Date.now() - start}ms`)
|
|
|
|
return res.data
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
})
|
|
|
|
.catch(err => false)
|
|
|
|
}
|
|
|
|
|
|
|
|
const pageTemplate = design => `${header}
|
2022-06-17 12:02:09 +02:00
|
|
|
import design from 'designs/${design}/src/index.js'
|
2022-02-09 18:58:16 +01:00
|
|
|
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
|
|
|
|
import PageTemplate from 'site/page-templates/workbench.js'
|
|
|
|
|
2022-06-17 12:02:09 +02:00
|
|
|
const Page = (props) => <PageTemplate {...props} design={design} version="next"/>
|
2022-02-09 18:58:16 +01:00
|
|
|
export default Page
|
|
|
|
|
|
|
|
export async function getStaticProps({ locale }) {
|
|
|
|
return {
|
|
|
|
props: {
|
|
|
|
...(await serverSideTranslations(locale)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
2022-03-26 18:06:02 +01:00
|
|
|
const versionedPageTemplate = (design, version) => `${header}
|
2022-06-17 12:02:09 +02:00
|
|
|
import design from 'lib/${version}/${design}.mjs'
|
2022-03-26 18:06:02 +01:00
|
|
|
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
|
|
|
|
import PageTemplate from 'site/page-templates/workbench.js'
|
|
|
|
|
2022-06-17 12:02:09 +02:00
|
|
|
const Page = (props) => <PageTemplate {...props} design={design} version="${version}"/>
|
2022-03-26 18:06:02 +01:00
|
|
|
export default Page
|
|
|
|
|
|
|
|
export async function getStaticProps({ locale }) {
|
|
|
|
return {
|
|
|
|
props: {
|
|
|
|
...(await serverSideTranslations(locale)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
const versionOverviewPage = (version) => `${header}
|
|
|
|
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
|
2022-06-17 12:02:09 +02:00
|
|
|
import Template from 'site/page-templates/design-list.js'
|
2022-03-26 18:06:02 +01:00
|
|
|
|
|
|
|
const Page = props => <Template {...props} version="${version}" />
|
|
|
|
|
|
|
|
export default Page
|
|
|
|
|
|
|
|
export async function getStaticProps({ locale }) {
|
|
|
|
return {
|
|
|
|
props: {
|
|
|
|
...(await serverSideTranslations(locale)),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-02-09 18:58:16 +01:00
|
|
|
/*
|
|
|
|
* Main method that does what needs doing
|
|
|
|
*/
|
2022-03-26 18:06:02 +01:00
|
|
|
|
2022-02-09 18:58:16 +01:00
|
|
|
export const prebuildLab = async (site) => {
|
2022-03-26 18:06:02 +01:00
|
|
|
const promises = []
|
2022-05-14 15:43:52 +02:00
|
|
|
const availableVersions = {}
|
2022-03-26 18:06:02 +01:00
|
|
|
// Load config
|
|
|
|
const versions = JSON.parse(await fs.readFile(
|
2022-06-17 12:02:09 +02:00
|
|
|
path.resolve('..', 'lab', 'versions.json'),
|
2022-03-26 18:06:02 +01:00
|
|
|
'utf-8'
|
|
|
|
))
|
2022-06-17 12:02:09 +02:00
|
|
|
for (const section in designsByType) {
|
2022-03-26 18:06:02 +01:00
|
|
|
// Iterate over sections
|
2022-06-17 12:02:09 +02:00
|
|
|
console.log(`Generating pages for ${section} designs`)
|
|
|
|
for (const design in designsByType[section]) {
|
2022-03-26 18:06:02 +01:00
|
|
|
|
|
|
|
// Generate pattern pages for next
|
2022-02-09 18:58:16 +01:00
|
|
|
console.log(` - ${design}`)
|
|
|
|
const page = pageTemplate(design)
|
2022-06-17 12:02:09 +02:00
|
|
|
const pages = ['..', 'lab', 'pages']
|
|
|
|
await fs.mkdir(path.resolve(...pages, 'v', 'next'), { recursive: true })
|
2022-03-26 18:06:02 +01:00
|
|
|
promises.push(
|
|
|
|
fs.writeFile(
|
2022-06-19 15:10:48 +02:00
|
|
|
path.resolve(...pages, `${design}.mjs`),
|
2022-03-26 18:06:02 +01:00
|
|
|
page
|
|
|
|
),
|
|
|
|
fs.writeFile(
|
2022-06-19 15:10:48 +02:00
|
|
|
path.resolve(...pages, section, `${design}.mjs`),
|
2022-03-26 18:06:02 +01:00
|
|
|
page
|
|
|
|
),
|
|
|
|
fs.writeFile(
|
2022-06-19 15:10:48 +02:00
|
|
|
path.resolve(...pages, 'v', 'next', `${design}.mjs`),
|
2022-03-26 18:06:02 +01:00
|
|
|
page
|
|
|
|
)
|
2022-02-09 18:58:16 +01:00
|
|
|
)
|
2022-03-26 18:06:02 +01:00
|
|
|
|
2022-03-26 20:27:37 +01:00
|
|
|
if (process.env.BUILD_ALL_VERSIONS) {
|
|
|
|
// Download published versions from unpkg
|
|
|
|
for (const version of versions) {
|
2022-05-14 15:43:52 +02:00
|
|
|
if (typeof availableVersions[version] === 'undefined') availableVersions[version] = new Set()
|
2022-03-26 20:27:37 +01:00
|
|
|
// Assume that if the file is on disk, it's good to go (caching)
|
2022-06-17 12:02:09 +02:00
|
|
|
const file = path.resolve('..', 'lab', 'lib', version, `${design}.mjs`)
|
2022-03-26 20:27:37 +01:00
|
|
|
let cached
|
|
|
|
try {
|
2022-07-12 20:47:39 +02:00
|
|
|
await fs.access(file)
|
2022-03-26 20:27:37 +01:00
|
|
|
cached = true
|
|
|
|
}
|
|
|
|
catch(err) {
|
|
|
|
cached = false
|
|
|
|
}
|
|
|
|
if (!cached) {
|
2022-06-17 12:02:09 +02:00
|
|
|
await fs.mkdir(path.resolve('..', 'lab', 'lib', version), { recursive: true })
|
|
|
|
await fs.mkdir(path.resolve('..', 'lab', 'pages', 'v', version), { recursive: true })
|
2022-03-26 20:27:37 +01:00
|
|
|
const code = (await loadFromUnpkg(design, version))
|
|
|
|
if (code) {
|
2022-05-14 15:43:52 +02:00
|
|
|
availableVersions[version].add(design)
|
2022-03-26 20:27:37 +01:00
|
|
|
promises.push(
|
|
|
|
fs.writeFile(
|
2022-06-17 12:02:09 +02:00
|
|
|
path.resolve('..', 'lab', 'lib', version, `${design}.mjs`),
|
2022-03-26 20:27:37 +01:00
|
|
|
code
|
|
|
|
),
|
|
|
|
fs.writeFile(
|
2022-06-19 15:10:48 +02:00
|
|
|
path.resolve('..', 'lab', 'pages', 'v', version, `${design}.mjs`),
|
2022-03-26 20:27:37 +01:00
|
|
|
versionedPageTemplate(design, version)
|
|
|
|
),
|
|
|
|
)
|
|
|
|
} else console.log(`No ${version} for ${design}`)
|
2022-05-14 15:43:52 +02:00
|
|
|
} else {
|
|
|
|
availableVersions[version].add(design)
|
2022-03-26 20:27:37 +01:00
|
|
|
}
|
2022-03-26 18:06:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-03-26 20:27:37 +01:00
|
|
|
if (process.env.BUILD_ALL_VERSIONS) {
|
2022-05-14 15:43:52 +02:00
|
|
|
// Write available versions file
|
|
|
|
const av = {}
|
|
|
|
for (const [v, set] of Object.entries(availableVersions)) av[v] = [...set].sort()
|
|
|
|
promises.push(
|
|
|
|
fs.writeFile(
|
2022-06-17 12:02:09 +02:00
|
|
|
path.resolve('..', 'lab', 'available-versions.json'),
|
2022-05-14 15:43:52 +02:00
|
|
|
JSON.stringify(av, null, 2)
|
|
|
|
)
|
|
|
|
)
|
2022-03-26 20:27:37 +01:00
|
|
|
// Also add version overview pages
|
|
|
|
for (const version of versions) {
|
|
|
|
// Assume that if the file is on disk, it's good to go (caching)
|
2022-06-17 12:02:09 +02:00
|
|
|
const page = path.resolve('..', 'lab', 'pages', 'v', version, 'index.js')
|
2022-03-26 20:27:37 +01:00
|
|
|
let cached
|
|
|
|
try {
|
|
|
|
await fs.access(page)
|
|
|
|
cached = true
|
|
|
|
}
|
|
|
|
catch(err) {
|
|
|
|
cached = false
|
|
|
|
}
|
|
|
|
// Create page if it's not there already
|
|
|
|
if (!cached) promises.push(fs.writeFile(page, versionOverviewPage(version)))
|
2022-02-09 18:58:16 +01:00
|
|
|
}
|
|
|
|
}
|
2022-03-26 18:06:02 +01:00
|
|
|
|
|
|
|
await Promise.all(promises)
|
2022-02-09 18:58:16 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|