1
0
Fork 0
freesewing/packages/studio/prebuild.mjs
Joost De Cock 51dc1d9732
[breaking]: FreeSewing v4 (#7297)
Refer to the CHANGELOG for all info.

---------

Co-authored-by: Wouter van Wageningen <wouter.vdub@yahoo.com>
Co-authored-by: Josh Munic <jpmunic@gmail.com>
Co-authored-by: Jonathan Haas <haasjona@gmail.com>
2025-04-01 16:15:20 +02:00

125 lines
3.3 KiB
JavaScript

import path from 'node:path'
import fs from 'node:fs'
import rdir from 'recursive-readdir'
import { exec } from 'node:child_process'
const ignore = [
'node_modules',
'.eslint',
'.gitignore',
'.next',
'.env.local',
'prebuild.mjs',
'sde/public/android-chrome-192x192.png',
'sde/public/android-chrome-384x384.png',
'sde/public/apple-touch-icon.png',
'sde/public/browserconfig.xml',
'sde/public/favicon-16x16.png',
'sde/public/favicon-32x32.png',
'sde/public/favicon.ico',
'sde/public/mstile-150x150.png',
'sde/public/safari-pinned-tab.svg',
'sde/public/site.webmanifest',
]
const getFiles = async (dir) => {
const all = await rdir(path.resolve(dir))
return all
.filter((file) => {
for (const skip of ignore) {
if (file.includes(skip)) return false
}
return true
})
.map((file) => file.split('/sites/').pop())
}
const searchFiles = async (dirs, split = '/sites/') => {
/*
* Figure out what directory to spawn the child process in
*/
const cwd = await path.resolve(process.cwd())
/*
* Holds the matches
*/
const matches = []
/*
* When going through a small number of files in a flat directory (eg. blog posts) a
* recursive grep through all files is faster.
* But the biggest task is combing through all the org documentation and for this
* it's much faster to first run find to limit the number of files to open
*/
for (const dir of dirs) {
const cmd = `grep "__SDEFILE__" -Rislm 1 ${path.resolve(cwd, dir)}`
const grep = exec(cmd, { cwd, maxBuffer: 2048 * 1024 }, (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error} - ${stderr}`)
return
}
return stdout
})
/*
* Stdout is buffered, so we need to gather all of it
*/
let stdout = ''
for await (const data of grep.stdout) stdout += data
/*
* Add all all matches to the array
*/
matches.push(
...stdout
.split('\n')
.filter((entry) => entry.length > 2)
.map((file) => file.split(split).pop())
)
}
return matches
}
const buildFileList = async () => {
const sde = await getFiles('../../sites/sde')
const shared = await searchFiles([
'../../sites/shared/utils.mjs',
'../../sites/shared/components',
'../../sites/shared/config',
'../../sites/shared/context',
'../../sites/shared/hooks',
'../../sites/shared/mdx',
'../../sites/shared/plugins',
'../../sites/shared/styles',
'../../sites/shared/themes',
'../../sites/shared/prebuild/data',
])
const pkgs = await searchFiles(['../../packages/react-components/src'], '/packages/')
return { sites: [...sde, ...shared], pkgs }
}
/*
* We don't run this in the linter
* because it slows down linting for no good reason
*/
if (!process.env.LINTER) {
// Avoid symlink so Windows users don't complain
const copyThese = [
{
from: ['..', '..', 'scripts', 'banner.mjs'],
to: ['lib', 'banner.mjs'],
},
]
for (const cp of copyThese) {
fs.copyFile(path.resolve(...cp.from), path.resolve(...cp.to), () => null)
}
const files = await buildFileList()
fs.writeFileSync(
path.resolve('lib', 'download-list.mjs'),
`export const downloads = ${JSON.stringify(files, null, 2).replaceAll('"', "'")}`
)
}