@walkeros/server-destination-aws 4.7.0-next-1790722899482 → 4.7.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.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # @walkeros/server-destination-aws
2
2
 
3
- ## 4.7.0-next-1790722899482
3
+ ## 4.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 786a860: AWS destinations now deliver in bundled flows without extra setup.
8
+ Firehose batches by default, ends records with a newline (`newline: false`
9
+ turns it off), sends mapped `data` and accepts `config.credentials`. Rejected
10
+ records now count as failed. SNS works with `topicArn` alone and no longer
11
+ creates topics at start. `walkeros setup` resolves `$secret` values; partial
12
+ batch failures log their causes.
13
+ - 64b06de: Packages with several exports, such as the GCP and AWS sources and
14
+ destinations, now publish a settings schema per export. `walkeros validate`
15
+ and MCP `package_get` use the schema of the export a step imports. Pub/Sub,
16
+ BigQuery, SNS and SQS steps pinned to this release or later are checked
17
+ instead of skipped; older pins still report a skip.
4
18
 
5
19
  ### Patch Changes
6
20
 
@@ -18,6 +32,8 @@
18
32
  - Updated dependencies [74821ed]
19
33
  - Updated dependencies [06b498a]
20
34
  - Updated dependencies [74821ed]
35
+ - Updated dependencies [64b06de]
36
+ - Updated dependencies [4b4937f]
21
37
  - Updated dependencies [74821ed]
22
38
  - Updated dependencies [74821ed]
23
39
  - Updated dependencies [74821ed]
@@ -27,10 +43,12 @@
27
43
  - Updated dependencies [74821ed]
28
44
  - Updated dependencies [74821ed]
29
45
  - Updated dependencies [74821ed]
46
+ - Updated dependencies [e860006]
30
47
  - Updated dependencies [74821ed]
31
48
  - Updated dependencies [74821ed]
32
- - @walkeros/core@4.7.0-next-1790722899482
33
- - @walkeros/server-core@4.7.0-next-1790722899482
49
+ - Updated dependencies [4f89234]
50
+ - @walkeros/core@4.7.0
51
+ - @walkeros/server-core@4.7.0
34
52
 
35
53
  ## 4.6.1
36
54
 
package/README.md CHANGED
@@ -6,7 +6,8 @@
6
6
 
7
7
  # @walkeros/server-destination-aws
8
8
 
9
- Stream events to Amazon Kinesis Data Firehose for real-time analytics.
9
+ Stream events to Amazon Data Firehose, or publish them to Amazon SNS topics,
10
+ from a walkerOS server flow.
10
11
 
11
12
  [Documentation](https://www.walkeros.io/docs/destinations/server/aws) •
12
13
  [NPM Package](https://www.npmjs.com/package/@walkeros/server-destination-aws)
@@ -28,17 +29,29 @@ npm install @walkeros/server-destination-aws
28
29
  "default": {
29
30
  "config": { "platform": "server" },
30
31
  "destinations": {
31
- "aws": { "package": "@walkeros/server-destination-aws", "config": {} }
32
+ "firehose": {
33
+ "package": "@walkeros/server-destination-aws",
34
+ "import": "destinationFirehose",
35
+ "config": {
36
+ "settings": { "streamName": "walkeros-events" }
37
+ }
38
+ }
32
39
  }
33
40
  }
34
41
  }
35
42
  }
