Files
dc/sas/mocks/snapshot.js
T
dc a128b609f8
Demo preview / deploy (push) Successful in 3m47s
Build / Build-and-ng-test (pull_request) Successful in 5m12s
Lighthouse Checks / lighthouse (pull_request) Successful in 20m18s
Build / Build-and-test-development (pull_request) Successful in 30m56s
ci(demo): publish release branches to demo.datacontroller.io
Pushes to release/** now build the mocks as a browser-hosted site (SASjs CLI
6.1.0, streamConfig.mockWeb) and publish it to the Surfer app behind
demo.datacontroller.io, so the demo always matches the release branch.

The browser build seeds its drive from the compiled services, which carries no
DC data, so the job runs makedata on a throwaway SASjs Server and ships that
drive as mock-snapshot.json.
2026-10-24 16:49:02 +00:00

93 lines
2.8 KiB
JavaScript

// Collect the SASjs Server drive for an app into a mock-snapshot.json, which
// `sasjs build` ships as the browser build's starting drive (the alternative is
// a drive seeded from the compiled services alone, i.e. no DC data).
//
// Usage: node sas/mocks/snapshot.js <drive-root> <appLoc> <out-file>
// drive-root the SASjs Server drive folder (the `drive` folder of a server install)
// appLoc the deployed app location, e.g. /Public/app/dc
// out-file where to write the snapshot, e.g. sas/mocks/sasjsbuild/mock-snapshot.json
//
// Every file is written as a string because the browser runtime's drive holds
// text only; a file that does not survive a UTF-8 round trip is skipped rather
// than mangled.
const fs = require('fs')
const path = require('path')
const [driveRoot, appLoc, outFile, excludeArg] = process.argv.slice(2)
if (!driveRoot || !appLoc || !outFile) {
console.error(
'Usage: node sas/mocks/snapshot.js <drive-root> <appLoc> <out-file> [exclude,exclude]'
)
process.exit(1)
}
const app = '/' + appLoc.replace(/^\/+|\/+$/g, '')
const driveFolder = path.join(
driveRoot,
'files',
...app.split('/').filter(Boolean)
)
const driveKey = `/sasjs/drive/files${app}`
// Comma-separated paths relative to the app, e.g. "services/web9" - the
// streamed frontend is copied into the drive as a service folder, is already the
// site itself, and would otherwise duplicate the whole app inside the snapshot.
const excludes = (excludeArg || '')
.split(',')
.map((value) => value.trim().replace(/^\/+|\/+$/g, ''))
.filter(Boolean)
if (!fs.existsSync(driveFolder)) {
console.error('No drive folder at ' + driveFolder)
process.exit(1)
}
const files = {}
const skipped = []
const walk = (folder) => {
for (const entry of fs.readdirSync(folder, { withFileTypes: true })) {
const absolute = path.join(folder, entry.name)
if (entry.isDirectory()) {
walk(absolute)
continue
}
const relative = path
.relative(driveFolder, absolute)
.split(path.sep)
.join('/')
if (
excludes.some(
(prefix) => relative === prefix || relative.startsWith(prefix + '/')
)
) {
continue
}
const buffer = fs.readFileSync(absolute)
const text = buffer.toString('utf8')
if (!Buffer.from(text, 'utf8').equals(buffer)) {
skipped.push(relative)
continue
}
files[`${driveKey}/${relative}`] = text
}
}
walk(driveFolder)
fs.mkdirSync(path.dirname(path.resolve(outFile)), { recursive: true })
fs.writeFileSync(path.resolve(outFile), JSON.stringify({ files }, null, 2))
console.log(
`Snapshot: ${Object.keys(files).length} file(s) from ${driveFolder} -> ${outFile}` +
(skipped.length
? `, skipped ${skipped.length} non-text file(s): ${skipped.slice(0, 3).join(', ')}`
: '')
)