@yopdev/dev-server 1.1.3 → 1.1.6

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.
Files changed (43) hide show
  1. package/dist/{config.d.ts → src/config.d.ts} +2 -3
  2. package/dist/{dev-server.d.ts → src/dev-server.d.ts} +2 -2
  3. package/dist/{dev-server.js → src/dev-server.js} +6 -6
  4. package/dist/{index.d.ts → src/index.d.ts} +1 -0
  5. package/dist/{index.js → src/index.js} +3 -1
  6. package/dist/src/lazy.d.ts +3 -0
  7. package/dist/src/lazy.js +82 -0
  8. package/dist/{localstack.d.ts → src/localstack.d.ts} +2 -1
  9. package/dist/{localstack.js → src/localstack.js} +18 -12
  10. package/dist/{services.d.ts → src/services.d.ts} +1 -1
  11. package/package.json +13 -7
  12. /package/dist/{assert.d.ts → src/assert.d.ts} +0 -0
  13. /package/dist/{assert.js → src/assert.js} +0 -0
  14. /package/dist/{config.js → src/config.js} +0 -0
  15. /package/dist/{dynamodb.d.ts → src/dynamodb.d.ts} +0 -0
  16. /package/dist/{dynamodb.js → src/dynamodb.js} +0 -0
  17. /package/dist/{event-proxy.d.ts → src/event-proxy.d.ts} +0 -0
  18. /package/dist/{event-proxy.js → src/event-proxy.js} +0 -0
  19. /package/dist/{factories.d.ts → src/factories.d.ts} +0 -0
  20. /package/dist/{factories.js → src/factories.js} +0 -0
  21. /package/dist/{http-server.d.ts → src/http-server.d.ts} +0 -0
  22. /package/dist/{http-server.js → src/http-server.js} +0 -0
  23. /package/dist/{internal-queue.d.ts → src/internal-queue.d.ts} +0 -0
  24. /package/dist/{internal-queue.js → src/internal-queue.js} +0 -0
  25. /package/dist/{lambda-http-proxy.d.ts → src/lambda-http-proxy.d.ts} +0 -0
  26. /package/dist/{lambda-http-proxy.js → src/lambda-http-proxy.js} +0 -0
  27. /package/dist/{mappers.d.ts → src/mappers.d.ts} +0 -0
  28. /package/dist/{mappers.js → src/mappers.js} +0 -0
  29. /package/dist/{pre-traffic-hooks.d.ts → src/pre-traffic-hooks.d.ts} +0 -0
  30. /package/dist/{pre-traffic-hooks.js → src/pre-traffic-hooks.js} +0 -0
  31. /package/dist/{responses.d.ts → src/responses.d.ts} +0 -0
  32. /package/dist/{responses.js → src/responses.js} +0 -0
  33. /package/dist/{scheduled-tasks.d.ts → src/scheduled-tasks.d.ts} +0 -0
  34. /package/dist/{scheduled-tasks.js → src/scheduled-tasks.js} +0 -0
  35. /package/dist/{services.js → src/services.js} +0 -0
  36. /package/dist/{sns-http-proxy.d.ts → src/sns-http-proxy.d.ts} +0 -0
  37. /package/dist/{sns-http-proxy.js → src/sns-http-proxy.js} +0 -0
  38. /package/dist/{sns.d.ts → src/sns.d.ts} +0 -0
  39. /package/dist/{sns.js → src/sns.js} +0 -0
  40. /package/dist/{sqs.d.ts → src/sqs.d.ts} +0 -0
  41. /package/dist/{sqs.js → src/sqs.js} +0 -0
  42. /package/dist/{stoppable.d.ts → src/stoppable.d.ts} +0 -0
  43. /package/dist/{stoppable.js → src/stoppable.js} +0 -0
@@ -3,13 +3,12 @@ import { Sns } from "./sns";
3
3
  import { DynamoDb } from "./dynamodb";
4
4
  import { StartedNetwork } from "testcontainers";
5
5
  export type Config = {
6
- servicesPort?: number;
6
+ boundServicesPort?: number;
7
7
  localStackDockerImage?: string;
8
- useRandomPorts: boolean;
9
8
  localStateBindMount?: string;
10
9
  queueName?: string;
11
10
  topicName?: string;
12
- table?: string;
11
+ tableName?: string;
13
12
  };
