@ms-cloudpack/create-express-app 0.1.0 → 1.0.0

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/CHANGELOG.json CHANGED
@@ -2,7 +2,58 @@
2
2
  "name": "@ms-cloudpack/create-express-app",
3
3
  "entries": [
4
4
  {
5
- "date": "Fri, 20 May 2022 04:25:53 GMT",
5
+ "date": "Tue, 18 Oct 2022 08:15:52 GMT",
6
+ "tag": "@ms-cloudpack/create-express-app_v1.0.0",
7
+ "version": "1.0.0",
8
+ "comments": {
9
+ "major": [
10
+ {
11
+ "author": "dake.3601@gmail.com",
12
+ "package": "@ms-cloudpack/create-express-app",
13
+ "commit": "1bec1f80bb50ebe897f03dc74437c3e211bea83e",
14
+ "comment": "Https express app can be created with options and domain."
15
+ },
16
+ {
17
+ "author": "beachball",
18
+ "package": "@ms-cloudpack/create-express-app",
19
+ "comment": "Bump @ms-cloudpack/path-utilities to v1.1.0",
20
+ "commit": "1bec1f80bb50ebe897f03dc74437c3e211bea83e"
21
+ }
22
+ ]
23
+ }
24
+ },
25
+ {
26
+ "date": "Wed, 28 Sep 2022 08:15:16 GMT",
27
+ "tag": "@ms-cloudpack/create-express-app_v0.1.1",
28
+ "version": "0.1.1",
29
+ "comments": {
30
+ "patch": [
31
+ {
32
+ "author": "elcraig@microsoft.com",
33
+ "package": "@ms-cloudpack/create-express-app",
34
+ "commit": "084168500b6320d6861a4c7e8f363fea9e4f831e",
35
+ "comment": "Remove unnecessary await"
36
+ }
37
+ ]
38
+ }
39
+ },
40
+ {
41
+ "date": "Tue, 20 Sep 2022 08:13:46 GMT",
42
+ "tag": "@ms-cloudpack/create-express-app_v0.1.0",
43
+ "version": "0.1.0",
44
+ "comments": {
45
+ "none": [
46
+ {
47
+ "author": "email not defined",
48
+ "package": "@ms-cloudpack/create-express-app",
49
+ "commit": "f408318df04c9a3e4754975a28c39660abf32687",
50
+ "comment": "Update devDependency @types/express to v4.17.14"
51
+ }
52
+ ]
53
+ }
54
+ },
55
+ {
56
+ "date": "Fri, 20 May 2022 04:26:15 GMT",
6
57
  "tag": "@ms-cloudpack/create-express-app_v0.1.0",
7
58
  "version": "0.1.0",
8
59
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,29 @@
1
1
  # Change Log - @ms-cloudpack/create-express-app
2
2
 
3
- This log was last generated on Fri, 20 May 2022 04:25:53 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 18 Oct 2022 08:15:52 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## 1.0.0
8
+
9
+ Tue, 18 Oct 2022 08:15:52 GMT
10
+
11
+ ### Major changes
12
+
13
+ - Https express app can be created with options and domain. (dake.3601@gmail.com)
14
+ - Bump @ms-cloudpack/path-utilities to v1.1.0
15
+
16
+ ## 0.1.1
17
+
18
+ Wed, 28 Sep 2022 08:15:16 GMT
19
+
20
+ ### Patches
21
+
22
+ - Remove unnecessary await (elcraig@microsoft.com)
23
+
7
24
  ## 0.1.0
8
25
 
9
- Fri, 20 May 2022 04:25:53 GMT
26
+ Fri, 20 May 2022 04:26:15 GMT
10
27
 
11
28
  ### Minor changes
12
29
 
@@ -1,8 +1,16 @@
1
1
  /// <reference types="node" resolution-mode="require"/>
2
2
  import { type Express } from 'express';
3
3
  import type { Server } from 'http';
4
- export declare function createExpressApp(portRange: number[], setupCallback: (app: Express) => void): Promise<{
4
+ import type { HttpsConfig } from './parseHttpsConfig.js';
5
+ export declare function createExpressApp(options: {
6
+ portRange?: number | number[];
7
+ hostname?: string;
8
+ sslOptions?: HttpsConfig;
9
+ setupCallback?: (app: Express) => void;
10
+ }): Promise<{
5
11
  server: Server;
12
+ protocol: 'http' | 'https';
13
+ domain: string;
6
14
  port: number;
7
15
  }>;
8
16
  export type { Express };
@@ -1,8 +1,10 @@
1
- import express from 'express';
1
+ import express, {} from 'express';
2
+ import https from 'https';
2
3
  import cors from 'cors';
3
4
  import compression from 'compression';
4
5
  import getPort from 'get-port';
5
- export async function createExpressApp(portRange, setupCallback) {
6
+ export async function createExpressApp(options) {
7
+ const { setupCallback, hostname, sslOptions, portRange } = options;
6
8
  // Get the available port.
7
9
  const port = await getPort({
8
10
  port: portRange,
@@ -13,11 +15,24 @@ export async function createExpressApp(portRange, setupCallback) {
13
15
  // Use compression.
14
16
  app.use(compression());
15
17
  // Call setup callback with the app.
16
- await setupCallback(app);
17
- // Listen on port.
18
- const server = app.listen(port);
18
+ setupCallback?.(app);
19
+ const domain = hostname || 'localhost';
20
+ let server = undefined;
21
+ let protocol = 'http';
22
+ if (sslOptions && Object.keys(sslOptions).length !== 0) {
23
+ // Create an HTTPS server.
24
+ const httpsServer = https.createServer(sslOptions, app);
25
+ server = httpsServer.listen(port, domain);
26
+ protocol = 'https';
27
+ }
28
+ else {
29
+ // Create an HTTP server.
30
+ server = app.listen(port, domain);
31
+ }
19
32
  return {
20
33
  server,
34
+ protocol,
35
+ domain,
21
36
  port,
22
37
  };
23
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"createExpressApp.js","sourceRoot":"","sources":["../src/createExpressApp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAyB,MAAM,SAAS,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,OAAO,MAAM,UAAU,CAAC;AAG/B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,SAAmB,EACnB,aAAqC;IAKrC,0BAA0B;IAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;QACzB,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,YAAY;IACZ,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,mBAAmB;IACnB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvB,oCAAoC;IACpC,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IAEzB,kBAAkB;IAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO;QACL,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"createExpressApp.js","sourceRoot":"","sources":["../src/createExpressApp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,EAAE,EAAgB,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,OAAO,MAAM,UAAU,CAAC;AAI/B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAKtC;IAMC,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEnE,0BAA0B;IAC1B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC;QACzB,IAAI,EAAE,SAAS;KAChB,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;IAEtB,YAAY;IACZ,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IAEhB,mBAAmB;IACnB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;IAEvB,oCAAoC;IACpC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,QAAQ,IAAI,WAAW,CAAC;IACvC,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,IAAI,QAAQ,GAAqB,MAAM,CAAC;IAExC,IAAI,UAAU,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;QACtD,0BAA0B;QAC1B,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACxD,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,QAAQ,GAAG,OAAO,CAAC;KACpB;SAAM;QACL,yBAAyB;QACzB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KACnC;IAED,OAAO;QACL,MAAM;QACN,QAAQ;QACR,MAAM;QACN,IAAI;KACL,CAAC;AACJ,CAAC"}
package/lib/index.d.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createExpressApp } from './createExpressApp.js';
2
2
  export type { Express, Request, Response } from 'express';
3
+ export { parseHttpsConfig, type HttpsConfig } from './parseHttpsConfig.js';
package/lib/index.js CHANGED
@@ -1,2 +1,3 @@
1
1
  export { createExpressApp } from './createExpressApp.js';
2
+ export { parseHttpsConfig } from './parseHttpsConfig.js';
2
3
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,gBAAgB,EAAoB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import type { ServerOptions } from 'https';
4
+ import type { IncomingMessage, ServerResponse } from 'http';
5
+ export declare type HttpsConfig = ServerOptions<typeof IncomingMessage, typeof ServerResponse>;
6
+ export declare function parseHttpsConfig(config: HttpsConfig): HttpsConfig;
@@ -0,0 +1,26 @@
1
+ import fs from 'fs';
2
+ import { pathSymbolReplacement } from '@ms-cloudpack/path-utilities';
3
+ /*
4
+ * Read certificates files in Https Config and return the contents.
5
+ */
6
+ export function parseHttpsConfig(config) {
7
+ const sslOptions = {};
8
+ for (const [key, value] of Object.entries(config)) {
9
+ // Read the file contents for the certificates.
10
+ if (['ca', 'cert', 'key', 'pfx'].includes(key) && typeof value === 'string') {
11
+ const certFilePath = pathSymbolReplacement(value);
12
+ if (fs.existsSync(certFilePath)) {
13
+ sslOptions[key] = fs.readFileSync(certFilePath);
14
+ }
15
+ else {
16
+ throw 'Certificate file not found: ' + certFilePath;
17
+ }
18
+ }
19
+ else {
20
+ // If not a certificate, just use the value.
21
+ sslOptions[key] = value;
22
+ }
23
+ }
24
+ return sslOptions;
25
+ }
26
+ //# sourceMappingURL=parseHttpsConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseHttpsConfig.js","sourceRoot":"","sources":["../src/parseHttpsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAQrE;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,MAAM,UAAU,GAAyC,EAAE,CAAC;IAE5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QACjD,+CAA+C;QAC/C,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YAC3E,MAAM,YAAY,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;YAClD,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;gBAC/B,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;aACjD;iBAAM;gBACL,MAAM,8BAA8B,GAAG,YAAY,CAAC;aACrD;SACF;aAAM;YACL,4CAA4C;YAC5C,UAAU,CAAC,GAAG,CAAC,GAAyB,KAAK,CAAC;SAC/C;KACF;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,64 @@
1
+ import { afterEach, describe, it, expect } from '@jest/globals';
2
+ import { parseHttpsConfig } from './parseHttpsConfig.js';
3
+ import fs from 'fs';
4
+ import path from 'path';
5
+ import { createTestFileStructure } from '@ms-cloudpack/test-utilities';
6
+ const { rmdir } = fs.promises;
7
+ describe('parseHttpsConfig', () => {
8
+ let testPath;
9
+ afterEach(async () => {
10
+ if (testPath) {
11
+ await rmdir(testPath, { recursive: true });
12
+ testPath = undefined;
13
+ }
14
+ });
15
+ it('can read certs from file paths and keeps other properties', async () => {
16
+ const testPath = await createTestFileStructure({
17
+ 'certs/mock.ca': 'ca mock',
18
+ 'certs/mock.pfx': 'pfx mock',
19
+ 'certs/mock.key': 'key mock',
20
+ 'certs/mock.cert': 'cert mock',
21
+ });
22
+ const httpsConfig = {
23
+ ca: path.join(testPath, 'certs/mock.ca'),
24
+ pfx: path.join(testPath, 'certs/mock.pfx'),
25
+ key: path.join(testPath, 'certs/mock.key'),
26
+ cert: path.join(testPath, 'certs/mock.cert'),
27
+ passphrase: 'passphrase',
28
+ requestCert: true,
29
+ };
30
+ expect(parseHttpsConfig(httpsConfig)).toEqual({
31
+ ca: Buffer.from('ca mock', 'utf8'),
32
+ pfx: Buffer.from('pfx mock', 'utf8'),
33
+ key: Buffer.from('key mock', 'utf8'),
34
+ cert: Buffer.from('cert mock', 'utf8'),
35
+ passphrase: 'passphrase',
36
+ requestCert: true,
37
+ });
38
+ });
39
+ it('throws if cert file is not found', async () => {
40
+ const testPath = await createTestFileStructure({
41
+ 'certs/mock.ca': 'ca mock',
42
+ 'certs/undefined/mock.pfx': 'pfx mock',
43
+ 'certs/mock.key': 'key mock',
44
+ 'certs/mock.cert': 'cert mock',
45
+ });
46
+ const httpsConfig = {
47
+ ca: path.join(testPath, 'certs/mock.ca'),
48
+ pfx: path.join(testPath, 'certs/mock.pfx'),
49
+ key: path.join(testPath, 'certs/mock.key'),
50
+ cert: path.join(testPath, 'certs/mock.cert'),
51
+ passphrase: 'passphrase',
52
+ requestCert: true,
53
+ };
54
+ let error = false;
55
+ try {
56
+ parseHttpsConfig(httpsConfig);
57
+ }
58
+ catch (e) {
59
+ error = true;
60
+ }
61
+ expect(error).toEqual(true);
62
+ });
63
+ });
64
+ //# sourceMappingURL=parseHttpsConfig.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseHttpsConfig.test.js","sourceRoot":"","sources":["../src/parseHttpsConfig.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.33.1"
9
+ }
10
+ ]
11
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/create-express-app",
3
- "version": "0.1.0",
3
+ "version": "1.0.0",
4
4
  "description": "Helper for creating an express app server, abstracting a common plugin setup.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -13,6 +13,7 @@
13
13
  }
14
14
  },
15
15
  "dependencies": {
16
+ "@ms-cloudpack/path-utilities": "^1.1.0",
16
17
  "compression": "^1.7.4",
17
18
  "cors": "^2.8.5",
18
19
  "express": "^4.17.3",
@@ -23,7 +24,7 @@
23
24
  "@ms-cloudpack/eslint-config-base": "*",
24
25
  "@types/compression": "1.7.2",
25
26
  "@types/cors": "2.8.12",
26
- "@types/express": "4.17.13",
27
+ "@types/express": "4.17.14",
27
28
  "@types/get-port": "4.2.0"
28
29
  },
29
30
  "scripts": {
@@ -32,7 +33,10 @@
32
33
  "build:watch": "cloudpack-scripts build-watch",
33
34
  "build": "cloudpack-scripts build",
34
35
  "lint:update": "cloudpack-scripts lint-update",
35
- "lint": "cloudpack-scripts lint"
36
+ "lint": "cloudpack-scripts lint",
37
+ "test:update": "cloudpack-scripts test-update",
38
+ "test:watch": "cloudpack-scripts test-watch",
39
+ "test": "cloudpack-scripts test"
36
40
  },
37
41
  "files": [
38
42
  "/lib"