diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 5f6951c9..11cb0501 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -31,7 +31,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v7
with:
- node-version: '20'
+ node-version: '22'
- name: Validate VSCode extension for duplicate commands
run: python tools/validate_vscode_package.py --package-json xrcg_vscode/package.json
- name: Build VSCode extension
diff --git a/.github/workflows/publish-vscode.yml b/.github/workflows/publish-vscode.yml
index 166fee9d..20086852 100644
--- a/.github/workflows/publish-vscode.yml
+++ b/.github/workflows/publish-vscode.yml
@@ -37,7 +37,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v7
with:
- node-version: '20'
+ node-version: '22'
- name: Set up Python
uses: actions/setup-python@v7
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index 5c203ac4..b4f9ff17 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -181,7 +181,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v7
with:
- node-version: '20'
+ node-version: '22'
- name: Set up Python
uses: actions/setup-python@v7
with:
diff --git a/pyproject.toml b/pyproject.toml
index 2e164d5d..85731e3e 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -25,7 +25,7 @@ dependencies = [
"jsonschema>=4.22.0",
"pydot>=2.0.0",
"anytree>=2.12.1",
- "avrotize>=3.9.1",
+ "avrotize>=3.9.5",
"avro>=1.11.5",
"toml>=0.10.2",
"platformdirs>=4.0.0"
diff --git a/requirements.txt b/requirements.txt
index 87674f7c..bf85a87d 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -7,5 +7,5 @@ jsonschema>=4.17.3
pydot>=1.4.2
anytree>=2.8.0
flit>=4.2.0
-avrotize>=3.9.1
+avrotize>=3.9.5
toml>=0.10.2
\ No newline at end of file
diff --git a/test/codegen/test_codegen.py b/test/codegen/test_codegen.py
index a46e4ded..0fc2079f 100644
--- a/test/codegen/test_codegen.py
+++ b/test/codegen/test_codegen.py
@@ -719,6 +719,43 @@ def _tfm_of(path):
shutil.rmtree(output_dir, ignore_errors=True)
+@pytest.mark.parametrize("language,style", [
+ ("ts", "kafkaproducer"), ("ts", "egproducer"), ("ts", "producerhttp"),
+ ("ts", "dashboard"), ("ts", "mqttclient"),
+ ("go", "ehproducer"), ("go", "kafkaproducer"),
+])
+def test_generated_projects_use_central_dependency_floors(tmp_path, monkeypatch, language, style):
+ definitions = os.path.join(project_root, "test", "xreg", "lightbulb.xreg.json")
+ monkeypatch.setattr(sys, "argv", [
+ "xrcg", "generate", "--definitions", definitions,
+ "--output", str(tmp_path), "--projectname", "DependencyFloors",
+ "--language", language, "--style", style,
+ ])
+ assert xrcg.cli() == 0
+ if language == "ts":
+ with open(os.path.join(project_root, "xrcg", "dependencies", "typescript",
+ "node22", "package.json"), encoding="utf-8") as handle:
+ central = json.load(handle)
+ manifests = list(tmp_path.rglob("package.json"))
+ assert manifests
+ overrides_found = False
+ for manifest in manifests:
+ package = json.loads(manifest.read_text(encoding="utf-8"))
+ if "overrides" in package:
+ overrides_found = True
+ assert package["overrides"] == central["overrides"]
+ for section in ("dependencies", "devDependencies"):
+ for name, version in package.get(section, {}).items():
+ if name in central.get(section, {}) and "overrides" in package:
+ assert version == central[section][name]
+ assert overrides_found
+ else:
+ manifest = tmp_path / "DependencyFloors" / "go.mod"
+ content = manifest.read_text(encoding="utf-8")
+ floor = TemplateRenderer.dependency("go", "go121", "golang.org/x/net").strip()
+ assert floor in content
+
+
def test_extract_schema_info_keeps_names_for_top_level_schemagroup_refs():
"""Top-level schemagroup refs must retain class and namespace metadata.
diff --git a/xrcg/dependencies/cs/net100/dependencies.csproj b/xrcg/dependencies/cs/net100/dependencies.csproj
index e3b0da36..68130704 100644
--- a/xrcg/dependencies/cs/net100/dependencies.csproj
+++ b/xrcg/dependencies/cs/net100/dependencies.csproj
@@ -32,7 +32,7 @@
-
+
diff --git a/xrcg/dependencies/go/go121/go.mod b/xrcg/dependencies/go/go121/go.mod
index 91b07055..1c241aad 100644
--- a/xrcg/dependencies/go/go121/go.mod
+++ b/xrcg/dependencies/go/go121/go.mod
@@ -1,3 +1,7 @@
module xrcg_dependencies
-go 1.21
+go 1.26.0
+
+require (
+ golang.org/x/net v0.62.0
+)
diff --git a/xrcg/dependencies/python/py312/requirements.txt b/xrcg/dependencies/python/py312/requirements.txt
index 8e7409c8..69ad423d 100644
--- a/xrcg/dependencies/python/py312/requirements.txt
+++ b/xrcg/dependencies/python/py312/requirements.txt
@@ -9,7 +9,7 @@ azure-servicebus>=7.15.0
azure-storage-blob>=12.31.1
cloudevents>=2.2.0
confluent-kafka>=2.16.1
-paho-mqtt>=2.2.0
+paho-mqtt>=2.1.0
python-qpid-proton>=0.41.1
# Development dependencies
diff --git a/xrcg/dependencies/typescript/node22/package.json b/xrcg/dependencies/typescript/node22/package.json
index 3698260e..b000acc3 100644
--- a/xrcg/dependencies/typescript/node22/package.json
+++ b/xrcg/dependencies/typescript/node22/package.json
@@ -12,23 +12,40 @@
"kafkajs": "^2.2.4",
"mqtt": "^5.0.0",
"rhea": "^3.0.0",
- "uuid": "^14.0.0"
+ "uuid": "^11.1.1"
},
"devDependencies": {
+ "aedes": "^0.51.3",
"@jest/globals": "^30.2.0",
"@stylistic/eslint-plugin": "^5.6.1",
"@testcontainers/kafka": "^12.0.1",
"@types/jest": "^30.0.0",
- "@types/node": "^26.1.1",
+ "@types/node": "^22.19.0",
"@types/uuid": "^11.0.0",
- "@typescript-eslint/eslint-plugin": "^8.8.1",
- "@typescript-eslint/parser": "^8.8.1",
+ "@typescript-eslint/eslint-plugin": "^8.72.1",
+ "@typescript-eslint/parser": "^8.72.1",
"eslint": "^10.1.0",
"jest": "^30.2.0",
"nock": "^14.0.10",
"testcontainers": "^12.0.1",
- "ts-jest": "^29.2.5",
+ "ts-jest": "^29.4.15",
"ts-node": "^10.9.0",
- "typescript": "^7.0.2"
+ "typedoc": "^0.28.17",
+ "typescript": "~5.9.3"
+ },
+ "overrides": {
+ "deepmerge": "npm:@stackline/deepmerge@1.1.0",
+ "cloudevents": {
+ "uuid": "^11.1.1"
+ },
+ "uuid@>=7 <11.1.1": "^11.1.1",
+ "ajv-cli": {
+ "fast-json-patch": "^3.1.1"
+ },
+ "@typescript-eslint/typescript-estree": {
+ "minimatch": "^11.0.1"
+ },
+ "minimatch@>=9": "^11.0.1",
+ "glob@>=9": "^14.0.3"
}
}
diff --git a/xrcg/templates/go/amqpconsumer/go.mod.jinja b/xrcg/templates/go/amqpconsumer/go.mod.jinja
index b1b5633f..d5124d2a 100644
--- a/xrcg/templates/go/amqpconsumer/go.mod.jinja
+++ b/xrcg/templates/go/amqpconsumer/go.mod.jinja
@@ -1,15 +1,16 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.21
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/Azure/go-amqp v1.7.0
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/google/uuid v1.6.0
github.com/username/{{ data_project_name | go_package }} v0.0.0
- github.com/stretchr/testify v1.8.4
- github.com/testcontainers/testcontainers-go v0.27.0
+ github.com/stretchr/testify v1.10.0
+ github.com/testcontainers/testcontainers-go v0.38.0
)
replace github.com/username/{{ data_project_name | go_package }} => ../{{ data_project_name }}
diff --git a/xrcg/templates/go/amqpproducer/go.mod.jinja b/xrcg/templates/go/amqpproducer/go.mod.jinja
index b1b5633f..d5124d2a 100644
--- a/xrcg/templates/go/amqpproducer/go.mod.jinja
+++ b/xrcg/templates/go/amqpproducer/go.mod.jinja
@@ -1,15 +1,16 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.21
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/Azure/go-amqp v1.7.0
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/google/uuid v1.6.0
github.com/username/{{ data_project_name | go_package }} v0.0.0
- github.com/stretchr/testify v1.8.4
- github.com/testcontainers/testcontainers-go v0.27.0
+ github.com/stretchr/testify v1.10.0
+ github.com/testcontainers/testcontainers-go v0.38.0
)
replace github.com/username/{{ data_project_name | go_package }} => ../{{ data_project_name }}
diff --git a/xrcg/templates/go/amqpproducer/{testdir}producer_test.go.jinja b/xrcg/templates/go/amqpproducer/{testdir}producer_test.go.jinja
index c53ff44d..1cb0549a 100644
--- a/xrcg/templates/go/amqpproducer/{testdir}producer_test.go.jinja
+++ b/xrcg/templates/go/amqpproducer/{testdir}producer_test.go.jinja
@@ -26,7 +26,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
{%- if avro_messages %}
- "github.com/hamba/avro/v2"
+ "github.com/iskorotkov/avro/v2"
{%- endif %}
testcontainers "github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/wait"
diff --git a/xrcg/templates/go/ehconsumer/go.mod.jinja b/xrcg/templates/go/ehconsumer/go.mod.jinja
index 54fbbae8..687924fc 100644
--- a/xrcg/templates/go/ehconsumer/go.mod.jinja
+++ b/xrcg/templates/go/ehconsumer/go.mod.jinja
@@ -1,9 +1,10 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.23.0
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.4.0
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/google/uuid v1.6.0
diff --git a/xrcg/templates/go/ehproducer/go.mod.jinja b/xrcg/templates/go/ehproducer/go.mod.jinja
index 59784f53..7f0d79c0 100644
--- a/xrcg/templates/go/ehproducer/go.mod.jinja
+++ b/xrcg/templates/go/ehproducer/go.mod.jinja
@@ -1,9 +1,10 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.23.0
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/Azure/azure-sdk-for-go/sdk/messaging/azeventhubs v1.4.0
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0
github.com/cloudevents/sdk-go/v2 v2.15.2
diff --git a/xrcg/templates/go/ehproducer/{testdir}producer_test.go.jinja b/xrcg/templates/go/ehproducer/{testdir}producer_test.go.jinja
index 1ba815d0..e45b0e32 100644
--- a/xrcg/templates/go/ehproducer/{testdir}producer_test.go.jinja
+++ b/xrcg/templates/go/ehproducer/{testdir}producer_test.go.jinja
@@ -45,7 +45,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
{%- if avro_messages %}
- "github.com/hamba/avro/v2"
+ "github.com/iskorotkov/avro/v2"
{%- endif %}
{%- if live_is_ce %}
"github.com/testcontainers/testcontainers-go"
diff --git a/xrcg/templates/go/kafkaconsumer/go.mod.jinja b/xrcg/templates/go/kafkaconsumer/go.mod.jinja
index 7c950092..7c75062d 100644
--- a/xrcg/templates/go/kafkaconsumer/go.mod.jinja
+++ b/xrcg/templates/go/kafkaconsumer/go.mod.jinja
@@ -1,16 +1,17 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.21
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/segmentio/kafka-go v0.4.47
github.com/google/uuid v1.6.0
github.com/username/{{ data_project_name | go_package }} v0.0.0
- github.com/testcontainers/testcontainers-go v0.27.0
- github.com/testcontainers/testcontainers-go/modules/kafka v0.27.0
- github.com/stretchr/testify v1.8.4
+ github.com/testcontainers/testcontainers-go v0.38.0
+ github.com/testcontainers/testcontainers-go/modules/kafka v0.38.0
+ github.com/stretchr/testify v1.10.0
)
replace github.com/username/{{ data_project_name | go_package }} => ../{{ data_project_name }}
diff --git a/xrcg/templates/go/kafkaproducer/go.mod.jinja b/xrcg/templates/go/kafkaproducer/go.mod.jinja
index 7c950092..7c75062d 100644
--- a/xrcg/templates/go/kafkaproducer/go.mod.jinja
+++ b/xrcg/templates/go/kafkaproducer/go.mod.jinja
@@ -1,16 +1,17 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.21
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/segmentio/kafka-go v0.4.47
github.com/google/uuid v1.6.0
github.com/username/{{ data_project_name | go_package }} v0.0.0
- github.com/testcontainers/testcontainers-go v0.27.0
- github.com/testcontainers/testcontainers-go/modules/kafka v0.27.0
- github.com/stretchr/testify v1.8.4
+ github.com/testcontainers/testcontainers-go v0.38.0
+ github.com/testcontainers/testcontainers-go/modules/kafka v0.38.0
+ github.com/stretchr/testify v1.10.0
)
replace github.com/username/{{ data_project_name | go_package }} => ../{{ data_project_name }}
diff --git a/xrcg/templates/go/kafkaproducer/{testdir}producer_test.go.jinja b/xrcg/templates/go/kafkaproducer/{testdir}producer_test.go.jinja
index 37052f21..410833b5 100644
--- a/xrcg/templates/go/kafkaproducer/{testdir}producer_test.go.jinja
+++ b/xrcg/templates/go/kafkaproducer/{testdir}producer_test.go.jinja
@@ -26,7 +26,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
{%- if avro_messages %}
- "github.com/hamba/avro/v2"
+ "github.com/iskorotkov/avro/v2"
{%- endif %}
testcontainers "github.com/testcontainers/testcontainers-go"
tckafka "github.com/testcontainers/testcontainers-go/modules/kafka"
diff --git a/xrcg/templates/go/mqttclient/go.mod.jinja b/xrcg/templates/go/mqttclient/go.mod.jinja
index e5f3dc5a..c504f4ae 100644
--- a/xrcg/templates/go/mqttclient/go.mod.jinja
+++ b/xrcg/templates/go/mqttclient/go.mod.jinja
@@ -9,17 +9,18 @@
{%- endfor -%}
module {{ project_name | snake }}
-go 1.21
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/eclipse/paho.golang v0.23.0
github.com/google/uuid v1.6.0
{%- if uses_data_package %}
github.com/username/{{ data_project_name | go_package }} v0.0.0
{%- endif %}
- github.com/stretchr/testify v1.8.4
- github.com/testcontainers/testcontainers-go v0.27.0
+ github.com/stretchr/testify v1.10.0
+ github.com/testcontainers/testcontainers-go v0.38.0
)
{%- if uses_data_package %}
diff --git a/xrcg/templates/go/mqttclient/{testdir}client_test.go.jinja b/xrcg/templates/go/mqttclient/{testdir}client_test.go.jinja
index 11747f43..73999ce7 100644
--- a/xrcg/templates/go/mqttclient/{testdir}client_test.go.jinja
+++ b/xrcg/templates/go/mqttclient/{testdir}client_test.go.jinja
@@ -32,7 +32,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
{%- if avro_messages %}
- "github.com/hamba/avro/v2"
+ "github.com/iskorotkov/avro/v2"
{%- endif %}
"github.com/testcontainers/testcontainers-go"
"github.com/testcontainers/testcontainers-go/wait"
diff --git a/xrcg/templates/go/producer/go.mod.jinja b/xrcg/templates/go/producer/go.mod.jinja
index c4171cfe..9af8d047 100644
--- a/xrcg/templates/go/producer/go.mod.jinja
+++ b/xrcg/templates/go/producer/go.mod.jinja
@@ -1,13 +1,14 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.21
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/google/uuid v1.6.0
github.com/username/{{ data_project_name | go_package }} v0.0.0
- github.com/stretchr/testify v1.8.4
+ github.com/stretchr/testify v1.10.0
)
replace github.com/username/{{ data_project_name | go_package }} => ../{{ data_project_name }}
diff --git a/xrcg/templates/go/producer/{testdir}producer_test.go.jinja b/xrcg/templates/go/producer/{testdir}producer_test.go.jinja
index cd1142dc..f8d6df84 100644
--- a/xrcg/templates/go/producer/{testdir}producer_test.go.jinja
+++ b/xrcg/templates/go/producer/{testdir}producer_test.go.jinja
@@ -29,7 +29,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
{%- if avro_messages %}
- "github.com/hamba/avro/v2"
+ "github.com/iskorotkov/avro/v2"
{%- endif %}
{%- if _t_uses_data %}
diff --git a/xrcg/templates/go/sbconsumer/go.mod.jinja b/xrcg/templates/go/sbconsumer/go.mod.jinja
index 424be21b..2d8d7578 100644
--- a/xrcg/templates/go/sbconsumer/go.mod.jinja
+++ b/xrcg/templates/go/sbconsumer/go.mod.jinja
@@ -1,9 +1,10 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.23.0
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.9.0
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/stretchr/testify v1.10.0
diff --git a/xrcg/templates/go/sbproducer/go.mod.jinja b/xrcg/templates/go/sbproducer/go.mod.jinja
index 68150818..98310ac5 100644
--- a/xrcg/templates/go/sbproducer/go.mod.jinja
+++ b/xrcg/templates/go/sbproducer/go.mod.jinja
@@ -1,9 +1,10 @@
{%- import "util.jinja.include" as util -%}
module {{ project_name | snake }}
-go 1.23.0
+go 1.26.0
require (
+ {{ dependency("go", "go121", "golang.org/x/net") }}
github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.9.0
github.com/cloudevents/sdk-go/v2 v2.15.2
github.com/google/uuid v1.6.0
diff --git a/xrcg/templates/go/sbproducer/{testdir}producer_test.go.jinja b/xrcg/templates/go/sbproducer/{testdir}producer_test.go.jinja
index ac23f44a..e176608b 100644
--- a/xrcg/templates/go/sbproducer/{testdir}producer_test.go.jinja
+++ b/xrcg/templates/go/sbproducer/{testdir}producer_test.go.jinja
@@ -31,7 +31,7 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
{%- if avro_messages %}
- "github.com/hamba/avro/v2"
+ "github.com/iskorotkov/avro/v2"
{%- endif %}
{%- if live_is_ce %}
"github.com/testcontainers/testcontainers-go"
diff --git a/xrcg/templates/ts/_common/package.json.jinja.include b/xrcg/templates/ts/_common/package.json.jinja.include
index 0056aae1..6f3dcac1 100644
--- a/xrcg/templates/ts/_common/package.json.jinja.include
+++ b/xrcg/templates/ts/_common/package.json.jinja.include
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{%- macro DeclarePackageJson( packageName ) -%}
{
"name": "{{ packageName }}",
@@ -6,6 +7,7 @@
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"watch": "tsc --project tsconfig.json --watch",
"build:src": "tsc --project tsconfig.json",
@@ -29,24 +31,24 @@
"dependencies": {
"ajv": "^8.17.1",
"ajv-formats": "^3.0.1",
- "uuid": "^10.0.0",
- "cloudevents": "^8.0.2"
+ {{ dependency("ts", "node22", "uuid") }},
+ {{ dependency("ts", "node22", "cloudevents") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^10.0.0",
- "@typescript-eslint/eslint-plugin": "^8.8.1",
- "@typescript-eslint/parser": "^8.8.1",
- "@stylistic/eslint-plugin": "^2.9.0",
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/eslint-plugin") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/parser") }},
+ {{ dependency("ts", "node22", "@stylistic/eslint-plugin") }},
"ajv-cli": "^5.0.0",
- "eslint": "^9.12.0",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "ts-node": "^10.9.2",
- "typedoc": "^0.26.8",
- "typescript": "^5.6.3",
+ {{ dependency("ts", "node22", "eslint") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "ts-node") }},
+ {{ dependency("ts", "node22", "typedoc") }},
+ {{ dependency("ts", "node22", "typescript") }},
"webpack": "^5.95.0",
"webpack-cli": "^5.1.4"
},
diff --git a/xrcg/templates/ts/_common/util.jinja.include b/xrcg/templates/ts/_common/util.jinja.include
index a6f82fdc..d0ef2937 100644
--- a/xrcg/templates/ts/_common/util.jinja.include
+++ b/xrcg/templates/ts/_common/util.jinja.include
@@ -1,5 +1,17 @@
{# Utility macros for TypeScript templates #}
+{% macro DependencyOverrides() -%}
+{
+ "deepmerge": "npm:@stackline/deepmerge@1.1.0",
+ "cloudevents": {"uuid": "^11.1.1"},
+ "uuid@>=7 <11.1.1": "^11.1.1",
+ "ajv-cli": {"fast-json-patch": "^3.1.1"},
+ "@typescript-eslint/typescript-estree": {"minimatch": "^11.0.1"},
+ "minimatch@>=9": "^11.0.1",
+ "glob@>=9": "^14.0.3"
+}
+{%- endmacro %}
+
{% macro CommonFileHeader() %}
// This code was auto-generated by xRegistry CLI
{% endmacro %}
diff --git a/xrcg/templates/ts/amqpconsumer/package.json.jinja b/xrcg/templates/ts/amqpconsumer/package.json.jinja
index 3b263822..333dc818 100644
--- a/xrcg/templates/ts/amqpconsumer/package.json.jinja
+++ b/xrcg/templates/ts/amqpconsumer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-amqp-consumer",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "AMQP 1.0 Consumer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,16 +14,16 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "rhea": "^3.0.0",
- "cloudevents": "^8.0.2"
+ {{ dependency("ts", "node22", "rhea") }},
+ {{ dependency("ts", "node22", "cloudevents") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3",
- "testcontainers": "^10.0.0"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }},
+ {{ dependency("ts", "node22", "testcontainers") }}
}
}
diff --git a/xrcg/templates/ts/amqpproducer/package.json.jinja b/xrcg/templates/ts/amqpproducer/package.json.jinja
index 3d56e234..2981bf32 100644
--- a/xrcg/templates/ts/amqpproducer/package.json.jinja
+++ b/xrcg/templates/ts/amqpproducer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-amqp-producer",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "AMQP 1.0 Producer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,17 +14,17 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "rhea": "^3.0.0",
- "cloudevents": "^8.0.2",
- "uuid": "^9.0.0"
+ {{ dependency("ts", "node22", "rhea") }},
+ {{ dependency("ts", "node22", "cloudevents") }},
+ {{ dependency("ts", "node22", "uuid") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^9.0.0",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/dashboard/dashboard-backend/package.json.jinja b/xrcg/templates/ts/dashboard/dashboard-backend/package.json.jinja
index 569d392e..bf56b04d 100644
--- a/xrcg/templates/ts/dashboard/dashboard-backend/package.json.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-backend/package.json.jinja
@@ -1,11 +1,13 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{project_name|dotdash|lower}}-dashboard-backend",
"version": "1.0.0",
"description": "Backend server for dashboard",
"type": "module",
"main": "dist/index.js",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
- "build": "tsc && cpx \"public/**/*\" dist/public",
+ "build": "tsc && node -e \"const fs = require('node:fs'); if (fs.existsSync('public')) fs.cpSync('public', 'dist/public', { recursive: true })\"",
"start": "node dist/index.js",
"dev": "ts-node src/index.ts",
"debug": "nodemon --inspect --watch 'src/**/*.ts' --exec 'ts-node' src/index.ts"
@@ -16,20 +18,19 @@
"dependencies": {
"async-sema": "3.1.1",
"azure-kusto-data": "^6.0.2",
- "cloudevents": "^8.0.2",
+ {{ dependency("ts", "node22", "cloudevents") }},
"dotenv": "^16.4.5",
"express": "^4.21.0",
- "kafkajs": "^2.2.4",
+ {{ dependency("ts", "node22", "kafkajs") }},
"pako": "^2.1.0",
"socket.io": "^4.8.0",
"winston": "^3.14.2"
},
"devDependencies": {
"@types/express": "^4.17.21",
- "@types/node": "^22.7.5",
- "cpx": "^1.5.0",
+ {{ dependency("ts", "node22", "@types/node") }},
"nodemon": "^3.0.1",
- "ts-node": "^10.9.2",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "ts-node") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/dashboard/dashboard-backend/src/clientManager.ts.jinja b/xrcg/templates/ts/dashboard/dashboard-backend/src/clientManager.ts.jinja
index 569d993b..c37c4b24 100644
--- a/xrcg/templates/ts/dashboard/dashboard-backend/src/clientManager.ts.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-backend/src/clientManager.ts.jinja
@@ -88,7 +88,7 @@ export class ClientManager {
});
}
- private createCloudEventFromRow(row: Record): CloudEvent {
+ private createCloudEventFromRow(row: Record): CloudEvent> {
const cloudEvent: Record = {};
const data: Record = {};
diff --git a/xrcg/templates/ts/dashboard/dashboard-backend/src/kafkaConsumer.ts.jinja b/xrcg/templates/ts/dashboard/dashboard-backend/src/kafkaConsumer.ts.jinja
index a4722728..7bc8b444 100644
--- a/xrcg/templates/ts/dashboard/dashboard-backend/src/kafkaConsumer.ts.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-backend/src/kafkaConsumer.ts.jinja
@@ -39,14 +39,13 @@ export class KafkaConsumer {
clientId: 'my-app',
brokers: config.KAFKA_BROKERS.split(','),
ssl: config.KAFKA_SSL === 'true',
- sasl:
- config.KAFKA_USERNAME && config.KAFKA_PASSWORD
- ? {
- mechanism: 'plain',
+ ...(config.KAFKA_USERNAME && config.KAFKA_PASSWORD
+ ? { sasl: {
+ mechanism: 'plain' as const,
username: config.KAFKA_USERNAME,
password: config.KAFKA_PASSWORD,
- }
- : undefined,
+ } }
+ : {}),
});
this.consumer = kafka.consumer({ groupId: config.CONSUMER_GROUP });
diff --git a/xrcg/templates/ts/dashboard/dashboard-backend/src/kqlClient.ts.jinja b/xrcg/templates/ts/dashboard/dashboard-backend/src/kqlClient.ts.jinja
index 89b72883..57c76d90 100644
--- a/xrcg/templates/ts/dashboard/dashboard-backend/src/kqlClient.ts.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-backend/src/kqlClient.ts.jinja
@@ -49,7 +49,8 @@ export class KqlClient {
`strcmp( ___tid, "${fromTime.toISOString()}") >= 0 and strcmp(___tid, "${toTime.toISOString()}") <= 0`
);
} else {
- filterStrings.push(`strcmp(___tid,strcat(datetime("${value.toISOString()}"), ___id)) >= 0`);
+ const fromTime = value instanceof Date ? value : new Date(value);
+ filterStrings.push(`strcmp(___tid,strcat(datetime("${fromTime.toISOString()}"), ___id)) >= 0`);
}
} else if (typeof value === 'string') {
filterStrings.push(`${key} startswith "${value}"`);
diff --git a/xrcg/templates/ts/dashboard/dashboard-frontend/angular.json.jinja b/xrcg/templates/ts/dashboard/dashboard-frontend/angular.json.jinja
index 1caefe71..05795b30 100644
--- a/xrcg/templates/ts/dashboard/dashboard-frontend/angular.json.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-frontend/angular.json.jinja
@@ -25,6 +25,9 @@
],
"tsConfig": "tsconfig.app.json",
"inlineStyleLanguage": "less",
+ "optimization": {
+ "fonts": false
+ },
"assets": [
"src/favicon.ico",
"src/assets"
@@ -65,10 +68,10 @@
"builder": "@angular-devkit/build-angular:dev-server",
"configurations": {
"production": {
- "browserTarget": "dashboard-frontend:build:production"
+ "buildTarget": "dashboard-frontend:build:production"
},
"development": {
- "browserTarget": "dashboard-frontend:build:development"
+ "buildTarget": "dashboard-frontend:build:development"
}
},
"defaultConfiguration": "development"
@@ -76,7 +79,7 @@
"extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n",
"options": {
- "browserTarget": "dashboard-frontend:build"
+ "buildTarget": "dashboard-frontend:build"
}
},
"test": {
diff --git a/xrcg/templates/ts/dashboard/dashboard-frontend/package.json.jinja b/xrcg/templates/ts/dashboard/dashboard-frontend/package.json.jinja
index ddbf5344..cd44cb82 100644
--- a/xrcg/templates/ts/dashboard/dashboard-frontend/package.json.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-frontend/package.json.jinja
@@ -1,7 +1,9 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{project_name|dotdash|lower}}-dashboard-frontend",
"version": "0.0.0",
"type": "module",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"ng": "ng",
"start": "ng serve",
@@ -11,31 +13,32 @@
},
"private": true,
"dependencies": {
- "@angular/animations": "^18.2.5",
- "@angular/common": "^18.2.5",
- "@angular/compiler": "^18.2.5",
- "@angular/core": "^18.2.5",
- "@angular/forms": "^18.2.5",
- "@angular/platform-browser": "^18.2.5",
- "@angular/platform-browser-dynamic": "^18.2.5",
- "@angular/router": "^18.2.5",
+ "@angular/animations": "^21.2.25",
+ "@angular/common": "^21.2.25",
+ "@angular/compiler": "^21.2.25",
+ "@angular/core": "^21.2.25",
+ "@angular/forms": "^21.2.25",
+ "@angular/platform-browser": "^21.2.25",
+ "@angular/platform-browser-dynamic": "^21.2.25",
+ "@angular/router": "^21.2.25",
+ {{ dependency("ts", "node22", "cloudevents") }},
+ "buffer": "^6.0.3",
+ "util": "^0.12.5",
"@types/d3": "7.4.3",
"d3": "7.9.0",
"dashboard-frontend": "file:",
- "glob": "^11.0.0",
"{{project_name|dotunderscore|lower}}_data": "file:../{{project_name|dotunderscore|lower}}_data",
- "rollup": "^4.22.4",
"rxjs": "^7.8.1",
"socket.io-client": "4.8.0",
"tslib": "^2.7.0",
"typedjson": "1.8.0",
- "zone.js": "^0.14.10"
+ "zone.js": "~0.15.1"
},
"devDependencies": {
- "@angular-devkit/build-angular": "^18.2.5",
- "@angular/build": "^18.2.5",
- "@angular/cli": "^18.2.5",
- "@angular/compiler-cli": "^18.2.5",
+ "@angular-devkit/build-angular": "^21.2.29",
+ "@angular/build": "^21.2.29",
+ "@angular/cli": "^21.2.29",
+ "@angular/compiler-cli": "^21.2.25",
"@types/jasmine": "^5.1.4",
"jasmine-core": "5.3.0",
"karma": "~6.4.0",
@@ -44,9 +47,6 @@
"karma-jasmine": "~5.1.0",
"karma-jasmine-html-reporter": "2.1.0",
"rimraf": "^6.0.1",
- "rollup": "4.22.4",
- "typescript": "5.4.5",
- "undici": "6.19.8",
- "vite": "5.4.8"
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.less.jinja b/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.less.jinja
index 40216724..8410bf11 100644
--- a/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.less.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.less.jinja
@@ -1,5 +1,5 @@
/* Ensure font is loaded */
-@import url("https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap");
+@import (css) url("https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap");
body {
font-family: 'Roboto', sans-serif;
diff --git a/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.ts.jinja b/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.ts.jinja
index aa46d1ad..fc99e71c 100644
--- a/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.ts.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-frontend/src/app/app.component.ts.jinja
@@ -24,6 +24,7 @@ import * as d3 from 'd3';
import { TypedJSON } from 'typedjson';
@Component({
+ standalone: false,
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.less'],
diff --git a/xrcg/templates/ts/dashboard/dashboard-frontend/tsconfig.json.jinja b/xrcg/templates/ts/dashboard/dashboard-frontend/tsconfig.json.jinja
index e39f72c9..33bf2482 100644
--- a/xrcg/templates/ts/dashboard/dashboard-frontend/tsconfig.json.jinja
+++ b/xrcg/templates/ts/dashboard/dashboard-frontend/tsconfig.json.jinja
@@ -3,6 +3,10 @@
"compileOnSave": false,
"compilerOptions": {
"baseUrl": "./",
+ "paths": {
+ "buffer": ["node_modules/buffer", "../node_modules/buffer"],
+ "util": ["node_modules/util", "../node_modules/util"]
+ },
"outDir": "./dist/out-tsc",
"forceConsistentCasingInFileNames": true,
"strict": true,
diff --git a/xrcg/templates/ts/dashboard/package.json.jinja b/xrcg/templates/ts/dashboard/package.json.jinja
index 3bce07ad..03a5ce28 100644
--- a/xrcg/templates/ts/dashboard/package.json.jinja
+++ b/xrcg/templates/ts/dashboard/package.json.jinja
@@ -1,6 +1,8 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "dashboard",
"version": "1.0.0",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"bootstrap": "npm install",
"build": "npm run build --workspaces",
diff --git a/xrcg/templates/ts/egproducer/jest.config.js.jinja b/xrcg/templates/ts/egproducer/jest.config.js.jinja
index c9c171aa..e7e8573c 100644
--- a/xrcg/templates/ts/egproducer/jest.config.js.jinja
+++ b/xrcg/templates/ts/egproducer/jest.config.js.jinja
@@ -10,11 +10,12 @@ export default {
'ts-jest',
{
useESM: true,
+ tsconfig: { allowJs: true },
},
],
},
transformIgnorePatterns: [
- '/node_modules/',
+ '/node_modules/(?!(?:https-proxy-agent|http-proxy-agent|agent-base|proxy-agent-negotiate)/)',
],
testMatch: ['**/test/**/*.test.ts'],
collectCoverageFrom: ['src/**/*.ts'],
diff --git a/xrcg/templates/ts/egproducer/package.json.jinja b/xrcg/templates/ts/egproducer/package.json.jinja
index 120bd01c..0f72d2a3 100644
--- a/xrcg/templates/ts/egproducer/package.json.jinja
+++ b/xrcg/templates/ts/egproducer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-eventgrid-producer",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "Azure Event Grid Producer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,19 +14,19 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "@azure/eventgrid": "^5.0.0",
- "@azure/identity": "^4.0.0",
- "cloudevents": "^8.0.2",
- "uuid": "^9.0.0"
+ {{ dependency("ts", "node22", "@azure/eventgrid") }},
+ {{ dependency("ts", "node22", "@azure/identity") }},
+ {{ dependency("ts", "node22", "cloudevents") }},
+ {{ dependency("ts", "node22", "uuid") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^9.0.0",
- "jest": "^29.7.0",
- "nock": "^13.5.0",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "nock") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/egproducer/src/producer.ts.jinja b/xrcg/templates/ts/egproducer/src/producer.ts.jinja
index e0602f4e..49bb139a 100644
--- a/xrcg/templates/ts/egproducer/src/producer.ts.jinja
+++ b/xrcg/templates/ts/egproducer/src/producer.ts.jinja
@@ -130,7 +130,8 @@ export class {{ class_name }} {
datacontenttype: contentType
});
- await this.client.send([cloudEvent]);
+ const { time, ...event } = cloudEvent;
+ await this.client.send([{ ...event, ...(time ? { time: new Date(time) } : {}) }]);
}
/**
@@ -185,7 +186,10 @@ export class {{ class_name }} {
});
});
- await this.client.send(events);
+ await this.client.send(events.map(({ time, ...event }) => ({
+ ...event,
+ ...(time ? { time: new Date(time) } : {}),
+ })));
}
{% endfor %}
}
diff --git a/xrcg/templates/ts/ehconsumer/package.json.jinja b/xrcg/templates/ts/ehconsumer/package.json.jinja
index 62dfdce0..0207207d 100644
--- a/xrcg/templates/ts/ehconsumer/package.json.jinja
+++ b/xrcg/templates/ts/ehconsumer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | snake | replace('_', '-') }}",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "Azure Event Hubs consumer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"watch": "tsc --watch",
@@ -18,22 +20,22 @@
"author": "",
"license": "MIT",
"dependencies": {
- "@azure/event-hubs": "^5.11.0",
+ {{ dependency("ts", "node22", "@azure/event-hubs") }},
"@azure/storage-blob": "^12.17.0",
- "@azure/identity": "^4.0.0",
- "cloudevents": "^8.0.2"
+ {{ dependency("ts", "node22", "@azure/identity") }},
+ {{ dependency("ts", "node22", "cloudevents") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@typescript-eslint/eslint-plugin": "^8.8.1",
- "@typescript-eslint/parser": "^8.8.1",
- "@stylistic/eslint-plugin": "^2.9.0",
- "eslint": "^9.12.0",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "ts-node": "^10.9.0",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/eslint-plugin") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/parser") }},
+ {{ dependency("ts", "node22", "@stylistic/eslint-plugin") }},
+ {{ dependency("ts", "node22", "eslint") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "ts-node") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/ehproducer/package.json.jinja b/xrcg/templates/ts/ehproducer/package.json.jinja
index 3c8f1c8f..4ba3bd2f 100644
--- a/xrcg/templates/ts/ehproducer/package.json.jinja
+++ b/xrcg/templates/ts/ehproducer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-eventhubs-producer",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "Azure Event Hubs Producer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,19 +14,19 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "@azure/event-hubs": "^5.11.0",
- "@azure/identity": "^4.0.0",
- "cloudevents": "^8.0.2",
- "uuid": "^9.0.0"
+ {{ dependency("ts", "node22", "@azure/event-hubs") }},
+ {{ dependency("ts", "node22", "@azure/identity") }},
+ {{ dependency("ts", "node22", "cloudevents") }},
+ {{ dependency("ts", "node22", "uuid") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^9.0.0",
- "jest": "^29.7.0",
- "testcontainers": "^10.0.0",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "testcontainers") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/kafkaconsumer/package.json.jinja b/xrcg/templates/ts/kafkaconsumer/package.json.jinja
index cab62e57..68d5aa4a 100644
--- a/xrcg/templates/ts/kafkaconsumer/package.json.jinja
+++ b/xrcg/templates/ts/kafkaconsumer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | snake | replace('_', '-') }}",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"type": "module",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"watch": "tsc --watch",
@@ -18,22 +20,22 @@
"author": "",
"license": "MIT",
"dependencies": {
- "kafkajs": "^2.2.4",
- "cloudevents": "^8.0.2"
+ {{ dependency("ts", "node22", "kafkajs") }},
+ {{ dependency("ts", "node22", "cloudevents") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@typescript-eslint/eslint-plugin": "^8.8.1",
- "@typescript-eslint/parser": "^8.8.1",
- "@stylistic/eslint-plugin": "^2.9.0",
- "eslint": "^9.12.0",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "ts-node": "^10.9.2",
- "typescript": "^5.6.3",
- "testcontainers": "^10.13.2",
- "@testcontainers/kafka": "^11.7.2"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/eslint-plugin") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/parser") }},
+ {{ dependency("ts", "node22", "@stylistic/eslint-plugin") }},
+ {{ dependency("ts", "node22", "eslint") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "ts-node") }},
+ {{ dependency("ts", "node22", "typescript") }},
+ {{ dependency("ts", "node22", "testcontainers") }},
+ {{ dependency("ts", "node22", "@testcontainers/kafka") }}
}
}
diff --git a/xrcg/templates/ts/kafkaproducer/package.json.jinja b/xrcg/templates/ts/kafkaproducer/package.json.jinja
index edb20d35..b88968ed 100644
--- a/xrcg/templates/ts/kafkaproducer/package.json.jinja
+++ b/xrcg/templates/ts/kafkaproducer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | snake | replace('_', '-') }}",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "Kafka producer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"watch": "tsc --watch",
@@ -18,24 +20,24 @@
"author": "",
"license": "MIT",
"dependencies": {
- "kafkajs": "^2.2.4",
- "cloudevents": "^8.0.2",
- "uuid": "^9.0.0"
+ {{ dependency("ts", "node22", "kafkajs") }},
+ {{ dependency("ts", "node22", "cloudevents") }},
+ {{ dependency("ts", "node22", "uuid") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^9.0.0",
- "@typescript-eslint/eslint-plugin": "^8.8.1",
- "@typescript-eslint/parser": "^8.8.1",
- "@stylistic/eslint-plugin": "^2.9.0",
- "eslint": "^9.12.0",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "ts-node": "^10.9.0",
- "typescript": "^5.6.3",
- "testcontainers": "^10.0.0",
- "@testcontainers/kafka": "^11.7.2"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/eslint-plugin") }},
+ {{ dependency("ts", "node22", "@typescript-eslint/parser") }},
+ {{ dependency("ts", "node22", "@stylistic/eslint-plugin") }},
+ {{ dependency("ts", "node22", "eslint") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "ts-node") }},
+ {{ dependency("ts", "node22", "typescript") }},
+ {{ dependency("ts", "node22", "testcontainers") }},
+ {{ dependency("ts", "node22", "@testcontainers/kafka") }}
}
}
diff --git a/xrcg/templates/ts/mqttclient/package.json.jinja b/xrcg/templates/ts/mqttclient/package.json.jinja
index de794a11..612b6950 100644
--- a/xrcg/templates/ts/mqttclient/package.json.jinja
+++ b/xrcg/templates/ts/mqttclient/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-mqtt-client",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "MQTT Client for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,18 +14,18 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "mqtt": "^5.0.0",
- "cloudevents": "^8.0.2",
- "uuid": "^9.0.0"
+ {{ dependency("ts", "node22", "mqtt") }},
+ {{ dependency("ts", "node22", "cloudevents") }},
+ {{ dependency("ts", "node22", "uuid") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^9.0.0",
- "aedes": "^0.51.0",
- "jest": "^29.7.0",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "aedes") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/mqttclient/src/client.ts.jinja b/xrcg/templates/ts/mqttclient/src/client.ts.jinja
index 036cdbb2..c5af9a99 100644
--- a/xrcg/templates/ts/mqttclient/src/client.ts.jinja
+++ b/xrcg/templates/ts/mqttclient/src/client.ts.jinja
@@ -123,7 +123,7 @@ export class {{ class_name }} {
* {{ message.description }}
{%- endif %}
*/
- public {{ messagename }}Handler?: ({% if isCloudEvent %}cloudEvent: CloudEvent, {% endif %}data: {{ message_body_type }}, topicParams: Record) => Promise;
+ public {{ messagename }}Handler?: ({% if isCloudEvent %}cloudEvent: CloudEvent, {% endif %}data: {{ message_body_type }}, topicParams: Record) => Promise;
{%- endfor %}
/**
@@ -275,7 +275,7 @@ export class {{ class_name }} {
});
const cloudEvent = Array.isArray(result) ? result[0] : result;
if (cloudEvent) {
- await this.dispatchCloudEvent(topic, cloudEvent);
+ await this.dispatchCloudEvent(topic, new CloudEvent(cloudEvent));
return;
}
}
diff --git a/xrcg/templates/ts/mqttclient/test/client.test.ts.jinja b/xrcg/templates/ts/mqttclient/test/client.test.ts.jinja
index 8c1c6ac2..af625dcd 100644
--- a/xrcg/templates/ts/mqttclient/test/client.test.ts.jinja
+++ b/xrcg/templates/ts/mqttclient/test/client.test.ts.jinja
@@ -167,7 +167,7 @@ describe('{{ test_class_name }}', () => {
await new Promise(resolve => setTimeout(resolve, 500));
const received: Array<{
- cloudEvent: CloudEvent;
+ cloudEvent: CloudEvent;
data: {{ body_type }};
topicParams: Record;
}> = [];
@@ -175,7 +175,7 @@ describe('{{ test_class_name }}', () => {
const donePromise = new Promise(resolve => { _resolve = resolve; });
subscriber.{{ messagename }}Handler = async (
- cloudEvent: CloudEvent,
+ cloudEvent: CloudEvent,
data: {{ body_type }},
topicParams: Record,
) => {
@@ -229,9 +229,9 @@ describe('{{ test_class_name }}', () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
jest.spyOn((client as any).client as mqtt.MqttClient, 'publish').mockImplementation(
// eslint-disable-next-line @typescript-eslint/no-explicit-any
- (t: any, p: any, o: any, cb?: (err?: Error | null) => void) => {
+ (t: any, p: any, o: any, cb?: mqtt.PacketCallback) => {
captured.push({ topic: String(t), payload: String(p), opts: o as mqtt.IClientPublishOptions });
- cb?.(null);
+ cb?.();
// eslint-disable-next-line @typescript-eslint/no-explicit-any
return (client as any).client;
},
@@ -274,9 +274,9 @@ describe('{{ test_class_name }}', () => {
test('{{ messagename }}: binary-mode User Property decoding (no-broker)', async () => {
// Tests handleMessage with a simulated MQTT5 PUBLISH packet carrying CE User Properties.
const client = new {{ class_name }}('mqtt://localhost:1', { manualConnect: true }, undefined, 'binary');
- const received: Array<{ cloudEvent: CloudEvent; data: {{ body_type }}; topicParams: Record }> = [];
+ const received: Array<{ cloudEvent: CloudEvent; data: {{ body_type }}; topicParams: Record }> = [];
client.{{ messagename }}Handler = async (
- cloudEvent: CloudEvent,
+ cloudEvent: CloudEvent,
data: {{ body_type }},
topicParams: Record,
) => {
diff --git a/xrcg/templates/ts/sbconsumer/jest.config.js.jinja b/xrcg/templates/ts/sbconsumer/jest.config.js.jinja
index c9c171aa..e7e8573c 100644
--- a/xrcg/templates/ts/sbconsumer/jest.config.js.jinja
+++ b/xrcg/templates/ts/sbconsumer/jest.config.js.jinja
@@ -10,11 +10,12 @@ export default {
'ts-jest',
{
useESM: true,
+ tsconfig: { allowJs: true },
},
],
},
transformIgnorePatterns: [
- '/node_modules/',
+ '/node_modules/(?!(?:https-proxy-agent|http-proxy-agent|agent-base|proxy-agent-negotiate)/)',
],
testMatch: ['**/test/**/*.test.ts'],
collectCoverageFrom: ['src/**/*.ts'],
diff --git a/xrcg/templates/ts/sbconsumer/package.json.jinja b/xrcg/templates/ts/sbconsumer/package.json.jinja
index 77f51d2e..a81f244e 100644
--- a/xrcg/templates/ts/sbconsumer/package.json.jinja
+++ b/xrcg/templates/ts/sbconsumer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-servicebus-consumer",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "Azure Service Bus Consumer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,17 +14,17 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "@azure/service-bus": "^7.9.0",
- "@azure/identity": "^4.0.0",
- "cloudevents": "^8.0.2"
+ {{ dependency("ts", "node22", "@azure/service-bus") }},
+ {{ dependency("ts", "node22", "@azure/identity") }},
+ {{ dependency("ts", "node22", "cloudevents") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "jest": "^29.7.0",
- "testcontainers": "^10.16.0",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "testcontainers") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}
diff --git a/xrcg/templates/ts/sbproducer/jest.config.js.jinja b/xrcg/templates/ts/sbproducer/jest.config.js.jinja
index c9c171aa..e7e8573c 100644
--- a/xrcg/templates/ts/sbproducer/jest.config.js.jinja
+++ b/xrcg/templates/ts/sbproducer/jest.config.js.jinja
@@ -10,11 +10,12 @@ export default {
'ts-jest',
{
useESM: true,
+ tsconfig: { allowJs: true },
},
],
},
transformIgnorePatterns: [
- '/node_modules/',
+ '/node_modules/(?!(?:https-proxy-agent|http-proxy-agent|agent-base|proxy-agent-negotiate)/)',
],
testMatch: ['**/test/**/*.test.ts'],
collectCoverageFrom: ['src/**/*.ts'],
diff --git a/xrcg/templates/ts/sbproducer/package.json.jinja b/xrcg/templates/ts/sbproducer/package.json.jinja
index e5dd9145..576d49c6 100644
--- a/xrcg/templates/ts/sbproducer/package.json.jinja
+++ b/xrcg/templates/ts/sbproducer/package.json.jinja
@@ -1,3 +1,4 @@
+{%- import "util.jinja.include" as util -%}
{
"name": "{{ project_name | lower | replace('.', '-') }}-servicebus-producer",
"version": "1.0.0",
@@ -5,6 +6,7 @@
"description": "Azure Service Bus Producer for {{ project_name }}",
"main": "dist/index.js",
"types": "dist/index.d.ts",
+ "overrides": {{ util.DependencyOverrides() }},
"scripts": {
"build": "tsc",
"test": "jest",
@@ -12,19 +14,19 @@
"clean": "rm -rf dist"
},
"dependencies": {
- "@azure/service-bus": "^7.9.0",
- "@azure/identity": "^4.0.0",
- "cloudevents": "^8.0.2",
- "uuid": "^9.0.0"
+ {{ dependency("ts", "node22", "@azure/service-bus") }},
+ {{ dependency("ts", "node22", "@azure/identity") }},
+ {{ dependency("ts", "node22", "cloudevents") }},
+ {{ dependency("ts", "node22", "uuid") }}
},
"devDependencies": {
- "@jest/globals": "^29.7.0",
- "@types/jest": "^29.5.12",
- "@types/node": "^22.7.5",
- "@types/uuid": "^9.0.0",
- "jest": "^29.7.0",
- "testcontainers": "^10.13.2",
- "ts-jest": "^29.2.5",
- "typescript": "^5.6.3"
+ {{ dependency("ts", "node22", "@jest/globals") }},
+ {{ dependency("ts", "node22", "@types/jest") }},
+ {{ dependency("ts", "node22", "@types/node") }},
+ {{ dependency("ts", "node22", "@types/uuid") }},
+ {{ dependency("ts", "node22", "jest") }},
+ {{ dependency("ts", "node22", "testcontainers") }},
+ {{ dependency("ts", "node22", "ts-jest") }},
+ {{ dependency("ts", "node22", "typescript") }}
}
}