14
13
  export type AwsConfig = {
15
14
  region: string;
@@ -2,14 +2,14 @@ import { Config } from "./config";
2
2
  import { Lifecycle, Service } from "./services";
3
3
  export declare class DevServer implements Lifecycle<DevServer> {
4
4
  readonly name: string;
5
- private readonly config;
6
5
  private readonly service;
6
+ private readonly config?;
7
7
  private readonly topicName;
8
8
  private readonly queueName;
9
9
  private readonly tableName;
10
10
  private LOGGER;
11
11
  private localStack;
12
- constructor(name: string, config: Config, service: Service<any>);
12
+ constructor(name: string, service: Service<any>, config?: Config);
13
13
  start: () => Promise<this>;
14
14
  stop: () => Promise<void>;
15
15
  }
@@ -8,16 +8,16 @@ var dynamodb_1 = require("./dynamodb");
8
8
  var logging_1 = require("@yopdev/logging");
9
9
  var sns_1 = require("./sns");
10
10
  var DevServer = /** @class */ (function () {
11
- function DevServer(name, config, service) {
11
+ function DevServer(name, service, config) {
12
12
  var _this = this;
13
13
  var _a, _b, _c;
14
14
  this.name = name;
15
- this.config = config;
16
15
  this.service = service;
16
+ this.config = config;
17
17
  this.start = function () {
18
18
  return Promise.resolve(new testcontainers_1.Network(new testcontainers_1.RandomUuid()).start())
19
19
  .then(function (network) { return ({
20
- localStack: _this.localStack = new localstack_1.LocalStack(_this.config, network),
20
+ localStack: _this.localStack = new localstack_1.LocalStack(network, _this.config),
21
21
  network: network
22
22
  }); })
23
23
  .then(function (infra) { return infra.localStack.start().then(function (config) { return ({
@@ -47,9 +47,9 @@ var DevServer = /** @class */ (function () {
47
47
  .then(function () { return _this.LOGGER.info('stopped'); }); };
48
48
  this.LOGGER = logging_1.LoggerFactory.create("DEVSERVER[".concat(name, "]"));
49
49
  var encodedName = Buffer.from(name).toString('hex').substring(0, 16);
50
- this.topicName = (_a = config.topicName) !== null && _a !== void 0 ? _a : "Topic".concat(encodedName);
51
- this.queueName = (_b = config.queueName) !== null && _b !== void 0 ? _b : "Queue".concat(encodedName);
52
- this.tableName = (_c = config.table) !== null && _c !== void 0 ? _c : "Table".concat(encodedName);
50
+ this.topicName = (_a = config === null || config === void 0 ? void 0 : config.topicName) !== null && _a !== void 0 ? _a : "Topic".concat(encodedName);
51
+ this.queueName = (_b = config === null || config === void 0 ? void 0 : config.queueName) !== null && _b !== void 0 ? _b : "Queue".concat(encodedName);
52
+ this.tableName = (_c = config === null || config === void 0 ? void 0 : config.tableName) !== null && _c !== void 0 ? _c : "Table".concat(encodedName);
53
53
  }
54
54
  return DevServer;
55
55
  }());
@@ -8,3 +8,4 @@ export { newScheduledTasks as scheduledTasks } from './scheduled-tasks';
8
8
  export { newPreTrafficHooks as preTrafficHooks } from './pre-traffic-hooks';
9
9
  export { newDynamoDbTable as dynamoDbTable } from './dynamodb';
10
10
  export { all as allOf, oneThenOther } from './factories';
11
+ export { lazy } from './lazy';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.oneThenOther = exports.allOf = exports.dynamoDbTable = exports.preTrafficHooks = exports.scheduledTasks = exports.eventsProxy = exports.internalQueue = exports.snsHttpProxy = exports.lambdaHttpProxy = exports.httpServer = exports.DevServer = void 0;
3
+ exports.lazy = exports.oneThenOther = exports.allOf = exports.dynamoDbTable = exports.preTrafficHooks = exports.scheduledTasks = exports.eventsProxy = exports.internalQueue = exports.snsHttpProxy = exports.lambdaHttpProxy = exports.httpServer = exports.DevServer = void 0;
4
4
  var dev_server_1 = require("./dev-server");
5
5
  Object.defineProperty(exports, "DevServer", { enumerable: true, get: function () { return dev_server_1.DevServer; } });
6
6
  var http_server_1 = require("./http-server");
@@ -22,3 +22,5 @@ Object.defineProperty(exports, "dynamoDbTable", { enumerable: true, get: functio
22
22
  var factories_1 = require("./factories");
23
23
  Object.defineProperty(exports, "allOf", { enumerable: true, get: function () { return factories_1.all; } });
24
24
  Object.defineProperty(exports, "oneThenOther", { enumerable: true, get: function () { return factories_1.oneThenOther; } });
25
+ var lazy_1 = require("./lazy");
26
+ Object.defineProperty(exports, "lazy", { enumerable: true, get: function () { return lazy_1.lazy; } });
@@ -0,0 +1,3 @@
1
+ import { DevServerConfig } from "./config";
2
+ import { Service } from "./services";
3
+ export declare const lazy: <I>(lifecycle: (config: DevServerConfig) => Service<I>) => Service<I>;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.lazy = void 0;
40
+ var crypto_1 = require("crypto");
41
+ var services_1 = require("./services");
42
+ var logging_1 = require("@yopdev/logging");
43
+ var lazy = function (lifecycle) { return new services_1.Service(new Lazy(lifecycle)); };
44
+ exports.lazy = lazy;
45
+ var Lazy = /** @class */ (function () {
46
+ function Lazy(configurable) {
47
+ var _this = this;
48
+ this.configurable = configurable;
49
+ this.stop = function () { return __awaiter(_this, void 0, void 0, function () {
50
+ var _this = this;
51
+ return __generator(this, function (_a) {
52
+ return [2 /*return*/, this.withStartedOr(function (s) { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
53
+ return [2 /*return*/, s.stop()];
54
+ }); }); }, function () { return __awaiter(_this, void 0, void 0, function () { return __generator(this, function (_a) {
55
+ return [2 /*return*/, Promise.reject(new Error('not started'))];
56
+ }); }); })];
57
+ });
58
+ }); };
59
+ this.started = undefined;
60
+ this.name = (0, crypto_1.randomUUID)();
61
+ this.LOGGER = logging_1.LoggerFactory.create("LAZY[".concat(this.name, "]"));
62
+ }
63
+ Lazy.prototype.start = function (config) {
64
+ return __awaiter(this, void 0, void 0, function () {
65
+ var local;
66
+ return __generator(this, function (_a) {
67
+ local = this.configurable(config);
68
+ this.started = local;
69
+ this.LOGGER.info('DISCOVERY:%s', local.name);
70
+ return [2 /*return*/, local.start(config)];
71
+ });
72
+ });
73
+ };
74
+ Lazy.prototype.withStartedOr = function (task, fallback) {
75
+ var local = this.started;
76
+ if (local !== undefined)
77
+ task(local);
78
+ else
79
+ fallback();
80
+ };
81
+ return Lazy;
82
+ }());
@@ -4,7 +4,8 @@ import { Stoppable } from "./services";
4
4
  export declare class LocalStack implements Stoppable {
5
5
  private readonly _start;
6
6
  private started;
7
- constructor(config: Config, network: StartedNetwork);
7
+ constructor(network: StartedNetwork, config?: Config);
8
+ private configOrDefaults;
8
9
  start: () => Promise<AwsConfig>;
9
10
  stop: () => Promise<void>;
10
11
  }
@@ -40,12 +40,12 @@ exports.LocalStack = void 0;
40
40
  var logging_1 = require("@yopdev/logging");
41
41
  var testcontainers_1 = require("testcontainers");
42
42
  var LOGGER = logging_1.LoggerFactory.create('LOCALSTACK');
43
- var DEFAULT_SERVICES_PORT = 4566;
43
+ var SERVICES_PORT = 4566;
44
44
  var NETWORK_ALIAS = 'localstack';
45
45
  var PROTOCOL = 'http';
46
46
  var DEFAULT_DOCKER_IMAGE = 'localstack/localstack:stable';
47
47
  var LocalStack = /** @class */ (function () {
48
- function LocalStack(config, network) {
48
+ function LocalStack(network, config) {
49
49
  var _this = this;
50
50
  this.start = function () { return __awaiter(_this, void 0, void 0, function () {
51
51
  return __generator(this, function (_a) {
@@ -63,9 +63,9 @@ var LocalStack = /** @class */ (function () {
63
63
  this.stop = function () { return Promise.resolve(_this.started)
64
64
  .then(function (container) { return container ? container.stop().then(function () { return 'stopped'; }) : 'not started'; })
65
65
  .then(function (status) { return LOGGER.info(status); }); };
66
- var servicesPort = config.servicesPort || DEFAULT_SERVICES_PORT;
67
- var container = new testcontainers_1.GenericContainer(config.localStackDockerImage || DEFAULT_DOCKER_IMAGE);
68
- var localStatePath = config.localStateBindMount;
66
+ var concreteConfig = this.configOrDefaults(config);
67
+ var container = new testcontainers_1.GenericContainer(concreteConfig.localStackDockerImage);
68
+ var localStatePath = concreteConfig.localStateBindMount;
69
69
  var withLocalState = localStatePath !== undefined ?
70
70
  container
71
71
  .withEnvironment({ PERSISTENCE: '1' })
@@ -76,20 +76,26 @@ var LocalStack = /** @class */ (function () {
76
76
  }])
77
77
  : container;
78
78
  var ready = withLocalState
79
- .withExposedPorts(config.useRandomPorts ?
80
- servicesPort :
81
- {
82
- container: servicesPort,
83
- host: servicesPort
84
- })
79
+ .withExposedPorts(concreteConfig.exposedPort)
85
80
  .withNetwork(network)
86
81
  .withNetworkAliases(NETWORK_ALIAS);
87
82
  this._start = function () { return ready
88
83
  .start()
89
84
  .then(function (container) { return _this.started = container; })
90
- .then(function (container) { return "".concat(PROTOCOL, "://").concat(container.getHost(), ":").concat(container.getMappedPort(servicesPort)); }); };
85
+ .then(function (container) { return "".concat(PROTOCOL, "://").concat(container.getHost(), ":").concat(container.getMappedPort(SERVICES_PORT)); }); };
91
86
  LOGGER.debug('initialized');
92
87
  }
88
+ LocalStack.prototype.configOrDefaults = function (config) {
89
+ var selectedServicesPort = config === null || config === void 0 ? void 0 : config.boundServicesPort;
90
+ var exposedPort = selectedServicesPort !== undefined ?
91
+ { container: SERVICES_PORT, host: selectedServicesPort } :
92
+ SERVICES_PORT;
93
+ return {
94
+ localStackDockerImage: (config === null || config === void 0 ? void 0 : config.localStackDockerImage) || DEFAULT_DOCKER_IMAGE,
95
+ exposedPort: exposedPort,
96
+ localStateBindMount: config === null || config === void 0 ? void 0 : config.localStateBindMount,
97
+ };
98
+ };
93
99
  return LocalStack;
94
100
  }());
95
101
  exports.LocalStack = LocalStack;
@@ -13,7 +13,7 @@ export declare class Service<I> implements Lifecycle<I> {
13
13
  readonly name: string;
14
14
  readonly start: (config: DevServerConfig) => Promise<I>;
15
15
  readonly stop: () => Promise<void>;
16
- private LOGGER;
16
+ private readonly LOGGER;
17
17
  constructor(service: Lifecycle<I>, callback?: Callback<I>);
18
18
  private callbackOrDefault;
19
19
  }
package/package.json CHANGED
@@ -1,28 +1,34 @@
1
1
  {
2
2
  "name": "@yopdev/dev-server",
3
- "version": "1.1.3",
3
+ "version": "1.1.6",
4
4
  "scripts": {
5
5
  "compile": "tsc",
6
+ "test": "jest",
6
7
  "clean": "rm -rf dist",
7
8
  "predistclean": "npm run clean",
8
9
  "distclean": "rm -rf node_modules"
9
10
  },
10
11
  "devDependencies": {
11
- "typescript": "^5.2.2"
12
+ "ts-jest": "^29.1.1",
13
+ "typescript": "^5.2.2",
14
+ "@types/aws-lambda": "8.10.114",
15
+ "@types/node": "^20.9.0"
12
16
  },
13
17
  "dependencies": {
14
18
  "@aws-sdk/client-dynamodb": "^3.451.0",
15
19
  "@aws-sdk/client-sns": "^3.451.0",
16
20
  "@aws-sdk/client-sqs": "^3.451.0",
17
- "@types/aws-lambda": "8.10.114",
18
- "@types/node": "^20.9.0",
19
21
  "@yopdev/logging": "^0.0.1",
20
22
  "sqs-consumer": "^7.4.0",
21
23
  "testcontainers": "^10.2.2"
22
24
  },
23
- "main": "dist/index.js",
24
- "types": "dist/index.d.ts",
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "github:blockademy/devserver"
28
+ },
29
+ "main": "dist/src/index.js",
30
+ "types": "dist/src/index.d.ts",
25
31
  "files": [
26
- "dist"
32
+ "dist/src"
27
33
  ]
28
34
  }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes