@walkeros/server-source-aws 4.7.0-next-1790245733116 → 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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-source-aws",
4
- "version": "4.7.0-next-1790245733116",
4
+ "version": "4.7.0",
5
5
  "type": "source",
6
6
  "platform": [
7
7
  "server"
@@ -284,7 +284,7 @@
284
284
  },
285
285
  "examples": {
286
286
  "createTrigger": {
287
- "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Vn(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if(\"lambda\"===t.type)return t}(t.collector);if(!o)throw new Error(\"Lambda source not found in collector\");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||\"{}\")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}}"
287
+ "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await co(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if(\"lambda\"===t.type)return t}(t.collector);if(!o)throw new Error(\"Lambda source not found in collector\");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||\"{}\")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}}"
288
288
  },
289
289
  "env": {
290
290
  "push": {
@@ -317,7 +317,7 @@
317
317
  "$code": "()=>{}"
318
318
  },
319
319
  "scope": {
320
- "$code": "()=>S"
320
+ "$code": "()=>i"
321
321
  }
322
322
  }
323
323
  }
@@ -449,7 +449,593 @@
449
449
  }
450
450
  },
451
451
  "trigger": {
452
- "$code": "function Xn(e){return async t=>{const n={...t};if(n.body&&\"string\"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:\"test-req\"})}}"
452
+ "$code": "function lo(e){return async t=>{const n={...t};if(n.body&&\"string\"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:\"test-req\"})}}"
453
+ }
454
+ },
455
+ "exportExamples": {
456
+ "sourceLambda": {
457
+ "createTrigger": {
458
+ "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await co(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if(\"lambda\"===t.type)return t}(t.collector);if(!o)throw new Error(\"Lambda source not found in collector\");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||\"{}\")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}}"
459
+ },
460
+ "env": {
461
+ "push": {
462
+ "push": {
463
+ "$code": "()=>Promise.resolve({ok:!0})"
464
+ },
465
+ "command": {
466
+ "$code": "()=>Promise.resolve({ok:!0})"
467
+ },
468
+ "elb": {
469
+ "$code": "()=>Promise.resolve({ok:!0})"
470
+ },
471
+ "logger": {
472
+ "error": {
473
+ "$code": "()=>{}"
474
+ },
475
+ "warn": {
476
+ "$code": "()=>{}"
477
+ },
478
+ "info": {
479
+ "$code": "()=>{}"
480
+ },
481
+ "debug": {
482
+ "$code": "()=>{}"
483
+ },
484
+ "throw": {
485
+ "$code": "e=>{throw\"string\"==typeof e?new Error(e):e}"
486
+ },
487
+ "json": {
488
+ "$code": "()=>{}"
489
+ },
490
+ "scope": {
491
+ "$code": "()=>i"
492
+ }
493
+ }
494
+ }
495
+ },
496
+ "step": {
497
+ "apiGatewayV1Post": {
498
+ "title": "API Gateway v1 POST",
499
+ "description": "A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",
500
+ "trigger": {
501
+ "type": "POST"
502
+ },
503
+ "in": {
504
+ "httpMethod": "POST",
505
+ "path": "/collect",
506
+ "requestContext": {
507
+ "requestId": "req-789",
508
+ "identity": {
509
+ "sourceIp": "203.0.113.42"
510
+ }
511
+ },
512
+ "queryStringParameters": null,
513
+ "body": "{\"name\":\"page view\",\"data\":{\"title\":\"Home\"}}",
514
+ "isBase64Encoded": false
515
+ },
516
+ "out": [
517
+ [
518
+ "elb",
519
+ {
520
+ "name": "page view",
521
+ "data": {
522
+ "title": "Home"
523
+ }
524
+ }
525
+ ]
526
+ ]
527
+ },
528
+ "lambdaGet": {
529
+ "title": "Lambda GET",
530
+ "description": "An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",
531
+ "trigger": {
532
+ "type": "GET"
533
+ },
534
+ "in": {
535
+ "version": "2.0",
536
+ "requestContext": {
537
+ "http": {
538
+ "method": "GET",
539
+ "path": "/collect"
540
+ },
541
+ "requestId": "req-456"
542
+ },
543
+ "rawQueryString": "e=page+view&d=%7B%22title%22%3A%22Home%22%7D",
544
+ "isBase64Encoded": false
545
+ },
546
+ "out": [
547
+ [
548
+ "elb",
549
+ {
550
+ "e": "page view",
551
+ "d": "{\"title\":\"Home\"}"
552
+ }
553
+ ]
554
+ ]
555
+ },
556
+ "lambdaPost": {
557
+ "title": "Lambda POST",
558
+ "description": "An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",
559
+ "trigger": {
560
+ "type": "POST"
561
+ },
562
+ "in": {
563
+ "version": "2.0",
564
+ "requestContext": {
565
+ "http": {
566
+ "method": "POST",
567
+ "path": "/collect"
568
+ },
569
+ "requestId": "req-123"
570
+ },
571
+ "body": "{\"name\":\"page view\",\"data\":{\"title\":\"Home\"}}",
572
+ "isBase64Encoded": false
573
+ },
574
+ "out": [
575
+ [
576
+ "elb",
577
+ {
578
+ "name": "page view",
579
+ "data": {
580
+ "title": "Home"
581
+ }
582
+ }
583
+ ]
584
+ ]
585
+ },
586
+ "lambdaPostForwardsSource": {
587
+ "title": "Lambda POST with provenance",
588
+ "description": "A POST body carrying a source map is forwarded in full, so release and trace provenance survive the crossing.",
589
+ "trigger": {
590
+ "type": "POST"
591
+ },
592
+ "in": {
593
+ "version": "2.0",
594
+ "requestContext": {
595
+ "http": {
596
+ "method": "POST",
597
+ "path": "/collect"
598
+ },
599
+ "requestId": "req-321"
600
+ },
601
+ "body": "{\"name\":\"page view\",\"data\":{\"title\":\"Home\"},\"source\":{\"release\":{\"web\":\"r1\"}}}",
602
+ "isBase64Encoded": false
603
+ },
604
+ "out": [
605
+ [
606
+ "elb",
607
+ {
608
+ "name": "page view",
609
+ "data": {
610
+ "title": "Home"
611
+ },
612
+ "source": {
613
+ "release": {
614
+ "web": "r1"
615
+ }
616
+ }
617
+ }
618
+ ]
619
+ ]
620
+ }
621
+ },
622
+ "trigger": {
623
+ "$code": "function lo(e){return async t=>{const n={...t};if(n.body&&\"string\"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:\"test-req\"})}}"
624
+ }
625
+ },
626
+ "sourceSqs": {
627
+ "createTrigger": {
628
+ "$code": "async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await co(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Oo(t))return t}(t.collector);if(!o)throw new Error(\"sqs source not registered in collector, ensure it is configured in sources\");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&\"object\"==typeof r&&(r.acked&&i.push([\"message.ack\",n.MessageId]),r.nacked&&i.push([\"message.nack\",n.MessageId])),i}}}"
629
+ },
630
+ "env": {
631
+ "moduleMockEnv": {
632
+ "push": {
633
+ "$code": "()=>Promise.resolve({ok:!0})"
634
+ },
635
+ "command": {
636
+ "$code": "()=>Promise.resolve({ok:!0})"
637
+ },
638
+ "elb": {
639
+ "$code": "()=>Promise.resolve({ok:!0})"
640
+ },
641
+ "logger": {
642
+ "error": {
643
+ "$code": "()=>{}"
644
+ },
645
+ "warn": {
646
+ "$code": "()=>{}"
647
+ },
648
+ "info": {
649
+ "$code": "()=>{}"
650
+ },
651
+ "debug": {
652
+ "$code": "()=>{}"
653
+ },
654
+ "throw": {
655
+ "$code": "e=>{throw\"string\"==typeof e?new Error(e):e}"
656
+ },
657
+ "json": {
658
+ "$code": "()=>{}"
659
+ },
660
+ "scope": {
661
+ "$code": "()=>ho"
662
+ }
663
+ }
664
+ },
665
+ "push": {
666
+ "push": {
667
+ "$code": "()=>Promise.resolve({ok:!0})"
668
+ },
669
+ "command": {
670
+ "$code": "()=>Promise.resolve({ok:!0})"
671
+ },
672
+ "elb": {
673
+ "$code": "()=>Promise.resolve({ok:!0})"
674
+ },
675
+ "logger": {
676
+ "error": {
677
+ "$code": "()=>{}"
678
+ },
679
+ "warn": {
680
+ "$code": "()=>{}"
681
+ },
682
+ "info": {
683
+ "$code": "()=>{}"
684
+ },
685
+ "debug": {
686
+ "$code": "()=>{}"
687
+ },
688
+ "throw": {
689
+ "$code": "e=>{throw\"string\"==typeof e?new Error(e):e}"
690
+ },
691
+ "json": {
692
+ "$code": "()=>{}"
693
+ },
694
+ "scope": {
695
+ "$code": "()=>ho"
696
+ }
697
+ },
698
+ "AWS": {
699
+ "SQSClient": {
700
+ "$code": "class{constructor(e){this.config=e}config;async send(e){return function(e){if(!(\"input\"in e))return!1;const{input:t}=e;return\"object\"==typeof t&&null!==t&&\"WaitTimeSeconds\"in t}(e)&&await new Promise(e=>setTimeout(e,100)),{$metadata:{},QueueUrl:\"https://sqs.eu-central-1.amazonaws.com/000000000000/walkeros-events\",Attributes:{QueueArn:\"arn:aws:sqs:eu-central-1:000000000000:walkeros-events\"},Messages:[]}}destroy(){}}"
701
+ }
702
+ }
703
+ },
704
+ "simulation": [
705
+ "call:AWS.SQSClient.send"
706
+ ]
707
+ },
708
+ "step": {
709
+ "decoderText": {
710
+ "title": "Text decoder",
711
+ "description": "When decoder is \"text\", the body string flows under data.payload.",
712
+ "in": {
713
+ "MessageId": "m-3",
714
+ "Body": "raw text payload"
715
+ },
716
+ "out": [
717
+ [
718
+ "message.ack",
719
+ "m-3"
720
+ ]
721
+ ]
722
+ },
723
+ "malformedJson": {
724
+ "title": "Malformed JSON nacks",
725
+ "description": "Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",
726
+ "in": {
727
+ "MessageId": "m-4",
728
+ "Body": "{not json"
729
+ },
730
+ "out": [
731
+ [
732
+ "message.nack",
733
+ "m-4"
734
+ ]
735
+ ]
736
+ },
737
+ "orderComplete": {
738
+ "title": "Order complete from SQS",
739
+ "description": "Order complete event flowing through the long-poll loop.",
740
+ "in": {
741
+ "MessageId": "m-2",
742
+ "Body": "{\"event\":\"order complete\",\"data\":{\"id\":\"ORD-500\",\"total\":199.99,\"currency\":\"EUR\"}}"
743
+ },
744
+ "out": [
745
+ [
746
+ "message.ack",
747
+ "m-2"
748
+ ]
749
+ ]
750
+ },
751
+ "pageView": {
752
+ "title": "Page view from SQS",
753
+ "description": "A standard SQS message body containing a walker elb event payload as JSON.",
754
+ "in": {
755
+ "MessageId": "m-1",
756
+ "Body": "{\"event\":\"page view\",\"data\":{\"title\":\"Documentation\",\"url\":\"https://example.com/docs\"}}"
757
+ },
758
+ "out": [
759
+ [
760
+ "message.ack",
761
+ "m-1"
762
+ ]
763
+ ]
764
+ }
765
+ }
766
+ }
767
+ },
768
+ "exportSchemas": {
769
+ "sourceLambda": {
770
+ "settings": {
771
+ "$schema": "http://json-schema.org/draft-07/schema#",
772
+ "type": "object",
773
+ "properties": {
774
+ "cors": {
775
+ "default": true,
776
+ "anyOf": [
777
+ {
778
+ "type": "boolean"
779
+ },
780
+ {
781
+ "type": "object",
782
+ "properties": {
783
+ "origin": {
784
+ "anyOf": [
785
+ {
786
+ "type": "string"
787
+ },
788
+ {
789
+ "type": "array",
790
+ "items": {
791
+ "type": "string"
792
+ }
793
+ },
794
+ {
795
+ "type": "string",
796
+ "const": "*"
797
+ }
798
+ ],
799
+ "description": "Allowed origins (* for all, URL string, or array of URLs)"
800
+ },
801
+ "methods": {
802
+ "type": "array",
803
+ "items": {
804
+ "type": "string",
805
+ "enum": [
806
+ "GET",
807
+ "POST",
808
+ "PUT",
809
+ "PATCH",
810
+ "DELETE",
811
+ "OPTIONS",
812
+ "HEAD"
813
+ ]
814
+ },
815
+ "description": "Allowed HTTP methods"
816
+ },
817
+ "headers": {
818
+ "type": "array",
819
+ "items": {
820
+ "type": "string"
821
+ },
822
+ "description": "Allowed request headers"
823
+ },
824
+ "credentials": {
825
+ "type": "boolean",
826
+ "description": "Allow credentials (cookies, authorization headers)"
827
+ },
828
+ "maxAge": {
829
+ "type": "integer",
830
+ "exclusiveMinimum": 0,
831
+ "maximum": 9007199254740991,
832
+ "description": "Preflight cache duration in seconds"
833
+ }
834
+ },
835
+ "additionalProperties": false
836
+ }
837
+ ],
838
+ "description": "CORS configuration: false = disabled, true = allow all origins, object = custom configuration"
839
+ },
840
+ "timeout": {
841
+ "default": 30000,
842
+ "type": "integer",
843
+ "exclusiveMinimum": 0,
844
+ "maximum": 900000,
845
+ "description": "Request timeout in milliseconds (max: 900000 for Lambda)"
846
+ },
847
+ "enablePixelTracking": {
848
+ "default": true,
849
+ "type": "boolean",
850
+ "description": "Enable GET requests with 1x1 transparent GIF response for pixel tracking"
851
+ },
852
+ "maxBatchSize": {
853
+ "default": 100,
854
+ "type": "integer",
855
+ "minimum": 1,
856
+ "maximum": 9007199254740991,
857
+ "description": "Maximum number of events accepted in a single batch request"
858
+ },
859
+ "healthPath": {
860
+ "default": "/health",
861
+ "type": "string",
862
+ "description": "Health check endpoint path (e.g., /health)"
863
+ }
864
+ },
865
+ "required": [],
866
+ "additionalProperties": false
867
+ }
868
+ },
869
+ "sourceSqs": {
870
+ "settings": {
871
+ "$schema": "http://json-schema.org/draft-07/schema#",
872
+ "type": "object",
873
+ "properties": {
874
+ "queueName": {
875
+ "type": "string",
876
+ "minLength": 1,
877
+ "description": "SQS queue short name (like walkeros-events). Required for both setup and runtime poll."
878
+ },
879
+ "region": {
880
+ "type": "string",
881
+ "description": "AWS region (like eu-central-1). Default: eu-central-1."
882
+ },
883
+ "queueUrl": {
884
+ "type": "string",
885
+ "format": "uri",
886
+ "description": "Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup."
887
+ },
888
+ "client": {
889
+ "description": "Pre-configured AWS SQSClient instance. Bypasses construction when supplied."
890
+ },
891
+ "config": {
892
+ "description": "AWS SDK SQSClientConfig (credentials, endpoint overrides, retries)."
893
+ },
894
+ "decoder": {
895
+ "type": "string",
896
+ "enum": [
897
+ "json",
898
+ "text",
899
+ "raw"
900
+ ],
901
+ "description": "Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer."
902
+ },
903
+ "maxMessages": {
904
+ "type": "integer",
905
+ "minimum": 1,
906
+ "maximum": 10,
907
+ "description": "SQS receive batch size. Cap 10. Default: 10."
908
+ },
909
+ "waitTimeSeconds": {
910
+ "type": "integer",
911
+ "minimum": 0,
912
+ "maximum": 20,
913
+ "description": "Long-poll duration in seconds. Cap 20. Default: 20."
914
+ },
915
+ "visibilityTimeout": {
916
+ "type": "integer",
917
+ "minimum": 0,
918
+ "maximum": 9007199254740991,
919
+ "description": "Per-receive visibility timeout override. Default: queue-configured value."
920
+ },
921
+ "shutdownTimeoutMs": {
922
+ "type": "integer",
923
+ "exclusiveMinimum": 0,
924
+ "maximum": 9007199254740991,
925
+ "description": "Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes."
926
+ },
927
+ "onPushError": {
928
+ "type": "string",
929
+ "enum": [
930
+ "nack",
931
+ "ack"
932
+ ],
933
+ "description": "Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it."
934
+ }
935
+ },
936
+ "required": [
937
+ "queueName"
938
+ ],
939
+ "additionalProperties": false
940
+ },
941
+ "setup": {
942
+ "$schema": "http://json-schema.org/draft-07/schema#",
943
+ "type": "object",
944
+ "properties": {
945
+ "region": {
946
+ "type": "string",
947
+ "minLength": 1,
948
+ "description": "AWS region."
949
+ },
950
+ "fifoQueue": {
951
+ "type": "boolean",
952
+ "description": "FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name."
953
+ },
954
+ "visibilityTimeoutSeconds": {
955
+ "type": "integer",
956
+ "minimum": 0,
957
+ "maximum": 9007199254740991,
958
+ "description": "Visibility timeout in seconds. Default: 30."
959
+ },
960
+ "messageRetentionSeconds": {
961
+ "type": "integer",
962
+ "exclusiveMinimum": 0,
963
+ "maximum": 9007199254740991,
964
+ "description": "Message retention period in seconds. Default: 345600 (4 days)."
965
+ },
966
+ "maximumMessageSize": {
967
+ "type": "integer",
968
+ "minimum": 1024,
969
+ "maximum": 262144,
970
+ "description": "Max message size in bytes. Default: 262144 (256 KB)."
971
+ },
972
+ "kmsMasterKeyId": {
973
+ "type": "string",
974
+ "description": "KMS key alias or ID for at-rest encryption."
975
+ },
976
+ "deadLetterQueue": {
977
+ "type": "object",
978
+ "properties": {
979
+ "arn": {
980
+ "type": "string",
981
+ "description": "ARN of an existing DLQ. Mutually exclusive with create: true."
982
+ },
983
+ "create": {
984
+ "type": "boolean",
985
+ "description": "Create a sibling DLQ named <queueName>-dlq. Default: false."
986
+ },
987
+ "maxReceiveCount": {
988
+ "type": "integer",
989
+ "minimum": 1,
990
+ "maximum": 1000,
991
+ "description": "Max receive count before message goes to DLQ. Default: 5."
992
+ }
993
+ },
994
+ "additionalProperties": false,
995
+ "description": "Optional dead-letter queue.",
996
+ "title": "deadLetterQueue"
997
+ },
998
+ "tags": {
999
+ "type": "object",
1000
+ "propertyNames": {
1001
+ "type": "string"
1002
+ },
1003
+ "additionalProperties": {
1004
+ "type": "string"
1005
+ },
1006
+ "description": "Tags applied to the queue (and inherited by an auto-created DLQ)."
1007
+ },
1008
+ "subscribeToSnsTopic": {
1009
+ "type": "object",
1010
+ "properties": {
1011
+ "topicArn": {
1012
+ "type": "string",
1013
+ "minLength": 1,
1014
+ "description": "Topic ARN to subscribe to."
1015
+ },
1016
+ "rawMessageDelivery": {
1017
+ "type": "boolean",
1018
+ "description": "Deliver SNS messages without the SNS envelope."
1019
+ },
1020
+ "filterPolicy": {
1021
+ "type": "object",
1022
+ "propertyNames": {
1023
+ "type": "string"
1024
+ },
1025
+ "additionalProperties": {},
1026
+ "description": "SNS filter policy applied at subscription level."
1027
+ }
1028
+ },
1029
+ "required": [
1030
+ "topicArn"
1031
+ ],
1032
+ "additionalProperties": false,
1033
+ "description": "Optional SNS topic subscription. Creates the subscription and the matching queue policy.",
1034
+ "title": "subscribeToSnsTopic"
1035
+ }
1036
+ },
1037
+ "additionalProperties": false
1038
+ }
453
1039
  }
454
1040
  }
455
1041
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-source-aws",
3
3
  "description": "AWS server sources for walkerOS (Lambda, API Gateway, Function URLs)",
4
- "version": "4.7.0-next-1790245733116",
4
+ "version": "4.7.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -23,14 +23,14 @@
23
23
  "dependencies": {
24
24
  "@aws-sdk/client-sqs": "^3.952.0",
25
25
  "@aws-sdk/client-sns": "^3.952.0",
26
- "@walkeros/core": "4.7.0-next-1790245733116"
26
+ "@walkeros/core": "4.7.0"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@types/aws-lambda": "^8.10.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/aws-lambda": "^8.10.159",
33
- "@walkeros/collector": "4.7.0-next-1790245733116"
33
+ "@walkeros/collector": "4.7.0"
34
34
  },
35
35
  "repository": {
36
36
  "url": "git+https://github.com/elbwalker/walkerOS.git",