36
43
  ```
37
44
 
45
+ On AWS compute in the stream's region, that is the whole configuration. Add
46
+ `settings.region` for a stream elsewhere, and `config.credentials` with
47
+ `$secret` references when the flow runs outside AWS. For SNS, import
48
+ `destinationSNS` and set `settings.topicArn`.
49
+
38
50
  ## Documentation
39
51
 
40
52
  Full configuration, mapping, and examples live in the docs:
41
- **https://www.walkeros.io/docs/destinations/server/aws**
53
+ **https://www.walkeros.io/docs/destinations/server/aws** (Firehose) and
54
+ **https://www.walkeros.io/docs/destinations/server/sns** (SNS)
42
55
 
43
56
  ## Contribute
44
57
 
package/dist/dev.d.mts CHANGED
@@ -1,37 +1,32 @@
1
1
  import * as _walkeros_core_dev from '@walkeros/core/dev';
2
2
  import { DestinationServer } from '@walkeros/server-core';
3
3
  import { FirehoseClientConfig, PutRecordBatchCommandInput } from '@aws-sdk/client-firehose';
4
- import { Flow } from '@walkeros/core';
4
+ import { Flow, Hint } from '@walkeros/core';
5
5
  import { SNSClientConfig, CreateTopicCommandInput, PublishCommandInput, GetTopicAttributesCommandInput, SubscribeCommandInput } from '@aws-sdk/client-sns';
6
6
  import { STSClientConfig, GetCallerIdentityCommandInput } from '@aws-sdk/client-sts';
7
7
 
8
- declare const settings$1: _walkeros_core_dev.JSONSchema;
9
- declare const mapping$1: _walkeros_core_dev.JSONSchema;
10
- declare const firehose: _walkeros_core_dev.JSONSchema;
11
-
12
- declare const settings: _walkeros_core_dev.JSONSchema;
13
- declare const mapping: _walkeros_core_dev.JSONSchema;
14
- declare const setup: _walkeros_core_dev.JSONSchema;
15
-
16
- declare const schemas_firehose: typeof firehose;
17
- declare namespace schemas {
18
- export { schemas_firehose as firehose, mapping$1 as firehoseMapping, settings$1 as firehoseSettings, mapping$1 as mapping, settings$1 as settings, mapping as snsMapping, settings as snsSettings, setup as snsSetup };
19
- }
20
-
21
8
  /**
22
- * The part of an AWS SDK v3 client this destination calls: `send` with a
23
- * command. `FirehoseClient` satisfies it, and so does an injected mock (tests,
24
- * simulate) without a cast.
9
+ * The part of an AWS SDK v3 client this package calls: `send` with a command,
10
+ * and `destroy` on a client it created. The SDK clients satisfy it, and so
11
+ * does an injected mock (tests, simulate) without a cast.
25
12
  */
26
- interface SendClient$1 {
13
+ interface SendClient {
27
14
  send(command: object): Promise<unknown>;
15
+ destroy?(): void;
28
16
  }
17
+
18
+ type FirehoseClientConstructor = new (config: FirehoseClientConfig) => SendClient;
19
+ type PutRecordBatchCommandConstructor = new (input: PutRecordBatchCommandInput) => {
20
+ readonly input: PutRecordBatchCommandInput;
21
+ };
22
+ /**
23
+ * Optional SDK overrides. Each one present wins over the SDK the package
24
+ * imports; tests and simulate inject mocks here.
25
+ */
29
26
  interface Env$1 extends DestinationServer.Env {
30
- AWS: {
31
- FirehoseClient: new (config: FirehoseClientConfig) => SendClient$1;
32
- PutRecordBatchCommand: new (input: PutRecordBatchCommandInput) => {
33
- readonly input: PutRecordBatchCommandInput;
34
- };
27
+ AWS?: {
28
+ FirehoseClient?: FirehoseClientConstructor;
29
+ PutRecordBatchCommand?: PutRecordBatchCommandConstructor;
35
30
  };
36
31
  }
37
32
 
@@ -43,50 +38,45 @@ declare namespace env$1 {
43
38
  }
44
39
 
45
40
  /**
46
- * Default firehose push -- client.send(new PutRecordBatchCommand({...}))
47
- * Records contain the full event JSON-stringified as Buffer Data.
41
+ * The copy-paste config: the stream, its region, and keys from `$secret`.
42
+ * `init` builds one client from it, offline, with a per-attempt timeout of a
43
+ * quarter of the collector's 10 s race, so the SDK's three attempts end
44
+ * before the collector stops waiting.
48
45
  */
46
+ declare const init$1: Flow.StepExample;
49
47
  declare const firehoseRecord: Flow.StepExample;
50
- /**
51
- * Order event -- same pattern, full event serialized in Records[0].Data.
52
- */
53
48
  declare const orderEvent$1: Flow.StepExample;
54
- /**
55
- * User signup -- full event including user fields is serialized to Firehose.
56
- */
57
49
  declare const userSignupEvent: Flow.StepExample;
50
+ declare const mappedRecord: Flow.StepExample;
58
51
 
59
52
  declare const step$1_firehoseRecord: typeof firehoseRecord;
53
+ declare const step$1_mappedRecord: typeof mappedRecord;
60
54
  declare const step$1_userSignupEvent: typeof userSignupEvent;
61
55
  declare namespace step$1 {
62
- export { step$1_firehoseRecord as firehoseRecord, orderEvent$1 as orderEvent, step$1_userSignupEvent as userSignupEvent };
56
+ export { step$1_firehoseRecord as firehoseRecord, init$1 as init, step$1_mappedRecord as mappedRecord, orderEvent$1 as orderEvent, step$1_userSignupEvent as userSignupEvent };
63
57
  }
64
58
 
65
59
  declare namespace firehoseExamplesNs {
66
60
  export { env$1 as env, step$1 as step };
67
61
  }
68
62
 
69
- /**
70
- * The part of an AWS SDK v3 client this destination calls: `send` with a
71
- * command. `SNSClient` and `STSClient` satisfy it, and so does an injected
72
- * mock (tests, simulate) without a cast.
73
- */
74
- interface SendClient {
75
- send(command: object): Promise<unknown>;
76
- }
77
63
  /** An AWS SDK v3 command class, as far as this destination builds one. */
78
64
  type CommandConstructor<Input> = new (input: Input) => {
79
65
  readonly input: Input;
80
66
  };
67
+ /**
68
+ * Optional SDK overrides. Each one present wins over the SDK the package
69
+ * imports; tests and simulate inject mocks here.
70
+ */
81
71
  interface Env extends DestinationServer.Env {
82
- AWS: {
83
- SNSClient: new (config: SNSClientConfig) => SendClient;
84
- CreateTopicCommand: CommandConstructor<CreateTopicCommandInput>;
85
- PublishCommand: CommandConstructor<PublishCommandInput>;
86
- GetTopicAttributesCommand: CommandConstructor<GetTopicAttributesCommandInput>;
87
- SubscribeCommand: CommandConstructor<SubscribeCommandInput>;
88
- STSClient: new (config: STSClientConfig) => SendClient;
89
- GetCallerIdentityCommand: CommandConstructor<GetCallerIdentityCommandInput>;
72
+ AWS?: {
73
+ SNSClient?: new (config: SNSClientConfig) => SendClient;
74
+ CreateTopicCommand?: CommandConstructor<CreateTopicCommandInput>;
75
+ PublishCommand?: CommandConstructor<PublishCommandInput>;
76
+ GetTopicAttributesCommand?: CommandConstructor<GetTopicAttributesCommandInput>;
77
+ SubscribeCommand?: CommandConstructor<SubscribeCommandInput>;
78
+ STSClient?: new (config: STSClientConfig) => SendClient;
79
+ GetCallerIdentityCommand?: CommandConstructor<GetCallerIdentityCommandInput>;
90
80
  };
91
81
  }
92
82
 
@@ -100,15 +90,24 @@ declare namespace env {
100
90
  export { env_push as push, env_simulation as simulation };
101
91
  }
102
92
 
93
+ /**
94
+ * The copy-paste config: the topic ARN, which also names the region, and
95
+ * keys from `$secret`. `init` builds one client from it, offline; nothing is
96
+ * sent until the first event.
97
+ */
98
+ declare const init: Flow.StepExample;
103
99
  declare const pageView: Flow.StepExample;
104
100
  declare const orderEvent: Flow.StepExample;
105
101
  declare const attributedPublish: Flow.StepExample;
102
+ declare const mappedMessage: Flow.StepExample;
106
103
 
107
104
  declare const step_attributedPublish: typeof attributedPublish;
105
+ declare const step_init: typeof init;
106
+ declare const step_mappedMessage: typeof mappedMessage;
108
107
  declare const step_orderEvent: typeof orderEvent;
109
108
  declare const step_pageView: typeof pageView;
110
109
  declare namespace step {
111
- export { step_attributedPublish as attributedPublish, step_orderEvent as orderEvent, step_pageView as pageView };
110
+ export { step_attributedPublish as attributedPublish, step_init as init, step_mappedMessage as mappedMessage, step_orderEvent as orderEvent, step_pageView as pageView };
112
111
  }
113
112
 
114
113
  declare const snsExamplesNs_env: typeof env;
@@ -117,14 +116,41 @@ declare namespace snsExamplesNs {
117
116
  export { snsExamplesNs_env as env, snsExamplesNs_step as step };
118
117
  }
119
118
 
119
+ declare const settings$1: _walkeros_core_dev.JSONSchema;
120
+ declare const mapping$1: _walkeros_core_dev.JSONSchema;
121
+ declare const firehose: _walkeros_core_dev.JSONSchema;
122
+
123
+ declare const settings: _walkeros_core_dev.JSONSchema;
124
+ declare const mapping: _walkeros_core_dev.JSONSchema;
125
+ declare const setup: _walkeros_core_dev.JSONSchema;
126
+
127
+ declare const schemas_firehose: typeof firehose;
128
+ declare namespace schemas {
129
+ export { schemas_firehose as firehose, mapping$1 as firehoseMapping, settings$1 as firehoseSettings, mapping$1 as mapping, settings$1 as settings, mapping as snsMapping, settings as snsSettings, setup as snsSetup };
130
+ }
131
+
120
132
  declare namespace index {
121
133
  export { env$1 as env, firehoseExamplesNs as firehose, snsExamplesNs as sns, step$1 as step };
122
134
  }
123
135
 
136
+ declare const hints: Hint.Hints;
137
+
124
138
  /** Dev examples per export, keyed by the export names in package.json. */
125
139
  declare const exportExamples: {
126
140
  destinationFirehose: typeof firehoseExamplesNs;
127
141
  destinationSNS: typeof snsExamplesNs;
128
142
  };
143
+ /** Schemas per export, keyed by the export names in package.json. */
144
+ declare const exportSchemas: {
145
+ destinationFirehose: {
146
+ settings: _walkeros_core_dev.JSONSchema;
147
+ mapping: _walkeros_core_dev.JSONSchema;
148
+ };
149
+ destinationSNS: {
150
+ settings: _walkeros_core_dev.JSONSchema;
151
+ mapping: _walkeros_core_dev.JSONSchema;
152
+ setup: _walkeros_core_dev.JSONSchema;
153
+ };
154
+ };
129
155
 
130
- export { index as examples, exportExamples, schemas };
156
+ export { index as examples, exportExamples, exportSchemas, hints, schemas };
package/dist/dev.d.ts CHANGED
@@ -1,37 +1,32 @@
1
1
  import * as _walkeros_core_dev from '@walkeros/core/dev';
2
2
  import { DestinationServer } from '@walkeros/server-core';
3
3
  import { FirehoseClientConfig, PutRecordBatchCommandInput } from '@aws-sdk/client-firehose';
4
- import { Flow } from '@walkeros/core';
4
+ import { Flow, Hint } from '@walkeros/core';
5
5
  import { SNSClientConfig, CreateTopicCommandInput, PublishCommandInput, GetTopicAttributesCommandInput, SubscribeCommandInput } from '@aws-sdk/client-sns';
6
6
  import { STSClientConfig, GetCallerIdentityCommandInput } from '@aws-sdk/client-sts';
7
7
 
8
- declare const settings$1: _walkeros_core_dev.JSONSchema;
9
- declare const mapping$1: _walkeros_core_dev.JSONSchema;
10
- declare const firehose: _walkeros_core_dev.JSONSchema;
11
-
12
- declare const settings: _walkeros_core_dev.JSONSchema;
13
- declare const mapping: _walkeros_core_dev.JSONSchema;
14
- declare const setup: _walkeros_core_dev.JSONSchema;
15
-
16
- declare const schemas_firehose: typeof firehose;
17
- declare namespace schemas {
18
- export { schemas_firehose as firehose, mapping$1 as firehoseMapping, settings$1 as firehoseSettings, mapping$1 as mapping, settings$1 as settings, mapping as snsMapping, settings as snsSettings, setup as snsSetup };
19
- }
20
-
21
8
  /**
22
- * The part of an AWS SDK v3 client this destination calls: `send` with a
23
- * command. `FirehoseClient` satisfies it, and so does an injected mock (tests,
24
- * simulate) without a cast.
9
+ * The part of an AWS SDK v3 client this package calls: `send` with a command,
10
+ * and `destroy` on a client it created. The SDK clients satisfy it, and so
11
+ * does an injected mock (tests, simulate) without a cast.
25
12
  */
26
- interface SendClient$1 {
13
+ interface SendClient {
27
14
  send(command: object): Promise<unknown>;
15
+ destroy?(): void;
28
16
  }
17
+
18
+ type FirehoseClientConstructor = new (config: FirehoseClientConfig) => SendClient;
19
+ type PutRecordBatchCommandConstructor = new (input: PutRecordBatchCommandInput) => {
20
+ readonly input: PutRecordBatchCommandInput;
21
+ };
22
+ /**
23
+ * Optional SDK overrides. Each one present wins over the SDK the package
24
+ * imports; tests and simulate inject mocks here.
25
+ */
29
26
  interface Env$1 extends DestinationServer.Env {
30
- AWS: {
31
- FirehoseClient: new (config: FirehoseClientConfig) => SendClient$1;
32
- PutRecordBatchCommand: new (input: PutRecordBatchCommandInput) => {
33
- readonly input: PutRecordBatchCommandInput;
34
- };
27
+ AWS?: {
28
+ FirehoseClient?: FirehoseClientConstructor;
29
+ PutRecordBatchCommand?: PutRecordBatchCommandConstructor;
35
30
  };
36
31
  }
37
32
 
@@ -43,50 +38,45 @@ declare namespace env$1 {
43
38
  }
44
39
 
45
40
  /**
46
- * Default firehose push -- client.send(new PutRecordBatchCommand({...}))
47
- * Records contain the full event JSON-stringified as Buffer Data.
41
+ * The copy-paste config: the stream, its region, and keys from `$secret`.
42
+ * `init` builds one client from it, offline, with a per-attempt timeout of a
43
+ * quarter of the collector's 10 s race, so the SDK's three attempts end
44
+ * before the collector stops waiting.
48
45
  */
46
+ declare const init$1: Flow.StepExample;
49
47
  declare const firehoseRecord: Flow.StepExample;
50
- /**
51
- * Order event -- same pattern, full event serialized in Records[0].Data.
52
- */
53
48
  declare const orderEvent$1: Flow.StepExample;
54
- /**
55
- * User signup -- full event including user fields is serialized to Firehose.
56
- */
57
49
  declare const userSignupEvent: Flow.StepExample;
50
+ declare const mappedRecord: Flow.StepExample;
58
51
 
59
52
  declare const step$1_firehoseRecord: typeof firehoseRecord;
53
+ declare const step$1_mappedRecord: typeof mappedRecord;
60
54
  declare const step$1_userSignupEvent: typeof userSignupEvent;
61
55
  declare namespace step$1 {
62
- export { step$1_firehoseRecord as firehoseRecord, orderEvent$1 as orderEvent, step$1_userSignupEvent as userSignupEvent };
56
+ export { step$1_firehoseRecord as firehoseRecord, init$1 as init, step$1_mappedRecord as mappedRecord, orderEvent$1 as orderEvent, step$1_userSignupEvent as userSignupEvent };
63
57
  }
64
58
 
65
59
  declare namespace firehoseExamplesNs {
66
60
  export { env$1 as env, step$1 as step };
67
61
  }
68
62
 
69
- /**
70
- * The part of an AWS SDK v3 client this destination calls: `send` with a
71
- * command. `SNSClient` and `STSClient` satisfy it, and so does an injected
72
- * mock (tests, simulate) without a cast.
73
- */
74
- interface SendClient {
75
- send(command: object): Promise<unknown>;
76
- }
77
63
  /** An AWS SDK v3 command class, as far as this destination builds one. */
78
64
  type CommandConstructor<Input> = new (input: Input) => {
79
65
  readonly input: Input;
80
66
  };
67
+ /**
68
+ * Optional SDK overrides. Each one present wins over the SDK the package
69
+ * imports; tests and simulate inject mocks here.
70
+ */
81
71
  interface Env extends DestinationServer.Env {
82
- AWS: {
83
- SNSClient: new (config: SNSClientConfig) => SendClient;
84
- CreateTopicCommand: CommandConstructor<CreateTopicCommandInput>;
85
- PublishCommand: CommandConstructor<PublishCommandInput>;
86
- GetTopicAttributesCommand: CommandConstructor<GetTopicAttributesCommandInput>;
87
- SubscribeCommand: CommandConstructor<SubscribeCommandInput>;
88
- STSClient: new (config: STSClientConfig) => SendClient;
89
- GetCallerIdentityCommand: CommandConstructor<GetCallerIdentityCommandInput>;
72
+ AWS?: {
73
+ SNSClient?: new (config: SNSClientConfig) => SendClient;
74
+ CreateTopicCommand?: CommandConstructor<CreateTopicCommandInput>;
75
+ PublishCommand?: CommandConstructor<PublishCommandInput>;
76
+ GetTopicAttributesCommand?: CommandConstructor<GetTopicAttributesCommandInput>;
77
+ SubscribeCommand?: CommandConstructor<SubscribeCommandInput>;
78
+ STSClient?: new (config: STSClientConfig) => SendClient;
79
+ GetCallerIdentityCommand?: CommandConstructor<GetCallerIdentityCommandInput>;
90
80
  };
91
81
  }
92
82
 
@@ -100,15 +90,24 @@ declare namespace env {
100
90
  export { env_push as push, env_simulation as simulation };
101
91
  }
102
92
 
93
+ /**
94
+ * The copy-paste config: the topic ARN, which also names the region, and
95
+ * keys from `$secret`. `init` builds one client from it, offline; nothing is
96
+ * sent until the first event.
97
+ */
98
+ declare const init: Flow.StepExample;
103
99
  declare const pageView: Flow.StepExample;
104
100
  declare const orderEvent: Flow.StepExample;
105
101
  declare const attributedPublish: Flow.StepExample;
102
+ declare const mappedMessage: Flow.StepExample;
106
103
 
107
104
  declare const step_attributedPublish: typeof attributedPublish;
105
+ declare const step_init: typeof init;
106
+ declare const step_mappedMessage: typeof mappedMessage;
108
107
  declare const step_orderEvent: typeof orderEvent;
109
108
  declare const step_pageView: typeof pageView;
110
109
  declare namespace step {
111
- export { step_attributedPublish as attributedPublish, step_orderEvent as orderEvent, step_pageView as pageView };
110
+ export { step_attributedPublish as attributedPublish, step_init as init, step_mappedMessage as mappedMessage, step_orderEvent as orderEvent, step_pageView as pageView };
112
111
  }
113
112
 
114
113
  declare const snsExamplesNs_env: typeof env;
@@ -117,14 +116,41 @@ declare namespace snsExamplesNs {
117
116
  export { snsExamplesNs_env as env, snsExamplesNs_step as step };
118
117
  }
119
118
 
119
+ declare const settings$1: _walkeros_core_dev.JSONSchema;
120
+ declare const mapping$1: _walkeros_core_dev.JSONSchema;
121
+ declare const firehose: _walkeros_core_dev.JSONSchema;
122
+
123
+ declare const settings: _walkeros_core_dev.JSONSchema;
124
+ declare const mapping: _walkeros_core_dev.JSONSchema;
125
+ declare const setup: _walkeros_core_dev.JSONSchema;
126
+
127
+ declare const schemas_firehose: typeof firehose;
128
+ declare namespace schemas {
129
+ export { schemas_firehose as firehose, mapping$1 as firehoseMapping, settings$1 as firehoseSettings, mapping$1 as mapping, settings$1 as settings, mapping as snsMapping, settings as snsSettings, setup as snsSetup };
130
+ }
131
+
120
132
  declare namespace index {
121
133
  export { env$1 as env, firehoseExamplesNs as firehose, snsExamplesNs as sns, step$1 as step };
122
134
  }
123
135
 
136
+ declare const hints: Hint.Hints;
137
+
124
138
  /** Dev examples per export, keyed by the export names in package.json. */
125
139
  declare const exportExamples: {
126
140
  destinationFirehose: typeof firehoseExamplesNs;
127
141
  destinationSNS: typeof snsExamplesNs;
128
142
  };
143
+ /** Schemas per export, keyed by the export names in package.json. */
144
+ declare const exportSchemas: {
145
+ destinationFirehose: {
146
+ settings: _walkeros_core_dev.JSONSchema;
147
+ mapping: _walkeros_core_dev.JSONSchema;
148
+ };
149
+ destinationSNS: {
150
+ settings: _walkeros_core_dev.JSONSchema;
151
+ mapping: _walkeros_core_dev.JSONSchema;
152
+ setup: _walkeros_core_dev.JSONSchema;
153
+ };
154
+ };
129
155
 
130
- export { index as examples, exportExamples, schemas };
156
+ export { index as examples, exportExamples, exportSchemas, hints, schemas };
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,r=Object.getOwnPropertyDescriptor,s=Object.getOwnPropertyNames,i=Object.prototype.hasOwnProperty,n=(e,r)=>{for(var s in r)t(e,s,{get:r[s],enumerable:!0})},a={};n(a,{examples:()=>N,exportExamples:()=>re,schemas:()=>o}),module.exports=(e=a,((e,n,a,o)=>{if(n&&"object"==typeof n||"function"==typeof n)for(let l of s(n))i.call(e,l)||l===a||t(e,l,{get:()=>n[l],enumerable:!(o=r(n,l))||o.enumerable});return e})(t({},"__esModule",{value:!0}),e));var o={};n(o,{firehose:()=>v,firehoseMapping:()=>g,firehoseSettings:()=>m,mapping:()=>g,settings:()=>m,snsMapping:()=>A,snsSettings:()=>T,snsSetup:()=>C});var l=require("@walkeros/core/dev"),p=require("@walkeros/core/dev"),c=p.z.object({streamName:p.z.string().min(1).describe("Name of the Kinesis Data Firehose delivery stream (like walker-events)"),client:p.z.any().describe("Pre-configured AWS Firehose client instance (like new FirehoseClient(config))").optional(),region:p.z.string().describe("AWS region for the Firehose service (like us-east-1)").optional(),config:p.z.any().describe("AWS SDK client configuration options (like { credentials: awsCredentials })").optional()}),d=p.z.object({firehose:c.describe("AWS Firehose configuration settings (like { streamName: 'walker-events', region: 'us-east-1' })").optional()}),u=require("@walkeros/core/dev").z.object({}),m=(0,l.zodToSchema)(d),g=(0,l.zodToSchema)(u),v=(0,l.zodToSchema)(c),S=require("@walkeros/core/dev"),f=require("@walkeros/core/dev"),h=f.z.object({topicName:f.z.string().min(1).describe("SNS topic name (like walkeros-events). Required."),region:f.z.string().describe("AWS region (like eu-central-1).").optional(),client:f.z.any().describe("Pre-configured AWS SNSClient instance.").optional(),config:f.z.any().describe("AWS SDK SNSClient configuration options.").optional(),topicArn:f.z.string().describe("Topic ARN. Populated by init() from CreateTopic. Operators may pre-set to skip the runtime CreateTopic call.").optional()}),b=require("@walkeros/core/dev"),y=b.z.object({messageAttributes:b.z.record(b.z.string(),b.z.unknown()).optional(),messageGroupId:b.z.unknown().optional(),messageDeduplicationId:b.z.unknown().optional()}),w=require("@walkeros/core/dev"),z=w.z.object({protocol:w.z.enum(["sqs","lambda","https","http","email","sms"]),endpoint:w.z.string().min(1),rawMessageDelivery:w.z.boolean().optional(),filterPolicy:w.z.record(w.z.string(),w.z.unknown()).optional(),deadLetterTargetArn:w.z.string().optional()}),k=w.z.object({region:w.z.string().optional(),displayName:w.z.string().optional(),fifoTopic:w.z.boolean().optional(),kmsMasterKeyId:w.z.string().optional(),tags:w.z.record(w.z.string(),w.z.string()).optional(),subscriptions:w.z.array(z).optional()}),T=(0,S.zodToSchema)(h),A=(0,S.zodToSchema)(y),C=(0,S.zodToSchema)(k),N={};n(N,{env:()=>x,firehose:()=>O,sns:()=>j,step:()=>E});var O={};n(O,{env:()=>x,step:()=>E});var x={};n(x,{push:()=>P,simulation:()=>R});var D=class{input;constructor(e){this.input=e}get[Symbol.toStringTag](){return"PutRecordBatchCommand"}},P={AWS:{FirehoseClient:class{config;constructor(e){this.config=e}async send(e){return{RecordId:"mock-record-id",ResponseMetadata:{RequestId:"mock-request-id"}}}},PutRecordBatchCommand:D}},R=["call:AWS.FirehoseClient.send"],E={};n(E,{firehoseRecord:()=>F,orderEvent:()=>I,userSignupEvent:()=>q});var M=require("@walkeros/core"),F={title:"Page view record",description:"A page view is sent to Kinesis Firehose as a single record with the full event JSON-stringified into the Data buffer.",in:(0,M.getEvent)("page view",{id:"ev-1700001000",timestamp:1700001e3,data:{title:"Home",url:"https://example.com/"},source:{type:"express",platform:"server"}}),mapping:void 0,out:[["client.send",{DeliveryStreamName:"walkeros-events",Records:[{Data:Buffer.from(JSON.stringify((0,M.getEvent)("page view",{id:"ev-1700001000",timestamp:1700001e3,data:{title:"Home",url:"https://example.com/"},source:{type:"express",platform:"server"}})))}]}]]},I={title:"Order record",description:"An order complete event is serialized and delivered to Firehose as a batch record for downstream storage.",in:(0,M.getEvent)("order complete",{id:"ev-1700001001",timestamp:1700001001,data:{id:"ORD-400",total:99.99,currency:"EUR"},source:{type:"express",platform:"server"}}),mapping:void 0,out:[["client.send",{DeliveryStreamName:"walkeros-events",Records:[{Data:Buffer.from(JSON.stringify((0,M.getEvent)("order complete",{id:"ev-1700001001",timestamp:1700001001,data:{id:"ORD-400",total:99.99,currency:"EUR"},source:{type:"express",platform:"server"}})))}]}]]},q={title:"User signup record",description:"A user signup event including user fields is streamed to Firehose as a JSON record.",in:(0,M.getEvent)("user signup",{id:"ev-1700001002",timestamp:1700001002,data:{plan:"pro",source:"landing-page"},user:{id:"usr-789",email:"new@example.com"},source:{type:"express",platform:"server"}}),mapping:void 0,out:[["client.send",{DeliveryStreamName:"walkeros-events",Records:[{Data:Buffer.from(JSON.stringify((0,M.getEvent)("user signup",{id:"ev-1700001002",timestamp:1700001002,data:{plan:"pro",source:"landing-page"},user:{id:"usr-789",email:"new@example.com"},source:{type:"express",platform:"server"}})))}]}]]},j={};n(j,{env:()=>W,step:()=>L});var W={};n(W,{push:()=>_,simulation:()=>H});var G=class{constructor(e){this.input=e}input},J=class extends G{get[Symbol.toStringTag](){return"CreateTopicCommand"}},K=class extends G{get[Symbol.toStringTag](){return"PublishCommand"}},V=class extends G{get[Symbol.toStringTag](){return"GetTopicAttributesCommand"}},B=class extends G{get[Symbol.toStringTag](){return"SubscribeCommand"}},U=class extends G{get[Symbol.toStringTag](){return"GetCallerIdentityCommand"}},_={AWS:{SNSClient:class{constructor(e){this.config=e}config;async send(e){return e instanceof J?{TopicArn:"arn:aws:sns:eu-central-1:123456789012:walkeros-events"}:e instanceof K?{MessageId:"mock-message-id"}:{}}},CreateTopicCommand:J,PublishCommand:K,GetTopicAttributesCommand:V,SubscribeCommand:B,STSClient:class{constructor(e){this.config=e}config;async send(){return{Account:"123456789012"}}},GetCallerIdentityCommand:U}},H=["call:AWS.SNSClient.send"],L={};n(L,{attributedPublish:()=>te,orderEvent:()=>ee,pageView:()=>$});var Q=require("@walkeros/core"),X=(0,Q.getEvent)("page view",{id:"ev-1700001000",timestamp:1700001e3,data:{title:"Home",url:"https://example.com/"},source:{type:"express",platform:"server"}}),Y=(0,Q.getEvent)("order complete",{id:"ev-1700001001",timestamp:1700001001,data:{id:"ORD-400",total:99.99,currency:"EUR"},user:{id:"usr-789"},source:{type:"express",platform:"server"}}),Z=(0,Q.getEvent)("product view",{id:"ev-1700001002",timestamp:1700001002,data:{id:"SKU-1",tenant_id:"acme"},source:{type:"express",platform:"server"}}),$={title:"Page view publish",description:"A page view event is JSON-stringified and published as the Message of an SNS Publish call.",in:X,mapping:void 0,out:[["client.send",{TopicArn:"arn:aws:sns:eu-central-1:000000000000:walkeros-events",Message:JSON.stringify(X)}]]},ee={title:"Order publish with FIFO group (path-resolved)",description:'An order complete event is published with a FIFO messageGroupId resolved from the event via the mapping path "user.id". `messageGroupId` is a `Mapping.Value`, so a string path is sufficient; no literal is hard-coded.',in:Y,mapping:{settings:{messageGroupId:"user.id"}},out:[["client.send",{TopicArn:"arn:aws:sns:eu-central-1:000000000000:walkeros-events.fifo",Message:JSON.stringify(Y),MessageGroupId:"usr-789"}]]},te={title:"Publish with per-event message attributes",description:"Demonstrates `messageAttributes` as `Mapping.Map`: each attribute value resolves per event. Operators express the SDK shape (`{ DataType, StringValue }`) per entry.",in:Z,mapping:{settings:{messageAttributes:{schema_version:{value:{DataType:"String",StringValue:"v4"}},tenant:{value:{DataType:"String",StringValue:"acme"}}}}},out:[["client.send",{TopicArn:"arn:aws:sns:eu-central-1:000000000000:walkeros-events",Message:JSON.stringify(Z),MessageAttributes:{schema_version:{DataType:"String",StringValue:"v4"},tenant:{DataType:"String",StringValue:"acme"}}}]]},re={destinationFirehose:O,destinationSNS:j};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,i=Object.getOwnPropertyDescriptor,n=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r=(e,i)=>{for(var n in i)t(e,n,{get:i[n],enumerable:!0})},o={};r(o,{examples:()=>Se,exportExamples:()=>fe,exportSchemas:()=>ye,hints:()=>ve,schemas:()=>he}),module.exports=(e=o,((e,r,o,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let c of n(r))s.call(e,c)||c===o||t(e,c,{get:()=>r[c],enumerable:!(a=i(r,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var a={};r(a,{env:()=>c,step:()=>u});var c={};r(c,{push:()=>l,simulation:()=>p});var d=class{input;constructor(e){this.input=e}get[Symbol.toStringTag](){return"PutRecordBatchCommand"}},l={AWS:{FirehoseClient:class{config;constructor(e){this.config=e}async send(e){const t="input"in e?e.input:void 0;var i;return{FailedPutCount:0,Encrypted:!1,RequestResponses:("object"==typeof(i=t)&&null!==i&&"Records"in i&&Array.isArray(i.Records)?t.Records:[]).map((e,t)=>({RecordId:`mock-record-id-${t}`}))}}destroy(){}},PutRecordBatchCommand:d}},p=["call:AWS.FirehoseClient.send"],u={};r(u,{firehoseRecord:()=>A,init:()=>S,mappedRecord:()=>C,orderEvent:()=>b,userSignupEvent:()=>E});var m=require("@walkeros/core");require("@walkeros/core");function g(e,t=!0){const i=JSON.stringify(e);if("string"!=typeof i)throw new TypeError("The payload does not serialize to JSON.");return Buffer.from(t?`${i}\n`:i)}var h="walkeros-events",S={title:"Initialization",description:"Init builds one FirehoseClient for the stream region with the credentials from config.credentials and a 2500 ms per-attempt timeout. Nothing is sent until the first event.",in:{settings:{streamName:h,region:"eu-central-1"},credentials:{accessKeyId:"$secret.AWS_ACCESS_KEY_ID",secretAccessKey:"$secret.AWS_SECRET_ACCESS_KEY"}},out:[["new FirehoseClient",{region:"eu-central-1",credentials:{accessKeyId:"$secret.AWS_ACCESS_KEY_ID",secretAccessKey:"$secret.AWS_SECRET_ACCESS_KEY"},requestHandler:{requestTimeout:2500,throwOnRequestTimeout:!0}}]]},v=(0,m.getEvent)("page view",{id:"ev-1700001000",timestamp:1700001e3,data:{title:"Home",url:"https://example.com/"},source:{type:"express",platform:"server"}}),f=(0,m.getEvent)("order complete",{id:"ev-1700001001",timestamp:1700001001,data:{id:"ORD-400",total:99.99,currency:"EUR"},source:{type:"express",platform:"server"}}),y=(0,m.getEvent)("user signup",{id:"ev-1700001002",timestamp:1700001002,data:{plan:"pro",source:"landing-page"},user:{id:"usr-789",email:"new@example.com"},source:{type:"express",platform:"server"}});function w(e){return[["client.send",{DeliveryStreamName:h,Records:[{Data:g(e)}]}]]}var A={title:"Page view record",description:"A page view is sent to Firehose as one record: the full event as JSON followed by a newline.",in:v,mapping:void 0,out:w(v)},b={title:"Order record",description:"An order complete event is serialized and delivered to Firehose as one newline-terminated record.",in:f,mapping:void 0,out:w(f)},E={title:"User signup record",description:"A user signup event including user fields is streamed to Firehose as a JSON record.",in:y,mapping:void 0,out:w(y)},C={title:"Mapped record",description:"A mapping that produces an object sends that object as the record instead of the full event. Keep the event id in it for deduplication.",in:f,mapping:{data:{map:{id:"id",name:"name",order_id:"data.id",total:"data.total"}}},out:w({id:"ev-1700001001",name:"order complete",order_id:"ORD-400",total:99.99})},_={};r(_,{env:()=>T,step:()=>D});var T={};r(T,{push:()=>K,simulation:()=>x});var N=class{constructor(e){this.input=e}input},z=class extends N{get[Symbol.toStringTag](){return"CreateTopicCommand"}},k=class extends N{get[Symbol.toStringTag](){return"PublishCommand"}},I=class extends N{get[Symbol.toStringTag](){return"GetTopicAttributesCommand"}},R=class extends N{get[Symbol.toStringTag](){return"SubscribeCommand"}},O=class extends N{get[Symbol.toStringTag](){return"GetCallerIdentityCommand"}},K={AWS:{SNSClient:class{constructor(e){this.config=e}config;async send(e){return e instanceof z?{TopicArn:"arn:aws:sns:eu-central-1:123456789012:walkeros-events"}:e instanceof k?{MessageId:"mock-message-id"}:{}}destroy(){}},CreateTopicCommand:z,PublishCommand:k,GetTopicAttributesCommand:I,SubscribeCommand:R,STSClient:class{constructor(e){this.config=e}config;async send(){return{Account:"123456789012",Arn:"arn:aws:iam::123456789012:user/walkeros"}}destroy(){}},GetCallerIdentityCommand:O}},x=["call:AWS.SNSClient.send"],D={};r(D,{attributedPublish:()=>G,init:()=>j,mappedMessage:()=>J,orderEvent:()=>Y,pageView:()=>$});var W=require("@walkeros/core"),F="arn:aws:sns:eu-central-1:123456789012:walkeros-events",j={title:"Initialization",description:"Init builds one SNSClient in the region of the topic ARN with the credentials from config.credentials and a 2500 ms per-attempt timeout. No topic is created and nothing is sent until the first event.",in:{settings:{topicArn:F},credentials:{accessKeyId:"$secret.AWS_ACCESS_KEY_ID",secretAccessKey:"$secret.AWS_SECRET_ACCESS_KEY"}},out:[["new SNSClient",{region:"eu-central-1",credentials:{accessKeyId:"$secret.AWS_ACCESS_KEY_ID",secretAccessKey:"$secret.AWS_SECRET_ACCESS_KEY"},requestHandler:{requestTimeout:2500,throwOnRequestTimeout:!0}}]]},M=(0,W.getEvent)("page view",{id:"ev-1700001000",timestamp:1700001e3,data:{title:"Home",url:"https://example.com/"},source:{type:"express",platform:"server"}}),q=(0,W.getEvent)("order complete",{id:"ev-1700001001",timestamp:1700001001,data:{id:"ORD-400",total:99.99,currency:"EUR"},user:{id:"usr-789"},source:{type:"express",platform:"server"}}),P=(0,W.getEvent)("product view",{id:"ev-1700001002",timestamp:1700001002,data:{id:"SKU-1",tenant_id:"acme"},source:{type:"express",platform:"server"}}),$={title:"Page view publish",description:"A page view event is JSON-stringified and published as the Message of an SNS Publish call.",in:M,mapping:void 0,out:[["client.send",{TopicArn:F,Message:JSON.stringify(M)}]]},Y={title:"Order publish with FIFO group (path-resolved)",description:'An order complete event is published to a FIFO topic with a messageGroupId resolved from the event via the mapping path "user.id". The deduplication id defaults to the event id.',in:q,mapping:{settings:{messageGroupId:"user.id"}},out:[["client.send",{TopicArn:"arn:aws:sns:eu-central-1:123456789012:walkeros-events.fifo",Message:JSON.stringify(q),MessageGroupId:"usr-789",MessageDeduplicationId:"ev-1700001001"}]]},G={title:"Publish with per-event message attributes",description:"Demonstrates `messageAttributes` as `Mapping.Map`: each attribute value resolves per event. Operators express the SDK shape (`{ DataType, StringValue }`) per entry.",in:P,mapping:{settings:{messageAttributes:{schema_version:{value:{DataType:"String",StringValue:"v4"}},tenant:{value:{DataType:"String",StringValue:"acme"}}}}},out:[["client.send",{TopicArn:F,Message:JSON.stringify(P),MessageAttributes:{schema_version:{DataType:"String",StringValue:"v4"},tenant:{DataType:"String",StringValue:"acme"}}}]]},J={title:"Mapped message",description:"A mapping that produces an object publishes that object as the Message instead of the full event. Keep the event id in it for deduplication.",in:q,mapping:{data:{map:{id:"id",name:"name",order_id:"data.id",total:"data.total"}}},out:[["client.send",{TopicArn:F,Message:JSON.stringify({id:"ev-1700001001",name:"order complete",order_id:"ORD-400",total:99.99})}]]},U=require("@walkeros/core/dev"),B=require("@walkeros/core/dev"),L=B.z.string().min(1).describe("Name of the Firehose stream (like walkeros-events). Required.").optional(),V=B.z.string().describe("AWS region of the stream (like eu-central-1). Default: AWS_REGION or the active profile, else eu-central-1."),H=B.z.any().describe("A FirehoseClient of your own. Used as is and never closed by the destination."),Q=B.z.any().describe("Raw FirehoseClient options passed to the SDK (like { endpoint, maxAttempts }). Put keys in config.credentials instead."),X=B.z.object({streamName:L,client:H.optional(),region:V.optional(),config:Q.optional()}),Z=B.z.object({streamName:L,region:V.optional(),newline:B.z.boolean().describe("Append a newline to every record (default true). Set false when the stream adds its own new line delimiter.").optional(),config:Q.optional(),client:H.optional(),firehose:X.describe("Deprecated: use the flat fields streamName, region, config and client.").optional()}),ee=require("@walkeros/core/dev").z.object({}),te=(0,U.zodToSchema)(Z),ie=(0,U.zodToSchema)(ee),ne=(0,U.zodToSchema)(X),se=require("@walkeros/core/dev"),re=require("@walkeros/core/dev"),oe=re.z.object({topicArn:re.z.string().describe("Topic ARN (like arn:aws:sns:eu-central-1:123456789012:walkeros-events). Region and topic name derive from it. Required unless topicName is set.").optional(),topicName:re.z.string().min(1).describe("Topic name (like walkeros-events). Used by walkeros setup; without topicArn the ARN is completed with the account id at the first publish.").optional(),region:re.z.string().describe("AWS region (like eu-central-1). Default: the region in topicArn, AWS_REGION or the active profile, else eu-central-1.").optional(),client:re.z.any().describe("An SNSClient of your own. Used as is and never closed by the destination.").optional(),config:re.z.any().describe("Raw SNSClient options passed to the SDK. Put keys in config.credentials instead.").optional()}),ae=require("@walkeros/core/dev"),ce=ae.z.object({messageAttributes:ae.z.record(ae.z.string(),ae.z.unknown()).optional(),messageGroupId:ae.z.unknown().optional(),messageDeduplicationId:ae.z.unknown().optional()}),de=require("@walkeros/core/dev"),le=de.z.object({protocol:de.z.enum(["sqs","lambda","https","http","email","sms"]),endpoint:de.z.string().min(1),rawMessageDelivery:de.z.boolean().optional(),filterPolicy:de.z.record(de.z.string(),de.z.unknown()).optional(),deadLetterTargetArn:de.z.string().optional()}),pe=de.z.object({region:de.z.string().optional(),displayName:de.z.string().optional(),fifoTopic:de.z.boolean().optional(),kmsMasterKeyId:de.z.string().optional(),tags:de.z.record(de.z.string(),de.z.string()).optional(),subscriptions:de.z.array(le).optional()}),ue=(0,se.zodToSchema)(oe),me=(0,se.zodToSchema)(ce),ge=(0,se.zodToSchema)(pe),he={};r(he,{firehose:()=>ne,firehoseMapping:()=>ie,firehoseSettings:()=>te,mapping:()=>ie,settings:()=>te,snsMapping:()=>me,snsSettings:()=>ue,snsSetup:()=>ge});var Se={};r(Se,{env:()=>c,firehose:()=>a,sns:()=>_,step:()=>u});var ve={"minimal-config":{text:"Firehose needs settings.streamName (plus settings.region when the stream is not in AWS_REGION or eu-central-1). SNS needs settings.topicArn; region and topic name derive from it. Off AWS, add config.credentials. Nothing is sent and no credentials are loaded until the first event.",code:[{lang:"json",code:'{ "settings": { "streamName": "walkeros-events", "region": "eu-central-1" }, "credentials": { "accessKeyId": "$secret.AWS_ACCESS_KEY_ID", "secretAccessKey": "$secret.AWS_SECRET_ACCESS_KEY" } }'},{lang:"json",code:'{ "settings": { "topicArn": "arn:aws:sns:eu-central-1:123456789012:walkeros-events" } }'}]},"auth-credentials":{text:"On AWS compute an attached IAM role needs no config at all. Elsewhere, config.credentials ({ accessKeyId, secretAccessKey, sessionToken? }, or the same as a JSON string) wins over settings.config.credentials, which wins over the AWS default chain (AWS_* variables, AWS_PROFILE, ECS, EC2 and web identity roles; Kubernetes can go keyless with AWS_ROLE_ARN plus AWS_WEB_IDENTITY_TOKEN_FILE). Back every value with $secret; never write a literal key. Credentials are shape-checked at init and loaded only at the first send.",code:[{lang:"json",code:'{ "credentials": { "accessKeyId": "$secret.AWS_ACCESS_KEY_ID", "secretAccessKey": "$secret.AWS_SECRET_ACCESS_KEY" } }'}]},"firehose-records":{text:"Each record is the mapped data object, or the full event when the mapping produced none, followed by a newline. Set settings.newline: false when the stream adds its own new line delimiter. Batching is on by default (500 records or 1 s); calls carry at most 500 records and 2,900,000 bytes, and a record over 1,000,000 bytes fails as RecordTooLarge without being sent."},"delivery-guarantee":{text:"Delivery is at least once: deduplicate downstream on event.id, and keep id in mapped data. A record AWS rejects is reported as failed with code, status and retryable. There is no retry beyond the built-in AWS SDK retry: a rejected record goes to the in-memory dead letter queue of the collector, which nothing replays yet. On SNS FIFO topics MessageDeduplicationId defaults to event.id."},"troubleshoot-errors":{text:"Every failure carries code, status and retryable, and its message names the stream or topic and the region. ResourceNotFoundException: wrong settings.streamName or region. AccessDeniedException / AuthorizationErrorException: the credentials lack firehose:PutRecordBatch or sns:Publish. UnrecognizedClientException, InvalidSignatureException, ExpiredTokenException or no credentials found: check config.credentials or the environment. SNS NotFoundException: the topic does not exist; run walkeros setup or set settings.topicArn. NULL rows in Athena: the stream adds its own new line delimiter too, so set newline: false. InvalidConfig at start: a missing or conflicting setting, named in the message."}},fe={destinationFirehose:a,destinationSNS:_},ye={destinationFirehose:{settings:te,mapping:ie},destinationSNS:{settings:ue,mapping:me,setup:ge}};//# sourceMappingURL=dev.js.map