@swizzyweb/swerve-manager 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/swerve.js ADDED
@@ -0,0 +1,278 @@
1
+ // @ts-ignore
2
+ import express from "@swizzyweb/express";
3
+ import { getFullImportPath, getLoggerForService, } from "./utils/index.js";
4
+ import { SwizzyWinstonLogger, } from "@swizzyweb/swizzy-web-service";
5
+ import os from "node:os";
6
+ import process from "node:process";
7
+ import path from "node:path";
8
+ import { mkdirSync } from "node:fs";
9
+ export var InstanceType;
10
+ (function (InstanceType) {
11
+ InstanceType["webservice"] = "webservice";
12
+ InstanceType["stack"] = "stack";
13
+ })(InstanceType || (InstanceType = {}));
14
+ export class SwerveManager {
15
+ apps;
16
+ webServices;
17
+ configurations;
18
+ constructor(props) {
19
+ this.apps = props.apps ?? {};
20
+ this.webServices = props.webServices ?? [];
21
+ }
22
+ async run(request) {
23
+ const { args } = request;
24
+ const newWebServices = await this.runWithArgs({
25
+ args,
26
+ });
27
+ this.webServices.push(...newWebServices);
28
+ return { webServices: newWebServices };
29
+ }
30
+ async runWithArgs(request) {
31
+ const { args } = request;
32
+ const logLevel = process.env.LOG_LEVEL ?? args.logLevel ?? "info";
33
+ let gLogger = new SwizzyWinstonLogger({
34
+ port: 0,
35
+ logLevel,
36
+ appDataRoot: args.appDataRoot ?? ".",
37
+ appName: `swerve`,
38
+ hostName: os.hostname(),
39
+ ownerName: "swerve",
40
+ pid: process.pid,
41
+ });
42
+ try {
43
+ const webServices = [];
44
+ const newApps = {};
45
+ for (const serviceEntry of Object.entries(args.services)) {
46
+ const port = serviceEntry[1].port ?? args.port;
47
+ if (!this.apps[`${port}`]) {
48
+ this.apps[`${port}`] = { app: await express(), services: {} };
49
+ newApps[`${port}`] = this.apps[`${port}`];
50
+ }
51
+ const app = this.apps[`${port}`].app;
52
+ const service = serviceEntry[1];
53
+ const packageName = serviceEntry[0];
54
+ const importPathOrName = service.servicePath ?? service.packageName;
55
+ gLogger.debug(`importPathOrName ${importPathOrName}`);
56
+ const serviceArgs = {
57
+ ...service,
58
+ ...service.serviceConfiguration,
59
+ ...args.serviceArgs,
60
+ };
61
+ const webservice = await this.installWebService({
62
+ serviceKey: serviceEntry[0],
63
+ packageName,
64
+ importPathOrName,
65
+ port,
66
+ app,
67
+ appDataRoot: args.appDataRoot,
68
+ serviceArgs,
69
+ gLogger,
70
+ });
71
+ this.apps[`${port}`].services[webservice.instanceId] = {
72
+ webService: webservice,
73
+ serviceArgs,
74
+ runRequest: request,
75
+ };
76
+ webServices.push(webservice);
77
+ }
78
+ for (const newAppEntry of Object.entries(newApps)) {
79
+ const [port, appRecord] = newAppEntry;
80
+ const newApp = appRecord.app;
81
+ const server = await newApp.listen(port, () => {
82
+ // this.apps[port].services[newApp.instanceId] = {};
83
+ gLogger.debug(`New app listening on port ${port}`);
84
+ });
85
+ this.apps[`${port}`].server = server;
86
+ }
87
+ for (const webService of webServices) {
88
+ gLogger.info(`${webService.name} running on port ${webService.port}`);
89
+ }
90
+ return webServices;
91
+ }
92
+ catch (e) {
93
+ gLogger.error(`Error occurred initializing service\n ${e.message}\n ${e.stack ?? {}}`);
94
+ }
95
+ }
96
+ async runWithApp(props) {
97
+ const { app, args } = props;
98
+ let gLogger = new SwizzyWinstonLogger({
99
+ port: 0,
100
+ logLevel: process.env.LOG_LEVEL ?? "info",
101
+ appDataRoot: args.appDataRoot,
102
+ appName: `swerve`,
103
+ hostName: os.hostname(),
104
+ pid: process.pid,
105
+ });
106
+ try {
107
+ gLogger = new SwizzyWinstonLogger({
108
+ logLevel: args.serviceArgs.logLevel ?? process.env.LOG_LEVEL ?? "info",
109
+ port: args.port,
110
+ logDir: args.appDataRoot,
111
+ appName: `swerve`,
112
+ hostName: os.hostname(),
113
+ pid: process.pid,
114
+ });
115
+ gLogger.debug(`Swerve Args: ${JSON.stringify(args)}`);
116
+ const PORT = args.port ?? 3005;
117
+ const webServices = [];
118
+ for (const serviceEntry of Object.entries(args.services)) {
119
+ const service = serviceEntry[1];
120
+ const packageName = service.packageName;
121
+ const importPathOrName = service.servicePath ?? service.serviceArgs.servicePath ?? packageName;
122
+ const webservice = await this.installWebService({
123
+ serviceKey: serviceEntry[0],
124
+ packageName,
125
+ importPathOrName,
126
+ port: PORT,
127
+ app,
128
+ appDataRoot: args.appDataRoot,
129
+ serviceArgs: {
130
+ ...service,
131
+ ...service.serviceConfiguration,
132
+ ...args.serviceArgs,
133
+ },
134
+ gLogger,
135
+ });
136
+ webServices.push(webservice);
137
+ }
138
+ return webServices;
139
+ }
140
+ catch (e) {
141
+ gLogger.error(`Error occurred initializing service\n ${e.message}\n ${e.stack ?? {}}`);
142
+ }
143
+ }
144
+ async installWebService(props) {
145
+ // const packageName = importPathOrName;
146
+ const { app, appDataRoot, packageName, port, gLogger, serviceArgs, importPathOrName, serviceKey, } = props;
147
+ try {
148
+ gLogger.info(`Getting webservice package ${packageName} and will run on port ${port}`);
149
+ gLogger.debug(`Getting tool with path: ${importPathOrName}`);
150
+ const fullPath = await getFullImportPath(importPathOrName);
151
+ const tool = await import(fullPath); //require(fullPath); //require(packageName as string);
152
+ gLogger.debug(`Got service with require: ${JSON.stringify(tool)}`);
153
+ gLogger.debug(`Getting web service from tool...`);
154
+ const appDataPath = path.join(appDataRoot, "appdata", serviceKey);
155
+ mkdirSync(appDataPath, { recursive: true });
156
+ const logger = getLoggerForService(serviceArgs, serviceKey, port, gLogger);
157
+ gLogger.debug(`serviceArgs for ${packageName}: ${serviceArgs}`);
158
+ const service = await tool.getWebservice({
159
+ appDataPath,
160
+ ...serviceArgs,
161
+ port,
162
+ app,
163
+ packageName,
164
+ serviceArgs: { ...serviceArgs },
165
+ logger,
166
+ });
167
+ logger.debug(`Got web service`);
168
+ gLogger.debug(`Installing web service...`);
169
+ await service.install({});
170
+ gLogger.debug(`Installed web service ${packageName}`);
171
+ return service;
172
+ }
173
+ catch (e) {
174
+ const exceptionMessage = `exception: ${e}
175
+ Failed to install web service, is it installed with NPM? Check package exists in node_modules
176
+ To add, run:
177
+ npm install ${packageName ?? "packageName"}
178
+ args:
179
+ packageName: ${packageName}
180
+ port: ${port}
181
+ `;
182
+ // ${getHelpText}`;
183
+ gLogger.error(`Failed to install web service, error: ${e?.message} stack: ${e?.stack}`);
184
+ throw e; //new Error(exceptionMessage);
185
+ }
186
+ }
187
+ async stop(request) {
188
+ const { instanceDetails } = request;
189
+ const { instanceId, instanceType } = instanceDetails;
190
+ const instanceIds = [];
191
+ if (!instanceId) {
192
+ throw new Error(`Instance id required to stop web service`);
193
+ }
194
+ if (instanceType === InstanceType.webservice) {
195
+ // console.log(`Matched instance type`);
196
+ instanceIds.push(`${instanceId}`);
197
+ }
198
+ else if (instanceType === InstanceType.stack) {
199
+ // TODO: implement
200
+ throw new Error(`Stack instance type is not yet supported`);
201
+ }
202
+ else {
203
+ // this.logger.error(`Invalid instance details ${instanceDetails}`);
204
+ throw new Error(`Invalid instance details provided`);
205
+ }
206
+ // console.log(`instanceIds: ${instanceIds}`);
207
+ const webServices = this.webServices.filter((service) => {
208
+ // console.log(`instanceId ${service.instanceId}`);
209
+ return instanceIds.includes(`${service.instanceId}`);
210
+ });
211
+ if (!webServices || webServices.length < 1) {
212
+ //console.error(webServices); //this.webServices);
213
+ throw new Error(`WebService with instanceId ${instanceId} not found while attempting to stop`);
214
+ }
215
+ const ports = [];
216
+ for (const webService of webServices) {
217
+ const port = webService.port;
218
+ ports.push(port);
219
+ //console.log(webService);
220
+ await webService.uninstall({});
221
+ const indexes = this.webServices
222
+ .map((val, index, array) => {
223
+ //console.log(
224
+ // `instanceInSwerve: ${val.instanceId} instanceInWebService ${webService.instanceId}`,
225
+ // );
226
+ if (val.instanceId == webService.instanceId) {
227
+ return index;
228
+ }
229
+ return undefined;
230
+ })
231
+ .filter((val) => val != undefined);
232
+ //.filter((val) => val);
233
+ if (indexes.length > 1) {
234
+ throw new Error(`Found multiple indexes for webservice instance ${webService.instanceId} ${indexes}`);
235
+ }
236
+ else if (indexes.length == 0) {
237
+ throw new Error(`No indexes for webservice instance ${webService.instanceId}`);
238
+ }
239
+ const index = indexes[0];
240
+ this.webServices.splice(index, 1);
241
+ if (!this.apps[`${port}`]?.services[webService.instanceId]) {
242
+ //console.log(`Apps does not contain service`);
243
+ // TODO: DO SOMETHING, log, throw maybe.
244
+ }
245
+ else {
246
+ delete this.apps[`${port}`].services[webService.instanceId];
247
+ }
248
+ }
249
+ //cleanup apps if no more services
250
+ for (const port of ports) {
251
+ const { services, server, app } = this.apps[`${port}`];
252
+ if (!services || Object.keys(services).length == 0) {
253
+ if (server) {
254
+ server.close();
255
+ }
256
+ else {
257
+ continue;
258
+ // TODO: do something, log throw etc
259
+ }
260
+ delete this.apps[`${port}`];
261
+ }
262
+ }
263
+ }
264
+ async getRunningWebServices(props) {
265
+ const webservices = {};
266
+ for (const webservice of this.webServices) {
267
+ const instanceId = webservice.instanceId;
268
+ const { runRequest, serviceArgs } = this.apps[webservice.port].services[instanceId];
269
+ webservices[instanceId] = {
270
+ webService: webservice.toJson(),
271
+ serviceConfig: runRequest?.args,
272
+ };
273
+ }
274
+ return {
275
+ webServices: webservices,
276
+ };
277
+ }
278
+ }
@@ -0,0 +1,12 @@
1
+ import { ILogger } from "@swizzyweb/swizzy-common";
2
+ import { IConfig, IService, KeyValue } from "../config/index.js";
3
+ export declare function getServiceNameFromCurrentDirPackage(logger: ILogger<any>): string;
4
+ export interface SwerveArgs extends IConfig {
5
+ services: KeyValue<IService>;
6
+ port: number;
7
+ appDataRoot?: string;
8
+ serviceArgs?: KeyValue<any>;
9
+ logLevel: string;
10
+ [key: string]: any;
11
+ }
12
+ export declare function getArgs(args: string[], logger: ILogger<any>): Promise<SwerveArgs>;
@@ -0,0 +1,208 @@
1
+ import path from "node:path";
2
+ import process from "node:process";
3
+ import { SwerveConfigParser } from "../config/config-parser.js";
4
+ import { deepMerge } from "@swizzyweb/swizzy-common";
5
+ import { getPackageJson } from "./getPackageJson.js";
6
+ function getHelpText() {
7
+ return `Help --
8
+ npm run server <serviceName> <port (optional)>
9
+ `;
10
+ }
11
+ export function getServiceNameFromCurrentDirPackage(logger) {
12
+ try {
13
+ return process.cwd();
14
+ }
15
+ catch (e) {
16
+ logger.debug(`Error getting package from current dir package.json ${e}`);
17
+ throw e;
18
+ }
19
+ }
20
+ function getAppDataRoot(appDataRootPath, logger) {
21
+ try {
22
+ let directory;
23
+ if (!appDataRootPath || appDataRootPath === ".") {
24
+ directory = getServiceNameFromCurrentDirPackage(logger);
25
+ }
26
+ else {
27
+ directory = appDataRootPath;
28
+ }
29
+ return directory;
30
+ }
31
+ catch (e) {
32
+ throw {
33
+ message: `Unable to get app data root ${appDataRootPath}`,
34
+ exception: e,
35
+ };
36
+ }
37
+ }
38
+ function getService(serviceName, logger) {
39
+ try {
40
+ let directory;
41
+ let packageJson;
42
+ if (!serviceName || serviceName === ".") {
43
+ directory = getServiceNameFromCurrentDirPackage(logger);
44
+ // packageJson = getPackageJsonFromDirectory(directory);
45
+ const packageResult = getPackageJson(directory);
46
+ packageJson = packageResult.packageJson;
47
+ directory = packageResult.servicePath;
48
+ }
49
+ else if (serviceName && serviceName.startsWith(".")) {
50
+ // directory = serviceName;
51
+ // const jsonPath = path.join(serviceName);
52
+ // packageJson = getPackageJsonFromDirectory(path.resolve(jsonPath));
53
+ const packageResult = getPackageJson(serviceName);
54
+ packageJson = packageResult.packageJson;
55
+ directory = packageResult.servicePath;
56
+ }
57
+ else {
58
+ return getPackageJson(serviceName);
59
+ }
60
+ const response = {
61
+ servicePath: directory,
62
+ packageJson,
63
+ };
64
+ logger.debug(`response ${response}`);
65
+ return response;
66
+ }
67
+ catch (e) {
68
+ const ex = {
69
+ message: "Error getting service name",
70
+ serviceName,
71
+ error: e,
72
+ };
73
+ throw ex;
74
+ }
75
+ }
76
+ function getDefaultArgs() {
77
+ let currentServiceName = undefined;
78
+ return {
79
+ logLevel: "info",
80
+ services: {},
81
+ port: 3005,
82
+ serviceArgs: {},
83
+ };
84
+ }
85
+ const ARG_PREFIX = "--";
86
+ const CONFIG_ARG_KEY = "config";
87
+ function cliArgToPropertyName(rawArg) {
88
+ return rawArg.replace(ARG_PREFIX, "");
89
+ }
90
+ const configParser = new SwerveConfigParser();
91
+ async function getConfigValuesFromPath(configPath, logger) {
92
+ try {
93
+ return await configParser.parse(configPath);
94
+ }
95
+ catch (e) {
96
+ logger.error(`Error occurred parsing config values from path`);
97
+ throw {
98
+ message: "Unexpected error occurred when attempting to read serviceConfiguration file",
99
+ configFilePath: configPath,
100
+ error: e,
101
+ };
102
+ }
103
+ }
104
+ const topLevelArgs = new Set();
105
+ topLevelArgs.add("port");
106
+ function isTopLevelArg(key) {
107
+ return topLevelArgs.has(key);
108
+ }
109
+ function tryParseNumberArg(val) {
110
+ try {
111
+ return parseInt(val);
112
+ }
113
+ catch (e) {
114
+ return false;
115
+ }
116
+ }
117
+ function parseArgValue(val, logger) {
118
+ try {
119
+ return JSON.parse(val);
120
+ }
121
+ catch (e) {
122
+ logger.warn(`Exception occurred while parsing arg value ${val}. This is sometimes expected. Error ${e}`);
123
+ }
124
+ return val;
125
+ }
126
+ const DEFAULT_PORT = 3005;
127
+ export async function getArgs(args, logger) {
128
+ let argKey = undefined;
129
+ let swerveArgs = getDefaultArgs();
130
+ let configFromFile;
131
+ const serviceCounts = new Map();
132
+ for (let i = 2; i < args.length; i++) {
133
+ const nextVal = args[i];
134
+ if (argKey) {
135
+ if (argKey == CONFIG_ARG_KEY) {
136
+ if (configFromFile) {
137
+ throw new Error(`Config file already specified, you can only specify one config file with the --config arg`);
138
+ }
139
+ configFromFile = await getConfigValuesFromPath(nextVal, logger);
140
+ argKey = undefined;
141
+ continue;
142
+ }
143
+ swerveArgs.serviceArgs[argKey] = parseArgValue(nextVal, logger);
144
+ argKey = undefined;
145
+ continue;
146
+ }
147
+ if (nextVal.startsWith(ARG_PREFIX)) {
148
+ argKey = cliArgToPropertyName(nextVal);
149
+ continue;
150
+ }
151
+ const serviceDetails = getService(nextVal, logger);
152
+ const serviceName = serviceDetails.packageJson.name;
153
+ const serviceIndex = serviceCounts.get(serviceName) ?? 0;
154
+ serviceCounts.set(serviceName, serviceIndex + 1);
155
+ swerveArgs.services[`${serviceDetails.packageJson.name}-${serviceIndex}`] =
156
+ {
157
+ serviceConfiguration: {},
158
+ ...serviceDetails,
159
+ };
160
+ }
161
+ swerveArgs.port =
162
+ configFromFile?.port ?? swerveArgs.serviceArgs?.port ?? DEFAULT_PORT;
163
+ logger.debug(`configFromFile ${configFromFile}`);
164
+ if (configFromFile?.services) {
165
+ logger.debug(`ConfigFromFile has service`);
166
+ for (const serviceEntry of Object.entries(configFromFile.services)) {
167
+ let { servicePath, packageName } = serviceEntry[1];
168
+ // serviceEntry[1].servicePath ?? serviceEntry[1].packageName;
169
+ if (!servicePath) {
170
+ serviceEntry[1].servicePath = packageName;
171
+ // throw new Error(
172
+ // `servicePath or packageName must be set in service configurations`,
173
+ // );
174
+ }
175
+ else {
176
+ const serviceData = getService(servicePath, logger);
177
+ serviceEntry[1].packageName = serviceData.packageJson?.name;
178
+ serviceEntry[1].servicePath = serviceData.servicePath;
179
+ }
180
+ // logger.debug(`ServiceName: ${}`);
181
+ swerveArgs.services[serviceEntry[0]] = await deepMerge(await deepMerge(swerveArgs.serviceArgs ?? {}, serviceEntry.values() ?? {}), configFromFile.services[serviceEntry[0]]);
182
+ }
183
+ logger.debug(`packagedConfigFromFile into services`);
184
+ }
185
+ swerveArgs = deepMerge(swerveArgs, configFromFile ?? {});
186
+ logger.debug(`${JSON.stringify(swerveArgs)}`);
187
+ if (swerveArgs.serviceArgs?.appDataRoot?.startsWith(".") ||
188
+ swerveArgs.serviceArgs?.appDataRoot == undefined) {
189
+ const appDataRootPath = path.join(process.cwd());
190
+ swerveArgs.appDataRoot = appDataRootPath;
191
+ swerveArgs.serviceArgs.appDataRoot = appDataRootPath;
192
+ }
193
+ else {
194
+ swerveArgs.appDataRoot = swerveArgs.serviceArgs.appDataRoot;
195
+ }
196
+ if (Object.keys(swerveArgs.services).length < 1) {
197
+ logger.info(`swerveArgs.services.length < 1`);
198
+ const { servicePath, packageJson } = getService(".", logger);
199
+ swerveArgs.services[packageJson.name] = {
200
+ servicePath,
201
+ packageJson,
202
+ appDataRoot: swerveArgs.appDataRoot,
203
+ ...swerveArgs.serviceArgs,
204
+ };
205
+ }
206
+ logger.debug(`getArgs complete with parsed swerveArgs: ${JSON.stringify(swerveArgs)}`);
207
+ return swerveArgs;
208
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Resolves the package.json file for a given package name or path.
3
+ * @param packageNameOrPath Package name (e.g., 'lodash', '@nestjs/core') or path (e.g., './node_modules/lodash')
4
+ * @returns Parsed package.json content or null
5
+ */
6
+ export declare function getPackageJson(packageNameOrPath: string): {
7
+ packageJson: Record<string, any>;
8
+ servicePath: string;
9
+ } | null;
10
+ /**
11
+ * Get the nearest package.json of a given import name.
12
+ * @param packageName The name of the imported package (e.g. "lodash")
13
+ */
14
+ export declare function getPackageJsonOrig(packageName: string): Record<string, any> | null;
@@ -0,0 +1,78 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath, pathToFileURL } from "node:url";
4
+ /**
5
+ * Determines whether the input string is a relative or absolute path.
6
+ */
7
+ function isPath(input) {
8
+ return input.startsWith(".") || path.isAbsolute(input);
9
+ }
10
+ /**
11
+ * Resolves the package.json file for a given package name or path.
12
+ * @param packageNameOrPath Package name (e.g., 'lodash', '@nestjs/core') or path (e.g., './node_modules/lodash')
13
+ * @returns Parsed package.json content or null
14
+ */
15
+ export function getPackageJson(packageNameOrPath) {
16
+ try {
17
+ // Step 1: Resolve to an absolute path
18
+ // const resolvedEntry = isPath(packageNameOrPath)
19
+ // ? require.resolve(path.resolve(packageNameOrPath))
20
+ // : // : require.resolve(packageNameOrPath);
21
+ // require.resolve(packageNameOrPath, { paths: [process.cwd()] });
22
+ const resolvedEntry = isPath(packageNameOrPath)
23
+ ? pathToFileURL(path.resolve(packageNameOrPath)).href
24
+ : import.meta.resolve(packageNameOrPath);
25
+ // Step 2: Traverse upward to find the nearest package.json
26
+ let dir = fileURLToPath(resolvedEntry); //path.dirname(resolvedEntry);
27
+ // console.log(dir);
28
+ while (dir !== path.parse(dir).root) {
29
+ const pkgPath = path.join(dir, "package.json");
30
+ if (fs.existsSync(pkgPath)) {
31
+ const content = fs.readFileSync(pkgPath, "utf-8");
32
+ const packageJson = JSON.parse(content);
33
+ if (!dir || dir === ".") {
34
+ dir = process.cwd();
35
+ }
36
+ else if (dir.startsWith(".")) {
37
+ dir = path.join(process.cwd(), dir);
38
+ }
39
+ // console.log(dir);
40
+ const entrypoint = path.join(dir, packageJson.main);
41
+ // console.log(entrypoint);
42
+ // console.error(`Entrypoint is ${entrypoint}`);
43
+ // throw `Entrypoint is ${entrypoint}`;
44
+ return { packageJson, servicePath: entrypoint };
45
+ }
46
+ dir = path.dirname(dir);
47
+ }
48
+ throw new Error(`Could not parse package.json`);
49
+ }
50
+ catch (err) {
51
+ throw new Error(`Could not resolve package.json for "${packageNameOrPath}"`);
52
+ }
53
+ }
54
+ /**
55
+ * Get the nearest package.json of a given import name.
56
+ * @param packageName The name of the imported package (e.g. "lodash")
57
+ */
58
+ export function getPackageJsonOrig(packageName) {
59
+ try {
60
+ // Resolve the entry file of the package
61
+ const entryPath = import.meta.resolve(packageName); //require.resolve(packageName);
62
+ // Traverse up from the resolved file to find package.json
63
+ let dir = path.dirname(entryPath);
64
+ while (dir !== path.parse(dir).root) {
65
+ const pkgPath = path.join(dir, "package.json");
66
+ if (fs.existsSync(pkgPath)) {
67
+ const content = fs.readFileSync(pkgPath, "utf8");
68
+ return { packageJson: JSON.parse(content), servicePath: dir };
69
+ }
70
+ dir = path.dirname(dir);
71
+ }
72
+ return null;
73
+ }
74
+ catch (error) {
75
+ //console.error(`Failed to resolve package "${packageName}":`, error);
76
+ return null;
77
+ }
78
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./getArgs.js";
2
+ export * from "./installWebservice.js";
@@ -0,0 +1,2 @@
1
+ export * from "./getArgs.js";
2
+ export * from "./installWebservice.js";
@@ -0,0 +1,4 @@
1
+ import { ILogger } from "@swizzyweb/swizzy-common";
2
+ export declare function installWebService(appName: string, importPathOrName: string, port: number, expressApp: any, serviceArgs: any, gLogger: ILogger<any>): Promise<any>;
3
+ export declare function getFullImportPath(importPathOrName: string): Promise<string>;
4
+ export declare function getLoggerForService(serviceArgs: any, appName: string, port: number, gLogger: ILogger<any>): ILogger<any>;