@ms-cloudpack/create-express-app 0.1.1 → 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,28 @@
2
2
  "name": "@ms-cloudpack/create-express-app",
3
3
  "entries": [
4
4
  {
5
- "date": "Wed, 28 Sep 2022 08:14:45 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",
6
27
  "tag": "@ms-cloudpack/create-express-app_v0.1.1",
7
28
  "version": "0.1.1",
8
29
  "comments": {
package/CHANGELOG.md CHANGED
@@ -1,12 +1,21 @@
1
1
  # Change Log - @ms-cloudpack/create-express-app
2
2
 
3
- This log was last generated on Wed, 28 Sep 2022 08:14:45 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
+
7
16
  ## 0.1.1
8
17
 
9
- Wed, 28 Sep 2022 08:14:45 GMT
18
+ Wed, 28 Sep 2022 08:15:16 GMT
10
19
 
11
20
  ### Patches
12
21
 
@@ -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
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
- 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,OAAO,EAAE,EAAgB,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,aAAa,CAAC,GAAG,CAAC,CAAC;IAEnB,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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"}
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.31.2"
8
+ "packageVersion": "7.33.1"
9
9
  }
10
10
  ]
11
11
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ms-cloudpack/create-express-app",
3
- "version": "0.1.1",
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",
@@ -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"