@fluidframework/fluid-runner 2.0.0-dev.2.3.0.115467 → 2.0.0-dev.3.1.0.125672
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/.eslintrc.js +11 -13
- package/.mocharc.js +2 -2
- package/README.md +23 -10
- package/dist/codeLoaderBundle.d.ts.map +1 -1
- package/dist/codeLoaderBundle.js +4 -2
- package/dist/codeLoaderBundle.js.map +1 -1
- package/dist/exportFile.d.ts.map +1 -1
- package/dist/exportFile.js +6 -3
- package/dist/exportFile.js.map +1 -1
- package/dist/fakeUrlResolver.d.ts.map +1 -1
- package/dist/fakeUrlResolver.js.map +1 -1
- package/dist/fluidRunner.d.ts.map +1 -1
- package/dist/fluidRunner.js +5 -6
- package/dist/fluidRunner.js.map +1 -1
- package/dist/getArgsValidationError.d.ts.map +1 -1
- package/dist/getArgsValidationError.js.map +1 -1
- package/dist/logger/baseFileLogger.d.ts.map +1 -1
- package/dist/logger/baseFileLogger.js.map +1 -1
- package/dist/logger/csvFileLogger.d.ts.map +1 -1
- package/dist/logger/csvFileLogger.js.map +1 -1
- package/dist/logger/fileLogger.d.ts.map +1 -1
- package/dist/logger/fileLogger.js.map +1 -1
- package/dist/logger/jsonFileLogger.d.ts.map +1 -1
- package/dist/logger/jsonFileLogger.js.map +1 -1
- package/dist/logger/loggerUtils.d.ts.map +1 -1
- package/dist/logger/loggerUtils.js +11 -3
- package/dist/logger/loggerUtils.js.map +1 -1
- package/dist/parseBundleAndExportFile.d.ts.map +1 -1
- package/dist/parseBundleAndExportFile.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +2 -3
- package/dist/utils.js.map +1 -1
- package/lib/codeLoaderBundle.d.ts.map +1 -1
- package/lib/codeLoaderBundle.js +4 -2
- package/lib/codeLoaderBundle.js.map +1 -1
- package/lib/exportFile.d.ts.map +1 -1
- package/lib/exportFile.js +6 -3
- package/lib/exportFile.js.map +1 -1
- package/lib/fakeUrlResolver.d.ts.map +1 -1
- package/lib/fakeUrlResolver.js.map +1 -1
- package/lib/fluidRunner.d.ts.map +1 -1
- package/lib/fluidRunner.js +5 -6
- package/lib/fluidRunner.js.map +1 -1
- package/lib/getArgsValidationError.d.ts.map +1 -1
- package/lib/getArgsValidationError.js.map +1 -1
- package/lib/logger/baseFileLogger.d.ts.map +1 -1
- package/lib/logger/baseFileLogger.js.map +1 -1
- package/lib/logger/csvFileLogger.d.ts.map +1 -1
- package/lib/logger/csvFileLogger.js.map +1 -1
- package/lib/logger/fileLogger.d.ts.map +1 -1
- package/lib/logger/fileLogger.js.map +1 -1
- package/lib/logger/jsonFileLogger.d.ts.map +1 -1
- package/lib/logger/jsonFileLogger.js.map +1 -1
- package/lib/logger/loggerUtils.d.ts.map +1 -1
- package/lib/logger/loggerUtils.js +11 -3
- package/lib/logger/loggerUtils.js.map +1 -1
- package/lib/parseBundleAndExportFile.d.ts.map +1 -1
- package/lib/parseBundleAndExportFile.js.map +1 -1
- package/lib/utils.d.ts.map +1 -1
- package/lib/utils.js +2 -3
- package/lib/utils.js.map +1 -1
- package/package.json +21 -19
- package/prettier.config.cjs +1 -1
- package/src/codeLoaderBundle.ts +28 -24
- package/src/exportFile.ts +69 -58
- package/src/fakeUrlResolver.ts +35 -31
- package/src/fluidRunner.ts +92 -85
- package/src/getArgsValidationError.ts +14 -17
- package/src/logger/baseFileLogger.ts +44 -44
- package/src/logger/csvFileLogger.ts +20 -20
- package/src/logger/fileLogger.ts +15 -15
- package/src/logger/jsonFileLogger.ts +12 -12
- package/src/logger/loggerUtils.ts +47 -39
- package/src/parseBundleAndExportFile.ts +58 -50
- package/src/utils.ts +14 -15
- package/tsconfig.esnext.json +6 -6
- package/tsconfig.json +10 -13
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fluidframework/fluid-runner",
|
|
3
|
-
"version": "2.0.0-dev.
|
|
3
|
+
"version": "2.0.0-dev.3.1.0.125672",
|
|
4
4
|
"description": "Utility for running various functionality inside a Fluid Framework environment",
|
|
5
5
|
"homepage": "https://fluidframework.com",
|
|
6
6
|
"repository": {
|
|
@@ -27,8 +27,8 @@
|
|
|
27
27
|
"eslint": "eslint --format stylish src",
|
|
28
28
|
"eslint:fix": "eslint --format stylish src --fix --fix-type problem,suggestion,layout",
|
|
29
29
|
"format": "npm run prettier:fix",
|
|
30
|
-
"lint": "npm run eslint",
|
|
31
|
-
"lint:fix": "npm run eslint:fix",
|
|
30
|
+
"lint": "npm run prettier && npm run eslint",
|
|
31
|
+
"lint:fix": "npm run prettier:fix && npm run eslint:fix",
|
|
32
32
|
"prettier": "prettier --check . --ignore-path ../../../.prettierignore",
|
|
33
33
|
"prettier:fix": "prettier --write . --ignore-path ../../../.prettierignore",
|
|
34
34
|
"test": "npm run test:mocha",
|
|
@@ -58,27 +58,28 @@
|
|
|
58
58
|
"temp-directory": "nyc/.nyc_output"
|
|
59
59
|
},
|
|
60
60
|
"dependencies": {
|
|
61
|
-
"@fluidframework/aqueduct": ">=2.0.0-dev.
|
|
61
|
+
"@fluidframework/aqueduct": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
62
62
|
"@fluidframework/common-definitions": "^0.20.1",
|
|
63
|
-
"@fluidframework/container-definitions": ">=2.0.0-dev.
|
|
64
|
-
"@fluidframework/container-loader": ">=2.0.0-dev.
|
|
65
|
-
"@fluidframework/core-interfaces": ">=2.0.0-dev.
|
|
66
|
-
"@fluidframework/driver-definitions": ">=2.0.0-dev.
|
|
67
|
-
"@fluidframework/odsp-driver": ">=2.0.0-dev.
|
|
68
|
-
"@fluidframework/odsp-driver-definitions": ">=2.0.0-dev.
|
|
69
|
-
"@fluidframework/telemetry-utils": ">=2.0.0-dev.
|
|
63
|
+
"@fluidframework/container-definitions": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
64
|
+
"@fluidframework/container-loader": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
65
|
+
"@fluidframework/core-interfaces": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
66
|
+
"@fluidframework/driver-definitions": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
67
|
+
"@fluidframework/odsp-driver": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
68
|
+
"@fluidframework/odsp-driver-definitions": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
69
|
+
"@fluidframework/telemetry-utils": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
70
70
|
"json2csv": "^5.0.7",
|
|
71
71
|
"yargs": "13.2.2"
|
|
72
72
|
},
|
|
73
73
|
"devDependencies": {
|
|
74
|
-
"@fluid-tools/build-cli": "^0.
|
|
74
|
+
"@fluid-tools/build-cli": "^0.8.0",
|
|
75
75
|
"@fluidframework/build-common": "^1.1.0",
|
|
76
|
-
"@fluidframework/eslint-config-fluid": "^
|
|
77
|
-
"@fluidframework/fluid-runner-previous": "npm:@fluidframework/fluid-runner@2.0.0-internal.
|
|
78
|
-
"@fluidframework/mocha-test-setup": ">=2.0.0-dev.
|
|
76
|
+
"@fluidframework/eslint-config-fluid": "^2.0.0",
|
|
77
|
+
"@fluidframework/fluid-runner-previous": "npm:@fluidframework/fluid-runner@2.0.0-internal.3.0.0",
|
|
78
|
+
"@fluidframework/mocha-test-setup": ">=2.0.0-dev.3.1.0.125672 <2.0.0-dev.4.0.0",
|
|
79
79
|
"@rushstack/eslint-config": "^2.5.1",
|
|
80
80
|
"@types/mocha": "^9.1.1",
|
|
81
|
-
"@types/node": "^14.18.
|
|
81
|
+
"@types/node": "^14.18.36",
|
|
82
|
+
"@types/yargs": "^13",
|
|
82
83
|
"concurrently": "^6.2.0",
|
|
83
84
|
"cross-env": "^7.0.2",
|
|
84
85
|
"eslint": "~8.6.0",
|
|
@@ -89,9 +90,10 @@
|
|
|
89
90
|
"typescript": "~4.5.5"
|
|
90
91
|
},
|
|
91
92
|
"typeValidation": {
|
|
92
|
-
"version": "2.0.0-internal.
|
|
93
|
-
"
|
|
94
|
-
"
|
|
93
|
+
"version": "2.0.0-internal.3.1.0",
|
|
94
|
+
"previousVersionStyle": "~previousMinor",
|
|
95
|
+
"baselineRange": ">=2.0.0-internal.3.0.0 <2.0.0-internal.3.1.0",
|
|
96
|
+
"baselineVersion": "2.0.0-internal.3.0.0",
|
|
95
97
|
"broken": {}
|
|
96
98
|
}
|
|
97
99
|
}
|
package/prettier.config.cjs
CHANGED
package/src/codeLoaderBundle.ts
CHANGED
|
@@ -12,33 +12,33 @@ import { FluidObject } from "@fluidframework/core-interfaces";
|
|
|
12
12
|
* For an example, see "src/test/sampleCodeLoaders/sampleCodeLoader.ts"
|
|
13
13
|
*/
|
|
14
14
|
export interface ICodeLoaderBundle {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
/**
|
|
16
|
+
* Fluid export of all the required objects and functions
|
|
17
|
+
*/
|
|
18
|
+
fluidExport: Promise<IFluidFileConverter>;
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
/**
|
|
22
22
|
* Instance that holds all the details for Fluid file conversion
|
|
23
23
|
*/
|
|
24
24
|
export interface IFluidFileConverter {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
/**
|
|
26
|
+
* Get code loader details to provide at Loader creation
|
|
27
|
+
* @param logger - created logger object to pass to code loader
|
|
28
|
+
*/
|
|
29
|
+
getCodeLoader(logger: ITelemetryBaseLogger): Promise<ICodeDetailsLoader>;
|
|
30
30
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Scope object to provide at Loader creation
|
|
33
|
+
*/
|
|
34
|
+
scope?: FluidObject;
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Executes code on container and returns the result
|
|
38
|
+
* @param container - container created by this application
|
|
39
|
+
* @param options - additional options
|
|
40
|
+
*/
|
|
41
|
+
execute(container: IContainer, options?: string): Promise<string>;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/**
|
|
@@ -46,12 +46,16 @@ export interface IFluidFileConverter {
|
|
|
46
46
|
* @param bundle - bundle provided to this application
|
|
47
47
|
*/
|
|
48
48
|
export function isCodeLoaderBundle(bundle: any): bundle is ICodeLoaderBundle {
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
50
|
+
return bundle?.fluidExport && typeof bundle.fluidExport === "object";
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
export function isFluidFileConverter(obj: any): obj is IFluidFileConverter {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
|
55
|
+
return (
|
|
56
|
+
obj?.getCodeLoader &&
|
|
57
|
+
typeof obj.getCodeLoader === "function" &&
|
|
58
|
+
obj.execute &&
|
|
59
|
+
typeof obj.execute === "function"
|
|
60
|
+
);
|
|
57
61
|
}
|
package/src/exportFile.ts
CHANGED
|
@@ -21,14 +21,14 @@ import { createLogger, getTelemetryFileValidationError } from "./logger/loggerUt
|
|
|
21
21
|
export type IExportFileResponse = IExportFileResponseSuccess | IExportFileResponseFailure;
|
|
22
22
|
|
|
23
23
|
interface IExportFileResponseSuccess {
|
|
24
|
-
|
|
24
|
+
success: true;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
interface IExportFileResponseFailure {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
28
|
+
success: false;
|
|
29
|
+
eventName: string;
|
|
30
|
+
errorMessage: string;
|
|
31
|
+
error?: any;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
const clientArgsValidationError = "Client_ArgsValidationError";
|
|
@@ -37,45 +37,52 @@ const clientArgsValidationError = "Client_ArgsValidationError";
|
|
|
37
37
|
* Execute code on Container based on ODSP snapshot and write result to file
|
|
38
38
|
*/
|
|
39
39
|
export async function exportFile(
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
40
|
+
fluidFileConverter: IFluidFileConverter,
|
|
41
|
+
inputFile: string,
|
|
42
|
+
outputFile: string,
|
|
43
|
+
telemetryFile: string,
|
|
44
|
+
options?: string,
|
|
45
|
+
telemetryOptions?: ITelemetryOptions,
|
|
46
46
|
): Promise<IExportFileResponse> {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
const telemetryArgError = getTelemetryFileValidationError(telemetryFile);
|
|
48
|
+
if (telemetryArgError) {
|
|
49
|
+
const eventName = clientArgsValidationError;
|
|
50
|
+
return { success: false, eventName, errorMessage: telemetryArgError };
|
|
51
|
+
}
|
|
52
|
+
const { fileLogger, logger } = createLogger(telemetryFile, telemetryOptions);
|
|
53
53
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
try {
|
|
55
|
+
return await PerformanceEvent.timedExecAsync(
|
|
56
|
+
logger,
|
|
57
|
+
{ eventName: "ExportFile" },
|
|
58
|
+
async () => {
|
|
59
|
+
const argsValidationError = getArgsValidationError(inputFile, outputFile);
|
|
60
|
+
if (argsValidationError) {
|
|
61
|
+
const eventName = clientArgsValidationError;
|
|
62
|
+
logger.sendErrorEvent({ eventName, message: argsValidationError });
|
|
63
|
+
return { success: false, eventName, errorMessage: argsValidationError };
|
|
64
|
+
}
|
|
62
65
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
66
|
+
fs.writeFileSync(
|
|
67
|
+
outputFile,
|
|
68
|
+
await createContainerAndExecute(
|
|
69
|
+
getSnapshotFileContent(inputFile),
|
|
70
|
+
fluidFileConverter,
|
|
71
|
+
logger,
|
|
72
|
+
options,
|
|
73
|
+
),
|
|
74
|
+
);
|
|
69
75
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
return { success: true };
|
|
77
|
+
},
|
|
78
|
+
);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
const eventName = "Client_UnexpectedError";
|
|
81
|
+
logger.sendErrorEvent({ eventName }, error);
|
|
82
|
+
return { success: false, eventName, errorMessage: "Unexpected error", error };
|
|
83
|
+
} finally {
|
|
84
|
+
await fileLogger.close();
|
|
85
|
+
}
|
|
79
86
|
}
|
|
80
87
|
|
|
81
88
|
/**
|
|
@@ -83,25 +90,29 @@ export async function exportFile(
|
|
|
83
90
|
* @returns result of execution
|
|
84
91
|
*/
|
|
85
92
|
export async function createContainerAndExecute(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
93
|
+
localOdspSnapshot: string | Uint8Array,
|
|
94
|
+
fluidFileConverter: IFluidFileConverter,
|
|
95
|
+
logger: ITelemetryLogger,
|
|
96
|
+
options?: string,
|
|
90
97
|
): Promise<string> {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
+
const loader = new Loader({
|
|
99
|
+
urlResolver: new FakeUrlResolver(),
|
|
100
|
+
documentServiceFactory: createLocalOdspDocumentServiceFactory(localOdspSnapshot),
|
|
101
|
+
codeLoader: await fluidFileConverter.getCodeLoader(logger),
|
|
102
|
+
scope: fluidFileConverter.scope,
|
|
103
|
+
logger,
|
|
104
|
+
});
|
|
98
105
|
|
|
99
|
-
|
|
100
|
-
|
|
106
|
+
const container = await loader.resolve({
|
|
107
|
+
url: "/fakeUrl/",
|
|
108
|
+
headers: {
|
|
109
|
+
[LoaderHeader.loadMode]: { opsBeforeReturn: "cached" },
|
|
110
|
+
},
|
|
111
|
+
});
|
|
101
112
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
113
|
+
return PerformanceEvent.timedExecAsync(logger, { eventName: "ExportFile" }, async () => {
|
|
114
|
+
const result = await fluidFileConverter.execute(container, options);
|
|
115
|
+
container.close();
|
|
116
|
+
return result;
|
|
117
|
+
});
|
|
107
118
|
}
|
package/src/fakeUrlResolver.ts
CHANGED
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { IRequest } from "@fluidframework/core-interfaces";
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
IContainerPackageInfo,
|
|
9
|
+
IResolvedUrl,
|
|
10
|
+
IUrlResolver,
|
|
11
|
+
} from "@fluidframework/driver-definitions";
|
|
8
12
|
import { IOdspResolvedUrl } from "@fluidframework/odsp-driver-definitions";
|
|
9
13
|
|
|
10
14
|
const fakeId = "FakeUrlResolver";
|
|
@@ -15,36 +19,36 @@ const fakeUrl = "/FakeUrlResolver/";
|
|
|
15
19
|
* @internal
|
|
16
20
|
*/
|
|
17
21
|
export class FakeUrlResolver implements IUrlResolver {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
22
|
+
public async resolve(_request: IRequest): Promise<IResolvedUrl | undefined> {
|
|
23
|
+
const fakeOdspResolvedUrl: IOdspResolvedUrl = {
|
|
24
|
+
type: "fluid",
|
|
25
|
+
odspResolvedUrl: true,
|
|
26
|
+
id: fakeId,
|
|
27
|
+
siteUrl: fakeUrl,
|
|
28
|
+
driveId: fakeId,
|
|
29
|
+
itemId: fakeId,
|
|
30
|
+
url: fakeUrl,
|
|
31
|
+
hashedDocumentId: fakeId,
|
|
32
|
+
endpoints: {
|
|
33
|
+
snapshotStorageUrl: fakeUrl,
|
|
34
|
+
attachmentPOSTStorageUrl: fakeUrl,
|
|
35
|
+
attachmentGETStorageUrl: fakeUrl,
|
|
36
|
+
deltaStorageUrl: fakeUrl,
|
|
37
|
+
},
|
|
38
|
+
tokens: {},
|
|
39
|
+
fileName: fakeId,
|
|
40
|
+
summarizer: false,
|
|
41
|
+
fileVersion: fakeId,
|
|
42
|
+
};
|
|
39
43
|
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
return fakeOdspResolvedUrl;
|
|
45
|
+
}
|
|
42
46
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
public async getAbsoluteUrl(
|
|
48
|
+
_resolvedUrl: IResolvedUrl,
|
|
49
|
+
_relativeUrl: string,
|
|
50
|
+
_packageInfoSource?: IContainerPackageInfo,
|
|
51
|
+
): Promise<string> {
|
|
52
|
+
return "";
|
|
53
|
+
}
|
|
50
54
|
}
|
package/src/fluidRunner.ts
CHANGED
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
/* eslint-disable max-len */
|
|
7
6
|
import * as yargs from "yargs";
|
|
8
7
|
import { exportFile } from "./exportFile";
|
|
9
8
|
import { IFluidFileConverter } from "./codeLoaderBundle";
|
|
@@ -16,90 +15,98 @@ import { validateCommandLineArgs } from "./utils";
|
|
|
16
15
|
* @param fluidFileConverter - needs to be provided if "codeLoaderBundle" is not and vice versa
|
|
17
16
|
*/
|
|
18
17
|
export function fluidRunner(fluidFileConverter?: IFluidFileConverter) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
19
|
+
yargs
|
|
20
|
+
.strict()
|
|
21
|
+
.version(false)
|
|
22
|
+
.command(
|
|
23
|
+
"exportFile",
|
|
24
|
+
"Generate an output for a local ODSP snapshot",
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-shadow
|
|
26
|
+
(yargs) =>
|
|
27
|
+
yargs
|
|
28
|
+
.option("codeLoader", {
|
|
29
|
+
describe:
|
|
30
|
+
'Path to code loader bundle. Required if this application is being called without modification.\nSee "README.md" for more details.',
|
|
31
|
+
type: "string",
|
|
32
|
+
demandOption: false,
|
|
33
|
+
})
|
|
34
|
+
.option("inputFile", {
|
|
35
|
+
describe: "Path to local ODSP snapshot",
|
|
36
|
+
type: "string",
|
|
37
|
+
demandOption: true,
|
|
38
|
+
})
|
|
39
|
+
.option("outputFile", {
|
|
40
|
+
describe:
|
|
41
|
+
"Path of output file (cannot already exist).\nExecution result will be written here",
|
|
42
|
+
type: "string",
|
|
43
|
+
demandOption: true,
|
|
44
|
+
})
|
|
45
|
+
.option("telemetryFile", {
|
|
46
|
+
describe:
|
|
47
|
+
"Path of telemetry file for config and session data (cannot already exist)",
|
|
48
|
+
type: "string",
|
|
49
|
+
demandOption: true,
|
|
50
|
+
})
|
|
51
|
+
.option("options", {
|
|
52
|
+
describe: "Additional options passed to container on execution",
|
|
53
|
+
type: "string",
|
|
54
|
+
demandOption: false,
|
|
55
|
+
})
|
|
56
|
+
.option("telemetryFormat", {
|
|
57
|
+
describe:
|
|
58
|
+
'Output format for telemetry. Current options are: ["JSON", "CSV"]',
|
|
59
|
+
type: "string",
|
|
60
|
+
demandOption: false,
|
|
61
|
+
default: "JSON",
|
|
62
|
+
})
|
|
63
|
+
.option("telemetryProp", {
|
|
64
|
+
describe:
|
|
65
|
+
'Property to add to every telemetry entry. Formatted like "--telemetryProp prop1 value1 --telemetryProp prop2 \\"value 2\\"".',
|
|
66
|
+
type: "array",
|
|
67
|
+
demandOption: false,
|
|
68
|
+
}),
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
|
|
70
|
+
async (argv) => {
|
|
71
|
+
const argsError = validateCommandLineArgs(argv.codeLoader, fluidFileConverter);
|
|
72
|
+
if (argsError) {
|
|
73
|
+
console.error(argsError);
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const telemetryOptionsResult = validateAndParseTelemetryOptions(
|
|
77
|
+
argv.telemetryFormat,
|
|
78
|
+
argv.telemetryProp,
|
|
79
|
+
);
|
|
80
|
+
if (!telemetryOptionsResult.success) {
|
|
81
|
+
console.error(telemetryOptionsResult.error);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
77
84
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
85
|
+
const result = await (argv.codeLoader
|
|
86
|
+
? parseBundleAndExportFile(
|
|
87
|
+
argv.codeLoader,
|
|
88
|
+
argv.inputFile,
|
|
89
|
+
argv.outputFile,
|
|
90
|
+
argv.telemetryFile,
|
|
91
|
+
argv.options,
|
|
92
|
+
telemetryOptionsResult.telemetryOptions,
|
|
93
|
+
)
|
|
94
|
+
: exportFile(
|
|
95
|
+
fluidFileConverter!,
|
|
96
|
+
argv.inputFile,
|
|
97
|
+
argv.outputFile,
|
|
98
|
+
argv.telemetryFile,
|
|
99
|
+
argv.options,
|
|
100
|
+
telemetryOptionsResult.telemetryOptions,
|
|
101
|
+
));
|
|
94
102
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
103
|
+
if (!result.success) {
|
|
104
|
+
console.error(`${result.eventName}: ${result.errorMessage}`);
|
|
105
|
+
process.exit(1);
|
|
106
|
+
}
|
|
107
|
+
process.exit(0);
|
|
108
|
+
},
|
|
109
|
+
)
|
|
110
|
+
.help()
|
|
111
|
+
.demandCommand().argv;
|
|
104
112
|
}
|
|
105
|
-
/* eslint-enable max-len */
|
|
@@ -5,23 +5,20 @@
|
|
|
5
5
|
|
|
6
6
|
import * as fs from "fs";
|
|
7
7
|
|
|
8
|
-
export function getArgsValidationError(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
} else if (!fs.existsSync(inputFile)) {
|
|
16
|
-
return "Input file does not exist.";
|
|
17
|
-
}
|
|
8
|
+
export function getArgsValidationError(inputFile: string, outputFile: string): string | undefined {
|
|
9
|
+
// Validate input file
|
|
10
|
+
if (!inputFile) {
|
|
11
|
+
return "Input file name argument is missing.";
|
|
12
|
+
} else if (!fs.existsSync(inputFile)) {
|
|
13
|
+
return "Input file does not exist.";
|
|
14
|
+
}
|
|
18
15
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
16
|
+
// Validate output file
|
|
17
|
+
if (!outputFile) {
|
|
18
|
+
return "Output file argument is missing.";
|
|
19
|
+
} else if (fs.existsSync(outputFile)) {
|
|
20
|
+
return `Output file already exists [${outputFile}].`;
|
|
21
|
+
}
|
|
25
22
|
|
|
26
|
-
|
|
23
|
+
return undefined;
|
|
27
24
|
}
|