From 7d4726c0b491e915b0897925ec761093d0afae70 Mon Sep 17 00:00:00 2001 From: Oscar Tisnado <68830577+otisnado@users.noreply.github.com> Date: Wed, 11 Dec 2024 11:58:06 -0600 Subject: [PATCH 1/4] add boxlang to matrix and update ci tests --- .cfconfig.json | 1 + .github/workflows/tests.yml | 30 +++++++++++++++++++----------- box.json | 2 +- server-adobe@2021.json | 22 ++++++++++++++++++++++ server-adobe@2023.json | 22 ++++++++++++++++++++++ server-boxlang@1.json | 36 ++++++++++++++++++++++++++++++++++++ server-lucee@5.json | 24 ++++++++++++++++++++++++ server-lucee@6.json | 24 ++++++++++++++++++++++++ 8 files changed, 149 insertions(+), 12 deletions(-) create mode 100644 .cfconfig.json create mode 100755 server-adobe@2021.json create mode 100755 server-adobe@2023.json create mode 100644 server-boxlang@1.json create mode 100644 server-lucee@5.json create mode 100644 server-lucee@6.json diff --git a/.cfconfig.json b/.cfconfig.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.cfconfig.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index e486637..eb66655 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -7,10 +7,17 @@ jobs: tests: name: Tests runs-on: ubuntu-20.04 + continue-on-error: ${{ matrix.experimental }} strategy: fail-fast: false matrix: cfengine: [ "lucee@5", "lucee@6", "adobe@2021", "adobe@2023" ] + coldboxVersion: [ "^6.0.0", "^7.0.0" ] + experimental: [ false ] + include: + - coldboxVersion: "be" + cfengine: "boxlang@1" + experimental: true steps: - name: Checkout Repository uses: actions/checkout@v2 @@ -25,7 +32,7 @@ jobs: uses: Ortus-Solutions/setup-commandbox@main - name: Cache CommandBox Dependencies - uses: actions/cache@v1 + uses: actions/cache@v4 if: ${{ true }} with: path: ~/.CommandBox/artifacts @@ -35,47 +42,48 @@ jobs: - name: Install Test Harness Dependencies run: | + box package set dependencies.coldbox=${{ matrix.coldboxVersion }} box install - name: Start ${{ matrix.cfengine }} Server run: | - box server start cfengine=${{ matrix.cfengine }} port=49619 --noSaveSettings --debug + box server start serverConfigFile=${{ matrix.cfengine }}.json --noSaveSettings --debug # Install Adobe 2021 cfpm modules if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then box run-script install:2021 fi - curl http://127.0.0.1:49619 + curl http://127.0.0.1:60299 - name: Run Tests run: | mkdir -p tests/results - box testbox run runner=http://127.0.0.1:49619/tests/runner.cfm --verbose outputFile=tests/results/test-results outputFormats=json,antjunit + box testbox run runner=http://127.0.0.1:60299/tests/runner.cfm --verbose outputFile=tests/results/test-results outputFormats=json,antjunit - name: Publish Test Results - uses: EnricoMi/publish-unit-test-result-action@v1 + uses: EnricoMi/publish-unit-test-result-action@v2 if: always() with: - files: tests/results/**/*.xml + junit_files: tests/results/**/*.xml check_name: "${{ matrix.cfengine }} Test Results" - name: Upload Test Results to Artifacts if: always() - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: - name: test-results-${{ matrix.cfengine }} + name: test-results-${{ matrix.cfengine }}-${{ matrix.coldboxVersion }} path: | tests/results/**/* - name: Show Server Log On Failures if: ${{ failure() }} run: | - box server log + box server log serverConfigFile="server-${{ matrix.cfengine }}.json" - name: Upload Debug Logs To Artifacts if: ${{ failure() }} - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: - name: Failure Debugging Info - ${{ matrix.cfengine }} + name: Failure Debugging Info - ${{ matrix.cfengine }} - ${{ matrix.coldboxVersion }} path: | .engine/**/logs/* .engine/**/WEB-INF/cfusion/logs/* diff --git a/box.json b/box.json index f46b17d..56c484d 100755 --- a/box.json +++ b/box.json @@ -27,7 +27,7 @@ "testbox":"testbox/" }, "testbox":{ - "runner":"http://localhost:49616" + "runner":"http://localhost:60299" }, "scripts":{ "format":"cfformat run modules/sendgrid-sdk/**/*.cfc,tests/resources/**/*.cfc,tests/specs/**/*.cfc --overwrite", diff --git a/server-adobe@2021.json b/server-adobe@2021.json new file mode 100755 index 0000000..9bd7f43 --- /dev/null +++ b/server-adobe@2021.json @@ -0,0 +1,22 @@ +{ + "force":true, + "openbrowser":"false", + "name": "sendgrid-sdk-adobe@2021", + "web":{ + "directoryBrowsing":true, + "http":{ + "port":"60299" + }, + "rewrites":{ + "enable":"true" + }, + "webroot":"./", + "aliases":{ + "/moduleroot/sendgrid-sdk":"./" + } + }, + "app":{ + "serverHomeDirectory":".engine/adobe2021", + "cfengine":"adobe@2021" + } +} \ No newline at end of file diff --git a/server-adobe@2023.json b/server-adobe@2023.json new file mode 100755 index 0000000..d43db04 --- /dev/null +++ b/server-adobe@2023.json @@ -0,0 +1,22 @@ +{ + "force":true, + "openbrowser":"false", + "name": "sendgrid-sdk-adobe@2023", + "web":{ + "directoryBrowsing":true, + "http":{ + "port":"60299" + }, + "rewrites":{ + "enable":"true" + }, + "webroot":"./", + "aliases":{ + "/moduleroot/sendgrid-sdk":"./" + } + }, + "app":{ + "serverHomeDirectory":".engine/adobe2023", + "cfengine":"adobe@2023" + } +} \ No newline at end of file diff --git a/server-boxlang@1.json b/server-boxlang@1.json new file mode 100644 index 0000000..35ef13d --- /dev/null +++ b/server-boxlang@1.json @@ -0,0 +1,36 @@ +{ + "app":{ + "cfengine":"boxlang@be", + "serverHomeDirectory":".engine/boxlang" + }, + "name":"sendgrid-sdk-boxlang@1", + "force":true, + "openBrowser":false, + "web":{ + "directoryBrowsing":true, + "http":{ + "port":"60299" + }, + "rewrites":{ + "enable":"true" + }, + "webroot":"./", + "aliases":{ + "/moduleroot/sendgrid-sdk":"./" + } + }, + "JVM":{ + "heapSize":"1024", + "javaVersion":"openjdk21_jdk", + "args":"-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999" + }, + "cfconfig":{ + "file":".cfconfig.json" + }, + "env":{ + "BOXLANG_DEBUG":true + }, + "scripts":{ + "onServerInitialInstall":"install bx-mail,bx-mysql,bx-derby,bx-compat-cfml@be,bx-unsafe-evaluate,bx-esapi --noSave" + } +} \ No newline at end of file diff --git a/server-lucee@5.json b/server-lucee@5.json new file mode 100644 index 0000000..22fb488 --- /dev/null +++ b/server-lucee@5.json @@ -0,0 +1,24 @@ +{ + "name":"sendgrid-sdk-lucee@5", + "app":{ + "serverHomeDirectory":".engine/lucee5", + "cfengine":"lucee@5" + }, + "web":{ + "directoryBrowsing":true, + "http":{ + "port":"60299" + }, + "rewrites":{ + "enable":"true" + }, + "webroot":"./", + "aliases":{ + "/moduleroot/sendgrid-sdk":"./" + } + }, + "jvm":{ + "heapSize":"1024" + }, + "openBrowser":"false" +} diff --git a/server-lucee@6.json b/server-lucee@6.json new file mode 100644 index 0000000..d57ce1d --- /dev/null +++ b/server-lucee@6.json @@ -0,0 +1,24 @@ +{ + "name":"sendgrid-sdk-lucee@6", + "app":{ + "serverHomeDirectory":".engine/lucee6", + "cfengine":"lucee@6" + }, + "web":{ + "directoryBrowsing":true, + "http":{ + "port":"60299" + }, + "rewrites":{ + "enable":"true" + }, + "webroot":"./", + "aliases":{ + "/moduleroot/sendgrid-sdk":"./" + } + }, + "jvm":{ + "heapSize":"1024" + }, + "openBrowser":"false" +} From b4a007c1c02f0ceb2bd1ba430e1d830e28cbdc37 Mon Sep 17 00:00:00 2001 From: otisnado Date: Wed, 11 Dec 2024 17:59:08 +0000 Subject: [PATCH 2/4] Apply cfformat changes --- tests/resources/app/Application.cfc | 12 +++--- tests/resources/app/config/CacheBox.cfc | 2 +- tests/resources/app/config/Coldbox.cfc | 16 ++++---- tests/resources/app/config/Router.cfc | 11 ++--- tests/resources/app/config/Scheduler.cfc | 9 ++--- tests/resources/app/config/WireBox.cfc | 2 +- tests/resources/app/handlers/Main.cfc | 18 ++++----- tests/resources/app/tests/Application.cfc | 24 +++++------ .../app/tests/specs/integration/MainSpec.cfc | 40 +++++++++---------- tests/resources/app/views/Application.cfc | 14 ++++--- .../specs/integration/EmailValidationSpec.cfc | 3 +- 11 files changed, 73 insertions(+), 78 deletions(-) diff --git a/tests/resources/app/Application.cfc b/tests/resources/app/Application.cfc index 135c8ad..8972a31 100755 --- a/tests/resources/app/Application.cfc +++ b/tests/resources/app/Application.cfc @@ -28,7 +28,7 @@ component { COLDBOX_APP_KEY = ""; // application start - public boolean function onApplicationStart() { + public boolean function onApplicationStart(){ application.cbBootstrap = new coldbox.system.Bootstrap( COLDBOX_CONFIG_FILE, COLDBOX_APP_ROOT_PATH, @@ -40,27 +40,27 @@ component { } // application end - public void function onApplicationEnd( struct appScope ) { + public void function onApplicationEnd( struct appScope ){ arguments.appScope.cbBootstrap.onApplicationEnd( arguments.appScope ); } // request start - public boolean function onRequestStart( string targetPage ) { + public boolean function onRequestStart( string targetPage ){ // Process ColdBox Request application.cbBootstrap.onRequestStart( arguments.targetPage ); return true; } - public void function onSessionStart() { + public void function onSessionStart(){ application.cbBootStrap.onSessionStart(); } - public void function onSessionEnd( struct sessionScope, struct appScope ) { + public void function onSessionEnd( struct sessionScope, struct appScope ){ arguments.appScope.cbBootStrap.onSessionEnd( argumentCollection = arguments ); } - public boolean function onMissingTemplate( template ) { + public boolean function onMissingTemplate( template ){ return application.cbBootstrap.onMissingTemplate( argumentCollection = arguments ); } diff --git a/tests/resources/app/config/CacheBox.cfc b/tests/resources/app/config/CacheBox.cfc index 4c29c4b..0b0fc3f 100755 --- a/tests/resources/app/config/CacheBox.cfc +++ b/tests/resources/app/config/CacheBox.cfc @@ -3,7 +3,7 @@ component { /** * Configure CacheBox for ColdBox Application Operation */ - function configure() { + function configure(){ /** * -------------------------------------------------------------------------- * CacheBox Configuration (https://cachebox.ortusbooks.com) diff --git a/tests/resources/app/config/Coldbox.cfc b/tests/resources/app/config/Coldbox.cfc index d922893..7416dd2 100755 --- a/tests/resources/app/config/Coldbox.cfc +++ b/tests/resources/app/config/Coldbox.cfc @@ -3,7 +3,7 @@ component { /** * Configure the ColdBox App For Production */ - function configure() { + function configure(){ /** * -------------------------------------------------------------------------- * ColdBox Directives @@ -138,12 +138,12 @@ component { * } */ moduleSettings = { - "sendgrid-sdk" = { - "username" = "foo", - "password" = "bar", - "emailValidationAPIKey" = "[YOUR API KEY HERE]" - } - }; + "sendgrid-sdk" : { + "username" : "foo", + "password" : "bar", + "emailValidationAPIKey" : "[YOUR API KEY HERE]" + } + }; /** * -------------------------------------------------------------------------- @@ -177,7 +177,7 @@ component { /** * Development environment */ - function development() { + function development(){ // coldbox.customErrorTemplate = "/coldbox/system/exceptions/BugReport.cfm"; // static bug reports coldbox.customErrorTemplate = "/coldbox/system/exceptions/Whoops.cfm"; // interactive bug report } diff --git a/tests/resources/app/config/Router.cfc b/tests/resources/app/config/Router.cfc index 1aefc34..6703d13 100755 --- a/tests/resources/app/config/Router.cfc +++ b/tests/resources/app/config/Router.cfc @@ -1,6 +1,6 @@ component { - function configure() { + function configure(){ // Set Full Rewrites setFullRewrites( true ); @@ -15,16 +15,13 @@ component { */ // A nice healthcheck route example - route( "/healthcheck", function( event, rc, prc ) { + route( "/healthcheck", function( event, rc, prc ){ return "Ok!"; } ); // A nice RESTFul Route example - route( "/api/echo", function( event, rc, prc ) { - return { - "error" : false, - "data" : "Welcome to my awesome API!" - }; + route( "/api/echo", function( event, rc, prc ){ + return { "error" : false, "data" : "Welcome to my awesome API!" }; } ); // Conventions based routing diff --git a/tests/resources/app/config/Scheduler.cfc b/tests/resources/app/config/Scheduler.cfc index be0de30..b74d2e3 100755 --- a/tests/resources/app/config/Scheduler.cfc +++ b/tests/resources/app/config/Scheduler.cfc @@ -3,7 +3,7 @@ component { /** * Configure the ColdBox Scheduler */ - function configure() { + function configure(){ /** * -------------------------------------------------------------------------- * Configuration Methods @@ -22,7 +22,6 @@ component { * You register tasks with the task() method and get back a ColdBoxScheduledTask object * that you can use to register your tasks configurations. */ - } /** @@ -40,7 +39,7 @@ component { /** * Called whenever ANY task fails * - * @task The task that got executed + * @task The task that got executed * @exception The ColdFusion exception object */ function onAnyTaskError( required task, required exception ){ @@ -49,7 +48,7 @@ component { /** * Called whenever ANY task succeeds * - * @task The task that got executed + * @task The task that got executed * @result The result (if any) that the task produced */ function onAnyTaskSuccess( required task, result ){ @@ -66,7 +65,7 @@ component { /** * Called after ANY task runs * - * @task The task that got executed + * @task The task that got executed * @result The result (if any) that the task produced */ function afterAnyTask( required task, result ){ diff --git a/tests/resources/app/config/WireBox.cfc b/tests/resources/app/config/WireBox.cfc index 73a8abd..09f877d 100755 --- a/tests/resources/app/config/WireBox.cfc +++ b/tests/resources/app/config/WireBox.cfc @@ -3,7 +3,7 @@ component extends="coldbox.system.ioc.config.Binder" { /** * Configure WireBox, that's it! */ - function configure() { + function configure(){ /** * -------------------------------------------------------------------------- * WireBox Configuration (https://wirebox.ortusbooks.com) diff --git a/tests/resources/app/handlers/Main.cfc b/tests/resources/app/handlers/Main.cfc index 4ef3eda..a2cbfff 100755 --- a/tests/resources/app/handlers/Main.cfc +++ b/tests/resources/app/handlers/Main.cfc @@ -3,7 +3,7 @@ component extends="coldbox.system.EventHandler" { /** * Default Action */ - function index( event, rc, prc ) { + function index( event, rc, prc ){ prc.welcomeMessage = "Welcome to ColdBox!"; event.setView( "main/index" ); } @@ -11,7 +11,7 @@ component extends="coldbox.system.EventHandler" { /** * Produce some restfulf data */ - function data( event, rc, prc ) { + function data( event, rc, prc ){ return [ { "id" : createUUID(), name : "Luis" }, { "id" : createUUID(), name : "JOe" }, @@ -23,30 +23,30 @@ component extends="coldbox.system.EventHandler" { /** * Relocation example */ - function doSomething( event, rc, prc ) { + function doSomething( event, rc, prc ){ relocate( "main.index" ); } /************************************** IMPLICIT ACTIONS *********************************************/ - function onAppInit( event, rc, prc ) { + function onAppInit( event, rc, prc ){ } - function onRequestStart( event, rc, prc ) { + function onRequestStart( event, rc, prc ){ } - function onRequestEnd( event, rc, prc ) { + function onRequestEnd( event, rc, prc ){ } - function onSessionStart( event, rc, prc ) { + function onSessionStart( event, rc, prc ){ } - function onSessionEnd( event, rc, prc ) { + function onSessionEnd( event, rc, prc ){ var sessionScope = event.getValue( "sessionReference" ); var applicationScope = event.getValue( "applicationReference" ); } - function onException( event, rc, prc ) { + function onException( event, rc, prc ){ event.setHTTPHeader( statusCode = 500 ); // Grab Exception From private request collection, placed by ColdBox Exception Handling var exception = prc.exception; diff --git a/tests/resources/app/tests/Application.cfc b/tests/resources/app/tests/Application.cfc index 6853184..faf45e7 100755 --- a/tests/resources/app/tests/Application.cfc +++ b/tests/resources/app/tests/Application.cfc @@ -4,28 +4,28 @@ Copyright 2005-2007 ColdBox Framework by Luis Majano and Ortus Solutions, Corp www.ortussolutions.com ******************************************************************************** */ -component{ +component { // APPLICATION CFC PROPERTIES - this.name = "ColdBoxTestingSuite" & hash(getCurrentTemplatePath()); - this.sessionManagement = true; - this.sessionTimeout = createTimeSpan( 0, 0, 15, 0 ); - this.applicationTimeout = createTimeSpan( 0, 0, 15, 0 ); - this.setClientCookies = true; + this.name = "ColdBoxTestingSuite" & hash( getCurrentTemplatePath() ); + this.sessionManagement = true; + this.sessionTimeout = createTimespan( 0, 0, 15, 0 ); + this.applicationTimeout = createTimespan( 0, 0, 15, 0 ); + this.setClientCookies = true; // Create testing mapping this.mappings[ "/tests" ] = getDirectoryFromPath( getCurrentTemplatePath() ); // Map back to its root - rootPath = REReplaceNoCase( this.mappings[ "/tests" ], "tests(\\|/)", "" ); - this.mappings["/root"] = rootPath; + rootPath = reReplaceNoCase( this.mappings[ "/tests" ], "tests(\\|/)", "" ); + this.mappings[ "/root" ] = rootPath; - public void function onRequestEnd() { - - if( !isNull( application.cbController ) ){ + public void function onRequestEnd(){ + if ( !isNull( application.cbController ) ) { application.cbController.getLoaderService().processShutdown(); } structDelete( application, "cbController" ); structDelete( application, "wirebox" ); } -} \ No newline at end of file + +} diff --git a/tests/resources/app/tests/specs/integration/MainSpec.cfc b/tests/resources/app/tests/specs/integration/MainSpec.cfc index 3187af2..47995e7 100755 --- a/tests/resources/app/tests/specs/integration/MainSpec.cfc +++ b/tests/resources/app/tests/specs/integration/MainSpec.cfc @@ -14,61 +14,59 @@ * * eventArguments : The struct of args to pass to the event * * renderResults : Render back the results of the event *******************************************************************************/ -component - extends ="coldbox.system.testing.BaseTestCase" - appMapping="/root" -{ +component extends="coldbox.system.testing.BaseTestCase" appMapping="/root" { /*********************************** LIFE CYCLE Methods ***********************************/ - function beforeAll() { + function beforeAll(){ super.beforeAll(); // do your own stuff here } - function afterAll() { + function afterAll(){ // do your own stuff here super.afterAll(); } /*********************************** BDD SUITES ***********************************/ - function run() { - describe( "Main Handler", function() { - beforeEach( function( currentSpec ) { + function run(){ + describe( "Main Handler", function(){ + beforeEach( function( currentSpec ){ // Setup as a new ColdBox request, VERY IMPORTANT. ELSE EVERYTHING LOOKS LIKE THE SAME REQUEST. setup(); } ); - it( "can render the homepage", function() { + it( "can render the homepage", function(){ var event = this.get( "main.index" ); expect( event.getValue( name = "welcomemessage", private = true ) ).toBe( "Welcome to ColdBox!" ); } ); - it( "can render some restful data", function() { + it( "can render some restful data", function(){ var event = this.post( "main.data" ); debug( event.getHandlerResults() ); expect( event.getRenderedContent() ).toBeJSON(); } ); - it( "can do a relocation", function() { + it( "can do a relocation", function(){ var event = execute( event = "main.doSomething" ); expect( event.getValue( "relocate_event", "" ) ).toBe( "main.index" ); } ); - it( "can startup executable code", function() { + it( "can startup executable code", function(){ var event = execute( "main.onAppInit" ); } ); - it( "can handle exceptions", function() { + it( "can handle exceptions", function(){ // You need to create an exception bean first and place it on the request context FIRST as a setup. var exceptionBean = createMock( "coldbox.system.web.context.ExceptionBean" ).init( erroStruct = structNew(), extramessage = "My unit test exception", extraInfo = "Any extra info, simple or complex" ); - prepareMock( getRequestContext() ).setValue( + prepareMock( getRequestContext() ) + .setValue( name = "exception", value = exceptionBean, private = true @@ -79,22 +77,22 @@ component var event = execute( "main.onException" ); } ); - describe( "Request Events", function() { - it( "fires on start", function() { + describe( "Request Events", function(){ + it( "fires on start", function(){ var event = execute( "main.onRequestStart" ); } ); - it( "fires on end", function() { + it( "fires on end", function(){ var event = execute( "main.onRequestEnd" ); } ); } ); - describe( "Session Events", function() { - it( "fires on start", function() { + describe( "Session Events", function(){ + it( "fires on start", function(){ var event = execute( "main.onSessionStart" ); } ); - it( "fires on end", function() { + it( "fires on end", function(){ // Place a fake session structure here, it mimics what the handler receives URL.sessionReference = structNew(); URL.applicationReference = structNew(); diff --git a/tests/resources/app/views/Application.cfc b/tests/resources/app/views/Application.cfc index c70784d..5bb815d 100755 --- a/tests/resources/app/views/Application.cfc +++ b/tests/resources/app/views/Application.cfc @@ -1,7 +1,9 @@ -/** -* This is a protection Application cfm for the config file. You do not -* need to modify this file -*/ -component{ +/** + * This is a protection Application cfm for the config file. You do not + * need to modify this file + */ +component { + abort; -} \ No newline at end of file + +} diff --git a/tests/specs/integration/EmailValidationSpec.cfc b/tests/specs/integration/EmailValidationSpec.cfc index 810c686..5dcbff1 100644 --- a/tests/specs/integration/EmailValidationSpec.cfc +++ b/tests/specs/integration/EmailValidationSpec.cfc @@ -27,8 +27,7 @@ component extends="tests.resources.ModuleIntegrationSpec" appMapping="/app" { expect( res.json().result.source ).toInclude( "test source" ); } ); */ - } ); } -} \ No newline at end of file +} From 742b973806412c7552d577bfcfbc4fd9393f3db3 Mon Sep 17 00:00:00 2001 From: Oscar Tisnado <68830577+otisnado@users.noreply.github.com> Date: Wed, 11 Dec 2024 12:03:42 -0600 Subject: [PATCH 3/4] add missing prefix for serverConfigFile --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index eb66655..18bfc33 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -47,7 +47,7 @@ jobs: - name: Start ${{ matrix.cfengine }} Server run: | - box server start serverConfigFile=${{ matrix.cfengine }}.json --noSaveSettings --debug + box server start serverConfigFile=server-${{ matrix.cfengine }}.json --noSaveSettings --debug # Install Adobe 2021 cfpm modules if [[ "${{ matrix.cfengine }}" == "adobe@2021" ]] ; then box run-script install:2021 From e576aee3b1c39f026e3ad13613c997fda4257730 Mon Sep 17 00:00:00 2001 From: Oscar Tisnado <68830577+otisnado@users.noreply.github.com> Date: Thu, 12 Dec 2024 11:05:27 -0600 Subject: [PATCH 4/4] docs: add system requirements --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 819a024..8666c46 100755 --- a/README.md +++ b/README.md @@ -77,4 +77,10 @@ moduleSettings = { }; ``` -Note: if you only a username or a password, `sendgrid-sdk` will return a 500 error. \ No newline at end of file +Note: if you only a username or a password, `sendgrid-sdk` will return a 500 error. + +## Systema requirements + +* [Boxlang](https://www.boxlang.io/) +* Adobe 2021+ +* Lucee 5+