ide/deploy/scan.js (111 lines of code) (raw):
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import {glob} from 'glob';
import {buildAction, buildZip, deployAction, deployPackage, deployProject} from './deploy.js';
import {getOpenServerlessConfig} from './client.js';
import {config} from "dotenv";
/**
* This function will prepare and deploy the functions in `packages` directory.
* The user can specify different globs for packages, main and singles using a
* `package.json` file in the application root directory.
* In the `package.json` the user can add an `openserverless` object like this:
* ```package.json
* [...]
* "openserverless": {
* "requirements": [ array of custom requirements ],
* "mains": [ array of custom mains ],
* "singles": [ array of custom singles ],
* }.
* [...]
* ```
* @returns {Promise<void>}
*/
export async function scan() {
const deployments = new Set();
const packages = new Set();
console.log("> Scan:");
// => REQUIREMENTS
const defaultReqsGlobs = [
"packages/*/*/requirements.txt",
"packages/*/*/package.json",
"packages/*/*/composer.json",
"packages/*/*/go.mod"
];
// load user defined requirements or use `defaultReqsGlobs`
const packageGlobs = getOpenServerlessConfig("requirements", defaultReqsGlobs);
// requirements
const reqs = [];
// Check for additional packages from each package
// and add them to the requirements array
for (const pkgGlob of packageGlobs) {
const items = await glob(pkgGlob);
for (const item of items) {
if (!reqs.includes(item)) {
reqs.push(item);
}
}
}
// let's package the functions that have requirements
for (const req of reqs) {
console.log(">> Requirements:", req);
const sp = req.split("/");
const act = buildZip(sp[1], sp[2]);
deployments.add(act);
packages.add(sp[1]);
}
// => MAINS
const defaultMainsGlobs = [
"packages/*/*/index.js",
"packages/*/*/__main__.py",
"packages/*/*/index.php",
"packages/*/*/main.go"
];
// load user defined main functions or use `defaultMainsGlobs`
const mainsGlobs = getOpenServerlessConfig("mains", defaultMainsGlobs);
const mains = [];
for (const mainGlob of mainsGlobs) {
const items = await glob(mainGlob);
for (const item of items) {
if (!mains.includes(item)) {
mains.push(item);
}
}
}
for (const main of mains) {
console.log(">> Main:", main);
const sp = main.split("/");
const act = buildAction(sp[1], sp[2]);
deployments.add(act);
packages.add(sp[1]);
}
// => SINGLES
const defaultSinglesGlobs = [
"packages/*/*.py",
"packages/*/*.js",
"packages/*/*.php",
"packages/*/*.go"
];
const singlesGlobs = getOpenServerlessConfig("singles", defaultSinglesGlobs);
const singles = [];
for (const singleGlob of singlesGlobs) {
const items = await glob(singleGlob);
for (const item of items) {
if (!singles.includes(item)) {
singles.push(item);
}
}
}
for (const single of singles) {
console.log(">> Action:", single);
const sp = single.split("/");
deployments.add(single);
packages.add(sp[1]);
}
console.log("> Deploying:");
for (const pkg of packages) {
console.log(">> Package:", pkg);
deployPackage(pkg);
}
for (const action of deployments) {
console.log(">>> Action:", action);
deployAction(action);
}
// => MANIFESTS
const defaultProjectGlobs = [
"packages/*.yaml",
"packages/*/*.yaml",
];
const manifestsGlobs = getOpenServerlessConfig("manifests", defaultProjectGlobs);
const manifests = [];
for (const manifestGlobs of manifestsGlobs) {
const items = await glob(manifestGlobs);
for (const item of items) {
if (!manifests.includes(item)) {
manifests.push(item);
}
}
manifests.sort((a, b) => a.localeCompare(b));
}
if (manifests.length >0 ) {
if (Bun.file('packeges/.env')) {
console.log("Found packages .env file. Reading it");
config({ path: "./package/.env" });
}
for (const manifest of manifests) {
console.log(">>> Manifest:", manifest);
deployProject(manifest);
}
}
}