@furystack/rest-service 7.0.3 → 7.0.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"static-server-manager.d.ts","sourceRoot":"","sources":["../src/static-server-manager.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAkB,MAAM,MAAM,CAAA;AAKhF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B;AAED,qBACa,mBAAmB;IAE9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;YAEhC,QAAQ;IAuBf,UAAU,YACL,MAAM;aACC,KAAK,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC;kBAK7C;IAEb,OAAO,CAAC,SAAS,CA0BhB;IAEY,aAAa,CAAC,OAAO,EAAE,mBAAmB;CAQxD"}
1
+ {"version":3,"file":"static-server-manager.d.ts","sourceRoot":"","sources":["../src/static-server-manager.ts"],"names":[],"mappings":";AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAkB,MAAM,MAAM,CAAA;AAKhF,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAA;CAC9B;AAED,qBACa,mBAAmB;IAE9B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;YAEhC,QAAQ;IAwBf,UAAU,YACL,MAAM;aACC,KAAK,eAAe,EAAE,KAAK,GAAG,QAAQ,CAAC;kBAK7C;IAEb,OAAO,CAAC,SAAS,CA0BhB;IAEY,aAAa,CAAC,OAAO,EAAE,mBAAmB;CAQxD"}
@@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  };
10
10
  import { Injectable, Injected } from '@furystack/inject';
11
11
  import { createReadStream } from 'fs';
12
- import { stat } from 'fs/promises';
12
+ import { access, stat } from 'fs/promises';
13
13
  import { getMimeForFile } from './mime-types.js';
14
14
  import { join, normalize, sep } from 'path';
15
15
  import { ServerManager } from './server-manager.js';
@@ -29,7 +29,7 @@ let StaticServerManager = class StaticServerManager {
29
29
  }
