download component libraries from NPM tarball
This commit is contained in:
parent
22005bc990
commit
b4e70301a0
|
@ -49,6 +49,7 @@
|
||||||
"@sentry/node": "^5.19.2",
|
"@sentry/node": "^5.19.2",
|
||||||
"aws-sdk": "^2.706.0",
|
"aws-sdk": "^2.706.0",
|
||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
|
"chmodr": "^1.2.0",
|
||||||
"dotenv": "^8.2.0",
|
"dotenv": "^8.2.0",
|
||||||
"electron-is-dev": "^1.2.0",
|
"electron-is-dev": "^1.2.0",
|
||||||
"electron-unhandled": "^3.0.2",
|
"electron-unhandled": "^3.0.2",
|
||||||
|
@ -70,7 +71,7 @@
|
||||||
"pouchdb": "^7.2.1",
|
"pouchdb": "^7.2.1",
|
||||||
"pouchdb-all-dbs": "^1.0.2",
|
"pouchdb-all-dbs": "^1.0.2",
|
||||||
"squirrelly": "^7.5.0",
|
"squirrelly": "^7.5.0",
|
||||||
"tar-fs": "^2.0.0",
|
"tar-fs": "^2.1.0",
|
||||||
"uuid": "^3.3.2",
|
"uuid": "^3.3.2",
|
||||||
"validate.js": "^0.13.1",
|
"validate.js": "^0.13.1",
|
||||||
"yargs": "^13.2.4",
|
"yargs": "^13.2.4",
|
||||||
|
|
|
@ -7,11 +7,13 @@ const instanceController = require("./instance")
|
||||||
const { resolve, join } = require("path")
|
const { resolve, join } = require("path")
|
||||||
const { copy, exists, readFile, writeFile } = require("fs-extra")
|
const { copy, exists, readFile, writeFile } = require("fs-extra")
|
||||||
const { budibaseAppsDir } = require("../../utilities/budibaseDir")
|
const { budibaseAppsDir } = require("../../utilities/budibaseDir")
|
||||||
const { exec } = require("child_process")
|
|
||||||
const sqrl = require("squirrelly")
|
const sqrl = require("squirrelly")
|
||||||
const setBuilderToken = require("../../utilities/builder/setBuilderToken")
|
const setBuilderToken = require("../../utilities/builder/setBuilderToken")
|
||||||
const fs = require("fs-extra")
|
const fs = require("fs-extra")
|
||||||
const chmodr = require("../../utilities/chmodr")
|
const { promisify } = require("util")
|
||||||
|
const chmodr = require("chmodr")
|
||||||
|
const { downloadExtractComponentLibraries } = require("../../utilities/createAppPackage")
|
||||||
|
|
||||||
|
|
||||||
exports.fetch = async function(ctx) {
|
exports.fetch = async function(ctx) {
|
||||||
const db = new CouchDB(ClientDb.name(getClientId(ctx)))
|
const db = new CouchDB(ClientDb.name(getClientId(ctx)))
|
||||||
|
@ -84,7 +86,7 @@ exports.create = async function(ctx) {
|
||||||
|
|
||||||
if (ctx.isDev) {
|
if (ctx.isDev) {
|
||||||
const newAppFolder = await createEmptyAppPackage(ctx, newApplication)
|
const newAppFolder = await createEmptyAppPackage(ctx, newApplication)
|
||||||
await runNpmInstall(newAppFolder)
|
await downloadExtractComponentLibraries(newAppFolder)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.status = 200
|
ctx.status = 200
|
||||||
|
@ -148,7 +150,8 @@ const createEmptyAppPackage = async (ctx, app) => {
|
||||||
// this line allows full permission on copied files
|
// this line allows full permission on copied files
|
||||||
// we have an unknown problem without this, whereby the
|
// we have an unknown problem without this, whereby the
|
||||||
// files get weird permissions and cant be written to :(
|
// files get weird permissions and cant be written to :(
|
||||||
await chmodr(newAppFolder, 0o777)
|
const chmodrPromise = promisify(chmodr)
|
||||||
|
await chmodrPromise(newAppFolder, 0o777)
|
||||||
|
|
||||||
await updateJsonFile(join(appsFolder, app._id, "package.json"), {
|
await updateJsonFile(join(appsFolder, app._id, "package.json"), {
|
||||||
name: npmFriendlyAppName(app.name),
|
name: npmFriendlyAppName(app.name),
|
||||||
|
@ -216,18 +219,6 @@ const updateJsonFile = async (filePath, app) => {
|
||||||
return JSON.parse(newJson)
|
return JSON.parse(newJson)
|
||||||
}
|
}
|
||||||
|
|
||||||
const runNpmInstall = async newAppFolder => {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const cmd = `cd ${newAppFolder} && npm install`
|
|
||||||
exec(cmd, (error, stdout, stderr) => {
|
|
||||||
if (error) {
|
|
||||||
reject(error)
|
|
||||||
}
|
|
||||||
resolve(stdout ? stdout : stderr)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const npmFriendlyAppName = name =>
|
const npmFriendlyAppName = name =>
|
||||||
name
|
name
|
||||||
.replace(/_/g, "")
|
.replace(/_/g, "")
|
||||||
|
|
|
@ -83,6 +83,7 @@ exports.serveComponentLibrary = async function(ctx) {
|
||||||
ctx.user.appId,
|
ctx.user.appId,
|
||||||
"node_modules",
|
"node_modules",
|
||||||
decodeURI(ctx.query.library),
|
decodeURI(ctx.query.library),
|
||||||
|
"package",
|
||||||
"dist"
|
"dist"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ app.context.eventEmitter = eventEmitter
|
||||||
// api routes
|
// api routes
|
||||||
app.use(api.routes())
|
app.use(api.routes())
|
||||||
|
|
||||||
if (electron.app && electron.app.isPackaged()) {
|
if (electron.app && electron.app.isPackaged) {
|
||||||
Sentry.init()
|
Sentry.init()
|
||||||
|
|
||||||
app.on("error", (err, ctx) => {
|
app.on("error", (err, ctx) => {
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
const fs = require("fs-extra")
|
|
||||||
const { join } = require("path")
|
|
||||||
|
|
||||||
const chmodr = async (dir, perms) => {
|
|
||||||
const children = await fs.readdir(dir)
|
|
||||||
for (let child of children) {
|
|
||||||
const fullChildPath = join(dir, child)
|
|
||||||
const stat = await fs.stat(join(dir, child))
|
|
||||||
if (stat.isFile()) {
|
|
||||||
await fs.chmod(fullChildPath, perms)
|
|
||||||
} else {
|
|
||||||
await chmodr(fullChildPath, perms)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = chmodr
|
|
|
@ -1,7 +1,35 @@
|
||||||
const { resolve } = require("path")
|
const { resolve } = require("path")
|
||||||
const { cwd } = require("process")
|
const { cwd } = require("process")
|
||||||
|
const stream = require("stream")
|
||||||
|
const fetch = require("node-fetch")
|
||||||
|
const tar = require("tar-fs")
|
||||||
|
const zlib = require("zlib")
|
||||||
|
const { promisify } = require("util")
|
||||||
|
const streamPipeline = promisify(stream.pipeline)
|
||||||
|
|
||||||
const appPackageFolder = (config, appname) =>
|
exports.appPackageFolder = (config, appname) =>
|
||||||
resolve(cwd(), config.latestPackagesFolder, appname)
|
resolve(cwd(), config.latestPackagesFolder, appname)
|
||||||
|
|
||||||
module.exports.appPackageFolder = appPackageFolder
|
|
||||||
|
exports.downloadExtractComponentLibraries = async appFolder => {
|
||||||
|
|
||||||
|
const LIBRARIES = [
|
||||||
|
"materialdesign-components",
|
||||||
|
"standard-components"
|
||||||
|
]
|
||||||
|
|
||||||
|
// Need to download tarballs directly from NPM as our users may not have node on their machine
|
||||||
|
for (let lib of LIBRARIES) {
|
||||||
|
// download tarball
|
||||||
|
// TODO: make sure the latest version is always downloaded
|
||||||
|
const registryUrl = `https://registry.npmjs.org/@budibase/${lib}/-/${lib}-0.1.2.tgz`;
|
||||||
|
const response = await fetch(registryUrl)
|
||||||
|
if (!response.ok) throw new Error(`unexpected response ${response.statusText}`)
|
||||||
|
|
||||||
|
await streamPipeline(
|
||||||
|
response.body,
|
||||||
|
zlib.Unzip(),
|
||||||
|
tar.extract(`${appFolder}/node_modules/@budibase/${lib}`)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
|
@ -1262,6 +1262,11 @@ chardet@^0.7.0:
|
||||||
version "0.7.0"
|
version "0.7.0"
|
||||||
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
|
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
|
||||||
|
|
||||||
|
chmodr@^1.2.0:
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.2.0.tgz#720e96caa09b7f1cdbb01529b7d0ab6bc5e118b9"
|
||||||
|
integrity sha512-Y5uI7Iq/Az6HgJEL6pdw7THVd7jbVOTPwsmcPOBjQL8e3N+pz872kzK5QxYGEy21iRys+iHWV0UZQXDFJo1hyA==
|
||||||
|
|
||||||
chokidar@^3.2.2:
|
chokidar@^3.2.2:
|
||||||
version "3.3.1"
|
version "3.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
|
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
|
||||||
|
@ -5742,9 +5747,10 @@ table@^5.2.3:
|
||||||
slice-ansi "^2.1.0"
|
slice-ansi "^2.1.0"
|
||||||
string-width "^3.0.0"
|
string-width "^3.0.0"
|
||||||
|
|
||||||
tar-fs@^2.0.0:
|
tar-fs@^2.1.0:
|
||||||
version "2.0.1"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2"
|
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.0.tgz#d1cdd121ab465ee0eb9ccde2d35049d3f3daf0d5"
|
||||||
|
integrity sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==
|
||||||
dependencies:
|
dependencies:
|
||||||
chownr "^1.1.1"
|
chownr "^1.1.1"
|
||||||
mkdirp-classic "^0.5.2"
|
mkdirp-classic "^0.5.2"
|
||||||
|
|
Loading…
Reference in New Issue