1
0
Fork 0
freesewing/packages/freesewing.shared/prebuild/lab.mjs
2022-05-14 15:43:52 +02:00

200 lines
5.8 KiB
JavaScript

import fs_ from 'fs'
import path from 'path'
import axios from 'axios'
const fs = fs_.promises
const header = `/*
*
* This page was auto-generated by the prebuild script
* Any changes you make to it will be lost on the next (pre)build.
*
* If you want to make changes, update the pageTemplate in:
*
* packages/freesewing.shared/prebuild/lab.mjs
*
*/
`
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}
import pattern from 'pkgs/${design}/src/index.js'
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import PageTemplate from 'site/page-templates/workbench.js'
const Page = (props) => <PageTemplate {...props} pattern={pattern} version="next"/>
export default Page
export async function getStaticProps({ locale }) {
return {
props: {
...(await serverSideTranslations(locale)),
}
}
}
`
const versionedPageTemplate = (design, version) => `${header}
import pattern from 'lib/${version}/${design}.mjs'
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import PageTemplate from 'site/page-templates/workbench.js'
const Page = (props) => <PageTemplate {...props} pattern={pattern} version="${version}"/>
export default Page
export async function getStaticProps({ locale }) {
return {
props: {
...(await serverSideTranslations(locale)),
}
}
}
`
const versionOverviewPage = (version) => `${header}
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
import Template from 'site/page-templates/pattern-list.js'
const Page = props => <Template {...props} version="${version}" />
export default Page
export async function getStaticProps({ locale }) {
return {
props: {
...(await serverSideTranslations(locale)),
}
}
}
`
/*
* Main method that does what needs doing
*/
const l = 'prebuild'
export const prebuildLab = async (site) => {
const promises = []
const availableVersions = {}
// Load config
const versions = JSON.parse(await fs.readFile(
path.resolve('..', 'freesewing.lab', 'versions.json'),
'utf-8'
))
const patterns = JSON.parse(await fs.readFile(
path.resolve('..', 'freesewing.lab', 'patterns.json'),
'utf-8'
))
const plugins = JSON.parse(await fs.readFile(
path.resolve('..', 'freesewing.lab', 'plugins.json'),
'utf-8'
))
for (const section in patterns) {
// Iterate over sections
console.log(`Generating pages for ${section} patterns`)
for (const design of patterns[section]) {
// Generate pattern pages for next
console.log(` - ${design}`)
const page = pageTemplate(design)
await fs.mkdir(path.resolve('..', `freesewing.lab`, 'pages', 'v', 'next'), { recursive: true })
promises.push(
fs.writeFile(
path.resolve('..', `freesewing.lab`, 'pages', `${design}.js`),
page
),
fs.writeFile(
path.resolve('..', `freesewing.lab`, 'pages', section, `${design}.js`),
page
),
fs.writeFile(
path.resolve('..', `freesewing.lab`, 'pages', 'v', 'next', `${design}.js`),
page
)
)
if (process.env.BUILD_ALL_VERSIONS) {
// Download published versions from unpkg
for (const version of versions) {
if (typeof availableVersions[version] === 'undefined') availableVersions[version] = new Set()
// Assume that if the file is on disk, it's good to go (caching)
const file = path.resolve('..', `freesewing.lab`, 'lib', version, `${design}.mjs`)
let cached
try {
const result = await fs.access(file)
cached = true
}
catch(err) {
cached = false
}
if (!cached) {
await fs.mkdir(path.resolve('..', `freesewing.lab`, 'lib', version), { recursive: true })
await fs.mkdir(path.resolve('..', `freesewing.lab`, 'pages', 'v', version), { recursive: true })
const code = (await loadFromUnpkg(design, version))
if (code) {
availableVersions[version].add(design)
promises.push(
fs.writeFile(
path.resolve('..', `freesewing.lab`, 'lib', version, `${design}.mjs`),
code
),
fs.writeFile(
path.resolve('..', `freesewing.lab`, 'pages', 'v', version, `${design}.js`),
versionedPageTemplate(design, version)
),
)
} else console.log(`No ${version} for ${design}`)
} else {
availableVersions[version].add(design)
}
}
}
}
}
if (process.env.BUILD_ALL_VERSIONS) {
// Write available versions file
const av = {}
for (const [v, set] of Object.entries(availableVersions)) av[v] = [...set].sort()
promises.push(
fs.writeFile(
path.resolve('..', `freesewing.lab`, 'available-versions.json'),
JSON.stringify(av, null, 2)
)
)
// Also add version overview pages
for (const version of versions) {
// Assume that if the file is on disk, it's good to go (caching)
const page = path.resolve('..', `freesewing.lab`, 'pages', 'v', version, 'index.js')
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)))
}
}
await Promise.all(promises)
}