30
30
  catch (error) {
31
31
  if (fallback) {
32
- await this.sendFile({ fullPath: join(path, fallback), res, headers });
32
+ await this.sendFile({ fullPath: normalize(join(path, fallback)), res, headers });
33
33
  }
34
34
  else {
35
35
  res.writeHead(404, { 'Content-Type': 'text/plain' });
@@ -41,12 +41,13 @@ let StaticServerManager = class StaticServerManager {
41
41
  }
42
42
  async sendFile({ fullPath, headers, res, }) {
43
43
  const { size } = await stat(fullPath);
44
+ await access(fullPath);
44
45
  const head = {
45
46
  ...headers,
46
47
  'Content-Length': size,
47
48
  'Content-Type': getMimeForFile(fullPath),
48
49
  };
49
- res.writeHead(200, head);
50
+ Object.entries(head).map(([key, value]) => res.setHeader(key, value));
50
51
  await new Promise((resolve, reject) => createReadStream(fullPath, { autoClose: true }).once('finish', resolve).once('error', reject).pipe(res));
51
52
  }
52
53
  async addStaticSite(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"static-server-manager.js","sourceRoot":"","sources":["../src/static-server-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"static-server-manager.js","sourceRoot":"","sources":["../src/static-server-manager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/rest-service",
3
- "version": "7.0.3",
3
+ "version": "7.0.4",
4
4
  "description": "Repository implementation for FuryStack",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -37,22 +37,22 @@
37
37
  },
38
38
  "homepage": "https://github.com/furystack/furystack",
39
39
  "dependencies": {
40
- "@furystack/core": "^12.0.2",
41
- "@furystack/inject": "^8.0.2",
42
- "@furystack/repository": "^7.0.2",
43
- "@furystack/rest": "^5.0.2",
44
- "@furystack/security": "^3.0.2",
45
- "@furystack/utils": "^4.0.2",
40
+ "@furystack/core": "^12.0.3",
41
+ "@furystack/inject": "^8.0.3",
42
+ "@furystack/repository": "^7.0.3",
43
+ "@furystack/rest": "^5.0.3",
44
+ "@furystack/security": "^3.0.3",
45
+ "@furystack/utils": "^4.0.3",
46
46
  "ajv": "^8.12.0",
47
47
  "ajv-formats": "^2.1.1",
48
48
  "path-to-regexp": "^6.2.1",
49
49
  "semaphore-async-await": "^1.5.1"
50
50
  },
51
51
  "devDependencies": {
52
- "@furystack/rest-client-fetch": "^5.0.2",
53
- "@types/node": "^18.16.2",
52
+ "@furystack/rest-client-fetch": "^5.0.3",
53
+ "@types/node": "^20.1.3",
54
54
  "typescript": "^5.0.4",
55
- "vitest": "^0.30.1"
55
+ "vitest": "^0.31.0"
56
56
  },
57
57
  "gitHead": "1045d854bfd8c475b7035471d130d401417a2321"
58
58
  }
@@ -27,11 +27,21 @@ interface IntegrationTestApi extends RestApi {
27
27
  }
28
28
  }
29
29
 
30
- const port = 19090
31
- const hostName = 'localhost'
32
- const root = 'test-api'
30
+ const portGenerator = function* () {
31
+ const initialPort = 19090
32
+ let port = initialPort
33
+ while (true) {
34
+ yield port++
35
+ }
36
+ }
37
+
38
+ const getPort = () => portGenerator().next().value
33
39
 
34
40
  const prepareInjector = async (i: Injector) => {
41
+ const port = getPort()
42
+ const hostName = 'localhost'
43
+ const root = 'test-api'
44
+
35
45
  addStore(i, new InMemoryStore({ model: User, primaryKey: 'username' })).addStore(
36
46
  new InMemoryStore({ model: DefaultSession, primaryKey: 'sessionId' }),
37
47
  )
@@ -42,7 +52,7 @@ const prepareInjector = async (i: Injector) => {
42
52
  await useRestService<IntegrationTestApi>({
43
53
  injector: i,
44
54
  root,
45
- port,
55
+ port: getPort(),
46
56
  hostName,
47
57
  cors: {
48
58
  credentials: true,
@@ -67,9 +77,13 @@ const prepareInjector = async (i: Injector) => {
67
77
  },
68
78
  },
69
79
  })
70
- }
71
80
 
72
- const apiUrl = PathHelper.joinPaths(`http://${hostName}:${port}`, root)
81
+ return {
82
+ apiUrl: `http://${hostName}:${port}/${root}`,
83
+ port,
84
+ hostName,
85
+ }
86
+ }
73
87
 
74
88
  describe('@furystack/rest-service inregration tests', () => {
75
89
  it('Should be started and disposed', async () => {
@@ -80,7 +94,7 @@ describe('@furystack/rest-service inregration tests', () => {
80
94
 
81
95
  it('Should respond with 404 when a route is not found', async () => {
82
96
  await usingAsync(new Injector(), async (i) => {
83
- await prepareInjector(i)
97
+ const { apiUrl } = await prepareInjector(i)
84
98
  const result = await fetch(PathHelper.joinPaths(apiUrl, 'some-route-that-does-not-exists'))
85
99
  expect(result.ok).toBe(false)
86
100
  expect(result.status).toBe(404)
@@ -91,7 +105,7 @@ describe('@furystack/rest-service inregration tests', () => {
91
105
 
92
106
  it('Should respond with 401 for unauthorized request errors', async () => {
93
107
  await usingAsync(new Injector(), async (i) => {
94
- await prepareInjector(i)
108
+ const { apiUrl } = await prepareInjector(i)
95
109
  const result = await fetch(PathHelper.joinPaths(apiUrl, 'currentUser'))
96
110
  expect(result.ok).toBe(false)
97
111
  expect(result.status).toBe(401)
@@ -102,7 +116,7 @@ describe('@furystack/rest-service inregration tests', () => {
102
116
 
103
117
  it('Should respond with 401 for unauthorized request errors', async () => {
104
118
  await usingAsync(new Injector(), async (i) => {
105
- await prepareInjector(i)
119
+ const { apiUrl } = await prepareInjector(i)
106
120
  const result = await fetch(PathHelper.joinPaths(apiUrl, 'currentUser'))
107
121
  expect(result.ok).toBe(false)
108
122
  expect(result.status).toBe(401)
@@ -113,7 +127,7 @@ describe('@furystack/rest-service inregration tests', () => {
113
127
 
114
128
  it('Should respond with the correct result body', async () => {
115
129
  await usingAsync(new Injector(), async (i) => {
116
- await prepareInjector(i)
130
+ const { apiUrl } = await prepareInjector(i)
117
131
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'isAuthenticated'))
118
132
  expect(response.status).toBe(200)
119
133
  const result = await response.json()
@@ -123,7 +137,8 @@ describe('@furystack/rest-service inregration tests', () => {
123
137
 
124
138
  it('Should be able to read query parameters', async () => {
125
139
  await usingAsync(new Injector(), async (i) => {
126
- await prepareInjector(i)
140
+ const { apiUrl } = await prepareInjector(i)
141
+
127
142
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testQuery?param1=foo'))
128
143
  expect(response.status).toBe(200)
129
144
  const result = await response.json()
@@ -133,7 +148,8 @@ describe('@furystack/rest-service inregration tests', () => {
133
148
 
134
149
  it('Should be able to read url parameters', async () => {
135
150
  await usingAsync(new Injector(), async (i) => {
136
- await prepareInjector(i)
151
+ const { apiUrl } = await prepareInjector(i)
152
+
137
153
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testUrlParams/bar'))
138
154
  expect(response.status).toBe(200)
139
155
  const result = await response.json()
@@ -143,7 +159,8 @@ describe('@furystack/rest-service inregration tests', () => {
143
159
 
144
160
  it('Should be able to read post body', async () => {
145
161
  await usingAsync(new Injector(), async (i) => {
146
- await prepareInjector(i)
162
+ const { apiUrl } = await prepareInjector(i)
163
+
147
164
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), {
148
165
  method: 'POST',
149
166
  body: JSON.stringify({ value: 'baz' }),
@@ -156,7 +173,8 @@ describe('@furystack/rest-service inregration tests', () => {
156
173
 
157
174
  it('Should respond with OK to OPTIONS requests', async () => {
158
175
  await usingAsync(new Injector(), async (i) => {
159
- await prepareInjector(i)
176
+ const { apiUrl } = await prepareInjector(i)
177
+
160
178
  const response = await fetch(PathHelper.joinPaths(apiUrl, 'testPostBody'), {
161
179
  method: 'OPTIONS',
162
180
  })
@@ -166,7 +184,7 @@ describe('@furystack/rest-service inregration tests', () => {
166
184
 
167
185
  it('Should reject requests outside of the API Root', async () => {
168
186
  await usingAsync(new Injector(), async (i) => {
169
- await prepareInjector(i)
187
+ const { hostName, port } = await prepareInjector(i)
170
188
  await expect(fetch(PathHelper.joinPaths(`http://${hostName}:${port}`, 'not-my-api-root'))).rejects.toThrowError(
171
189
  'fetch failed',
172
190
  )
@@ -1,6 +1,6 @@
1
1
  import { Injectable, Injected } from '@furystack/inject'
2
2
  import { createReadStream } from 'fs'
3
- import { stat } from 'fs/promises'
3
+ import { access, stat } from 'fs/promises'
4
4
  import type { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from 'http'
5
5
  import { getMimeForFile } from './mime-types.js'
6
6
  import { join, normalize, sep } from 'path'
@@ -31,13 +31,14 @@ export class StaticServerManager {
31
31
  }) {
32
32
  const { size } = await stat(fullPath)
33
33
 
34
+ await access(fullPath)
35
+
34
36
  const head = {
35
37
  ...headers,
36
38
  'Content-Length': size,
37
39
  'Content-Type': getMimeForFile(fullPath),
38
40
  }
39
-
40
- res.writeHead(200, head)
41
+ Object.entries(head).map(([key, value]) => res.setHeader(key, value))
41
42
  await new Promise<void>((resolve, reject) =>
42
43
  createReadStream(fullPath, { autoClose: true }).once('finish', resolve).once('error', reject).pipe(res),
43
44
  )
@@ -71,7 +72,7 @@ export class StaticServerManager {
71
72
  await this.sendFile({ fullPath, res, headers })
72
73
  } catch (error) {
73
74
  if (fallback) {
74
- await this.sendFile({ fullPath: join(path, fallback), res, headers })
75
+ await this.sendFile({ fullPath: normalize(join(path, fallback)), res, headers })
75
76
  } else {
76
77
  res.writeHead(404, { 'Content-Type': 'text/plain' })
77
78
  res.end('Not found')
@@ -5,10 +5,11 @@ import { JsonResult } from './request-action-implementation'
5
5
  import { Validate } from './validate'
6
6
  import './helpers'
7
7
 
8
- import schema from './validate.integration.spec.schema.json'
8
+ import schema from './validate.integration.spec.schema.json' assert { type: 'json' }
9
9
  import type { ValidationApi } from './validate.integration.schema'
10
10
  import { useRestService } from './helpers'
11
11
  import { describe, it, expect } from 'vitest'
12
+ import { assert } from 'console'
12
13
 
13
14
  // To recreate: yarn ts-json-schema-generator -f tsconfig.json --no-type-check -p packages/rest-service/src/validate.integration.schema.ts -o packages/rest-service/src/validate.integration.spec.schema.json
14
15