@grnsft/if 1.0.2 → 1.1.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.
Files changed (107) hide show
  1. package/.dockerignore +10 -0
  2. package/CONTAINER.md +148 -0
  3. package/Dockerfile +73 -0
  4. package/HELM_CHART.md +96 -0
  5. package/README.md +56 -0
  6. package/bin/docker-entrypoint.sh +15 -0
  7. package/build/common/types/manifest.d.ts +1 -0
  8. package/build/common/types/manifest.js +1 -1
  9. package/build/common/util/debug-logger.js +4 -18
  10. package/build/common/util/storage.d.ts +9 -0
  11. package/build/common/util/storage.js +24 -0
  12. package/build/if-api/config/config.d.ts +9 -0
  13. package/build/if-api/config/config.js +58 -0
  14. package/build/if-api/config/index.d.ts +2 -0
  15. package/build/if-api/config/index.js +8 -0
  16. package/build/if-api/config/strings.d.ts +16 -0
  17. package/build/if-api/config/strings.js +20 -0
  18. package/build/if-api/index.d.ts +2 -0
  19. package/build/if-api/index.js +268 -0
  20. package/build/if-api/types/process-args.d.ts +18 -0
  21. package/build/if-api/types/process-args.js +3 -0
  22. package/build/if-api/util/args.d.ts +5 -0
  23. package/build/if-api/util/args.js +42 -0
  24. package/build/if-metadata-check/config/config.d.ts +5 -0
  25. package/build/if-metadata-check/config/config.js +26 -0
  26. package/build/if-metadata-check/config/strings.d.ts +5 -0
  27. package/build/if-metadata-check/config/strings.js +9 -0
  28. package/build/if-metadata-check/index.d.ts +2 -0
  29. package/build/if-metadata-check/index.js +30 -0
  30. package/build/if-metadata-check/types/plugin.d.ts +7 -0
  31. package/build/if-metadata-check/types/plugin.js +3 -0
  32. package/build/if-metadata-check/types/process-args.d.ts +5 -0
  33. package/build/if-metadata-check/types/process-args.js +3 -0
  34. package/build/if-metadata-check/util/args.d.ts +57 -0
  35. package/build/if-metadata-check/util/args.js +29 -0
  36. package/build/if-metadata-check/util/metadata-checker.d.ts +44 -0
  37. package/build/if-metadata-check/util/metadata-checker.js +99 -0
  38. package/build/if-run/index.js +1 -1
  39. package/build/if-run/lib/aggregate.d.ts +2 -2
  40. package/build/if-run/lib/aggregate.js +5 -19
  41. package/build/if-run/lib/compute.d.ts +1 -1
  42. package/build/if-run/lib/compute.js +10 -9
  43. package/build/if-run/lib/environment.d.ts +5 -1
  44. package/build/if-run/lib/environment.js +21 -16
  45. package/build/if-run/lib/initialize.d.ts +12 -0
  46. package/build/if-run/lib/initialize.js +37 -3
  47. package/build/if-run/lib/regroup.d.ts +3 -2
  48. package/build/if-run/lib/regroup.js +13 -9
  49. package/build/if-run/types/compute.d.ts +1 -1
  50. package/build/if-run/types/compute.js +1 -1
  51. package/helm-chart/.helmignore +23 -0
  52. package/helm-chart/Chart.yaml +24 -0
  53. package/helm-chart/templates/NOTES.txt +22 -0
  54. package/helm-chart/templates/_helpers.tpl +62 -0
  55. package/helm-chart/templates/additionalPlugins.yaml +13 -0
  56. package/helm-chart/templates/deployment.yaml +144 -0
  57. package/helm-chart/templates/disabledPlugins.yaml +11 -0
  58. package/helm-chart/templates/env-configmap.yaml +10 -0
  59. package/helm-chart/templates/env-secret.yaml +10 -0
  60. package/helm-chart/templates/hpa.yaml +32 -0
  61. package/helm-chart/templates/ingress.yaml +43 -0
  62. package/helm-chart/templates/npmrc.yaml +11 -0
  63. package/helm-chart/templates/service.yaml +24 -0
  64. package/helm-chart/templates/serviceaccount.yaml +13 -0
  65. package/helm-chart/templates/tests/test-connection.yaml +15 -0
  66. package/helm-chart/values.yaml +175 -0
  67. package/manifests/examples/bugs/aggregation-error-wrong-metric.yml +173 -0
  68. package/manifests/examples/bugs/input-error-missing-duration.yml +25 -0
  69. package/manifests/examples/bugs/mock-observations-failure-duration-is-zero.yml +33 -0
  70. package/manifests/examples/bugs/pipeline-error-naming-mismatch.yml +32 -0
  71. package/manifests/examples/bugs/pipeline-error-uninitialized-plugin.yml +33 -0
  72. package/manifests/examples/bugs/pipeline-ordering-error.yml +91 -0
  73. package/manifests/examples/builtins/divide/success-denominator-equal-zero.yml +36 -0
  74. package/manifests/examples/builtins/mock-observations/failure-invalid-config-cpu-range.yml +0 -1
  75. package/manifests/examples/builtins/mock-observations/failure-invalid-memory-utilization-range.yml +0 -1
  76. package/manifests/examples/builtins/mock-observations/failure-missing-timestamp-from-param.yml +0 -1
  77. package/manifests/examples/builtins/mock-observations/success.yml +0 -1
  78. package/manifests/examples/builtins/sci/failure-invalid-config-value.yml +0 -1
  79. package/manifests/examples/builtins/sci/failure-missing-input-param.yml +0 -1
  80. package/manifests/examples/builtins/sci/success.yml +0 -1
  81. package/manifests/examples/builtins/sci-embodied/failure-invalid-default-emission-value.yml +22 -0
  82. package/manifests/examples/builtins/time-sync/failure-missing-config.yml +0 -2
  83. package/manifests/examples/builtins/time-sync/success.yml +0 -2
  84. package/manifests/examples/features/aggregate-failure-invalid-metrics.yml +50 -0
  85. package/manifests/examples/features/aggregate-failure-missing-metric-in-inputs.yml +50 -0
  86. package/manifests/examples/features/aggregate-horizontal.yml +58 -0
  87. package/manifests/examples/features/aggregate-vertical.yml +58 -0
  88. package/manifests/examples/features/aggregate.yml +58 -0
  89. package/manifests/examples/pipelines/cloud-metadata-divide.yml +36 -0
  90. package/manifests/examples/pipelines/pipeline-with-mocks.yml +0 -1
  91. package/manifests/examples/pipelines/scenario-5.yml +0 -1
  92. package/manifests/outputs/bugs/mock-observations-failure-duration-is-zero.yaml +0 -1
  93. package/manifests/outputs/builtins/mock-observations/failure-invalid-config-cpu-range.yaml +0 -1
  94. package/manifests/outputs/builtins/mock-observations/failure-invalid-memory-utilization-range.yaml +0 -1
  95. package/manifests/outputs/builtins/mock-observations/failure-missing-timestamp-from-param.yaml +0 -1
  96. package/manifests/outputs/builtins/sci/failure-invalid-config-value.yaml +0 -1
  97. package/manifests/outputs/builtins/sci/failure-missing-input-param.yaml +0 -1
  98. package/manifests/outputs/builtins/time-sync/failure-missing-config.yaml +0 -2
  99. package/manifests/outputs/features/regroup/success.yaml +72 -0
  100. package/manifests/outputs/pipelines/pipeline-with-aggregate.yaml +1291 -0
  101. package/manifests/outputs/pipelines/scenario-3.yaml +126 -0
  102. package/openapi.yaml +424 -0
  103. package/package.json +8 -3
  104. package/with-plugins/Dockerfile +59 -0
  105. package/manifests/outputs/builtins/interpolation/interpolation.yaml +0 -81
  106. package/manifests/outputs/features/failure-invalid-regroup.yaml +0 -87
  107. package/manifests/outputs/features/failure-missing-cloud-instance-type.yaml +0 -86
package/.dockerignore ADDED
@@ -0,0 +1,10 @@
1
+ # ignore all
2
+ *
3
+
4
+ # exclude only necessary items
5
+ !src/common
6
+ !src/if-*
7
+ !package*.json
8
+ !tsconfig.json
9
+ !tsconfig.build.json
10
+ !bin/docker-entrypoint.sh
package/CONTAINER.md ADDED
@@ -0,0 +1,148 @@
1
+ # Using Docker Container
2
+
3
+ The Impact Framework API server can be run as a Docker container.
4
+ The official image is provided at `ghcr.io/green-software-foundation/if`.
5
+
6
+ ## Running the Container
7
+
8
+ Run a container using the built image:
9
+
10
+ ```sh
11
+ # Run with default port (3000)
12
+ $ docker run --rm -p 3000:3000 ghcr.io/green-software-foundation/if
13
+
14
+ # Run with custom port
15
+ $ docker run --rm -p 8080:3000 ghcr.io/green-software-foundation/if
16
+ ```
17
+
18
+ When specifying arguments for the `if-api` command, you need to include the `if-api` command as shown below.
19
+
20
+ ```sh
21
+ # Run without external plugin warning
22
+ $ docker run --rm -p 3000:3000 ghcr.io/green-software-foundation/if if-api --disableExternalPluginWarning
23
+ ```
24
+
25
+ ## Using the containerized API server
26
+
27
+ The containerized API server provides the same endpoints as the regular API server:
28
+
29
+ ```sh
30
+ # Process manifest
31
+ $ curl -H "Content-Type: application/yaml" --data-binary @manifest.yaml http://localhost:3000/v1/run
32
+ ```
33
+
34
+ ## Adding external plugins at startup
35
+ You can add any external plugins at startup by mounting a file that lists the plugins to `/app/plugins.txt`.
36
+
37
+ ```sh
38
+ $ cat plugins.txt
39
+ carbon-intensity-plugin
40
+ Green-Software-Foundation/if-github-plugin
41
+ $ docker run --rm -p 3000:3000 -v $(pwd)/plugins.txt:/app/plugins.txt ghcr.io/green-software-foundation/if
42
+ ```
43
+
44
+ The contents of `/app/plugins.txt` are used directly as arguments for `npm install`.
45
+ For available formats, refer to: https://docs.npmjs.com/cli/v8/commands/npm-install
46
+
47
+ If the plugin itself or packages it depends on are private, you'll need to mount an `.npmrc` file at `/app/.npmrc` for the access token required to install packages.
48
+
49
+ ```sh
50
+ $ cat plugins.txt
51
+ @myscope/myplugin
52
+ $ cat .npmrc
53
+ //registry.npmjs.org/:_authToken=<YOUR_AUTH_TOKEN>
54
+ @myscope:registry=https://registry.npmjs.org/
55
+ $ docker run --rm -p 3000:3000 -v $(pwd)/plugins.txt:/app/plugins.txt -v $(pwd)/.npmrc:/app/.npmrc ghcr.io/green-software-foundation/if
56
+ ```
57
+
58
+ For `.npmrc` format reference: https://docs.npmjs.com/cli/v8/configuring-npm/npmrc
59
+
60
+ Note that if the plugin itself or packages it depends on are in GitHub Packages, a personal access token (classic) with `read:packages` permission is required even for public packages.
61
+
62
+ ```sh
63
+ $ cat plugins.txt
64
+ danuw/if-casdk-plugin
65
+ $ cat .npmrc
66
+ //npm.pkg.github.com/:_authToken=<YOUR_PERSONAL_ACCESS_TOKEN>
67
+ @Green-Software-Foundation:registry=https://npm.pkg.github.com/
68
+ $ docker run --rm -p 3000:3000 -v $(pwd)/plugins.txt:/app/plugins.txt -v $(pwd)/.npmrc:/app/.npmrc ghcr.io/green-software-foundation/if
69
+ ```
70
+
71
+ Alternatively, the access token can also be extracted to an environment variable (but this is not recommended as it can easily leak through `ps` commands, `proc` filesystem, dumps, etc.).
72
+
73
+ ```sh
74
+ $ cat plugins.txt
75
+ @myscope/myplugin
76
+ $ cat .npmrc
77
+ //registry.npmjs.org/:_authToken=${NODE_AUTH_TOKEN}
78
+ @myscope:registry=https://registry.npmjs.org/
79
+ $ docker run --rm -p 3000:3000 -v $(pwd)/plugins.txt:/app/plugins.txt -e NODE_AUTH_TOKEN=<YOUR_AUTH_TOKEN> -v $(pwd)/.npmrc:/app/.npmrc ghcr.io/green-software-foundation/if
80
+ ```
81
+
82
+ ## Building the Container Image
83
+
84
+ As mentioned above, there are official images available, but you can also build your own container image using the provided `Dockerfile`:
85
+
86
+ ```sh
87
+ # Build the container image
88
+ $ docker build -t myorg/if:v1.0.0 .
89
+ ```
90
+
91
+ ## Building Slim Image
92
+
93
+ The built container image includes the git command to enable installation of external plugins from git repositories such as GitHub at startup.
94
+ However, if you know that you don't need to install external plugins from git repositories during startup, you can create a slimmer container image without git by specifying the `--build-arg PACKAGES=` option in the container image build command.
95
+
96
+ ```sh
97
+ # Build custom image without git
98
+ $ docker build -t myorg/if:v1.0.0-slim --build-arg PACKAGES= .
99
+ ```
100
+
101
+ Note that the absence of git does not affect the installation of npm packages.
102
+
103
+ ```sh
104
+ # Run the custom image with the npm package
105
+ $ cat plugins-startup.txt
106
+ carbon-intensity-plugin
107
+ $ docker run --rm -p 3000:3000 -v $(pwd)/plugins-startup.txt:/app/plugins.txt myorg/if:v1.0.0-slim
108
+ ```
109
+
110
+ ## Building the Container Image with external plugins
111
+
112
+ While the official image and images built using the methods described above can add external plugins at container startup, installing external plugins takes considerable time, which significantly slows down container startup.
113
+ To avoid this, a `Dockerfile` for building container images with external plugins pre-installed is also provided in the `with-plugins` directory.
114
+ Create a `with-plugins/plugins.txt` file and build the image.
115
+
116
+ ```sh
117
+ $ cat with-plugins/plugins.txt
118
+ carbon-intensity-plugin
119
+ Green-Software-Foundation/if-github-plugin
120
+ $ docker build -t myorg/if-with-plugins:v1.0.0 with-plugins
121
+ ```
122
+
123
+ A `with-plugins/.npmrc` is required if you need an access token, as well as if you want to add external plugins when starting the container (The `with-plugins/.npmrc` file will not remain in the container image).
124
+
125
+ ```sh
126
+ $ cat with-plugins/plugins.txt
127
+ danuw/if-casdk-plugin
128
+ $ cat with-plugins/.npmrc
129
+ //npm.pkg.github.com/:_authToken=<YOUR_PERSONAL_ACCESS_TOKEN>
130
+ @Green-Software-Foundation:registry=https://npm.pkg.github.com/
131
+ $ docker build -t myorg/if-with-plugins:v1.0.0 with-plugins
132
+ ```
133
+
134
+ The base image used for installing external plugins is the official image, and the base image for the final image is `node:18-slim`, but these can be changed using the `BUILDBASEIMAGE` and `BASEIMAGE` arguments respectively.
135
+
136
+ ```sh
137
+ $ docker build -t myorg/if-with-plugins:v1.0.0 --build-arg BUILDBASEIMAGE=myorg/if:v1.0.0 --build-arg BASEIMAGE=node:20-slim with-plugins
138
+ ```
139
+
140
+ Note that, as with regular images, you can also create a slim image without git by adding the `--build-arg PACKAGES=` option.
141
+
142
+ ## Execution Other Than API Server
143
+
144
+ The container image can execute commands other than the `if-api` command.
145
+
146
+ ```sh
147
+ $ docker run --rm -v $(pwd)/manifests/examples/pipelines/sci.yml:/app/sci.yml myorg/if:v1.0.0 if-run -m sci.yml
148
+ ```
package/Dockerfile ADDED
@@ -0,0 +1,73 @@
1
+ ARG BASEIMAGE=node:18-slim
2
+
3
+ FROM --platform=$BUILDPLATFORM $BASEIMAGE AS deps
4
+
5
+ # Install git and ca-certificates
6
+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
7
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
8
+ apt-get update && \
9
+ apt-get --no-install-recommends install -y \
10
+ git ca-certificates
11
+
12
+ # Create application directory
13
+ WORKDIR /app
14
+
15
+ # Copy package*.json
16
+ COPY package*.json .
17
+
18
+ # Install build dependencies
19
+ RUN --mount=type=cache,target=/root/.npm,sharing=locked \
20
+ npm ci --ignore-scripts --no-fund
21
+
22
+ # Compile TypeScript
23
+ RUN --mount=src=tsconfig.json,target=tsconfig.json \
24
+ --mount=src=tsconfig.build.json,target=tsconfig.build.json \
25
+ --mount=src=src/,target=src/ \
26
+ npm run build
27
+
28
+ # Remove devDependencies
29
+ RUN --mount=type=cache,target=/root/.npm,sharing=locked \
30
+ npm prune --ignore-scripts --omit=dev
31
+
32
+ # Remove empty directory
33
+ RUN rmdir --ignore-fail-on-non-empty node_modules/*
34
+
35
+ # Set executable attributes to applications
36
+ RUN chmod +x build/if-*/index.js
37
+
38
+ # Link applications
39
+ RUN for a in build/if-*/index.js; do ln -s ../../$a node_modules/.bin/$(basename $(dirname $a)); done
40
+
41
+
42
+ FROM $BASEIMAGE
43
+
44
+ # Packages to be installed
45
+ ARG PACKAGES='git ca-certificates'
46
+
47
+ # Install lsb_release, git and ca-certificates
48
+ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
49
+ --mount=type=cache,target=/var/lib/apt,sharing=locked \
50
+ apt-get update && \
51
+ apt-get --no-install-recommends install -y \
52
+ lsb-release $PACKAGES
53
+
54
+ # Copy entrypoint shell script
55
+ COPY bin/docker-entrypoint.sh /usr/local/bin
56
+
57
+ # Set execution user
58
+ USER 1000
59
+
60
+ # Create application directory
61
+ WORKDIR /app
62
+
63
+ # Copy application and runtime dependencies
64
+ COPY --from=deps --chown=node:node /app .
65
+
66
+ # Set environment variables
67
+ ENV NODE_ENV=production NPM_CONFIG_UPDATE_NOTIFIER=false PATH=/app/node_modules/.bin:$PATH HOST=
68
+
69
+ # Expose port
70
+ EXPOSE 3000
71
+
72
+ # Run the application
73
+ CMD ["if-api"]
package/HELM_CHART.md ADDED
@@ -0,0 +1,96 @@
1
+ # Using API server with Kubernetes
2
+
3
+ The Impact Framework provides a helm chart, making it easy to run on a Kubernetes cluster.
4
+
5
+ ## Deploy the API server to Kubernetes
6
+
7
+ The helm chart is provided in OCI format on GitHub Container Registry, so you need to specify `oci:` when referencing the chart.
8
+
9
+ ```sh
10
+ $ helm install if oci://ghcr.io/green-software-foundation/charts/if
11
+ ```
12
+
13
+ For security reasons, three builtin plugins (Shell, CSVImport, CSVLookup) are disabled by default, but they can be enabled by specifying in `values.yaml`.
14
+
15
+ ```yaml
16
+ # enable all builtin plugins
17
+ disabledPlugins: []
18
+ ```
19
+
20
+ ## Install External Plugins
21
+
22
+ You can also specify in `values.yaml` to install external plugins when the pod starts.
23
+
24
+ ```yaml
25
+ additionalPlugins:
26
+ - carbon-intensity-plugin
27
+ - Green-Software-Foundation/if-github-plugin
28
+ ```
29
+
30
+ If an `.npmrc` file is required, you can create a `Secret` by specifying it in the `npmrc` section of the `values.yaml` file.
31
+
32
+ ```yaml
33
+ additionalPlugins:
34
+ - Green-Software-Foundation/community-plugins
35
+ - danuw/if-casdk-plugin
36
+
37
+ npmrc: |
38
+ //npm.pkg.github.com/:_authToken=<YOUR_PERSONAL_ACCESS_TOKEN>
39
+ @Green-Software-Foundation:registry=https://npm.pkg.github.com/
40
+ ```
41
+
42
+ You can also extract the access token as an environment variable.
43
+
44
+ ```yaml
45
+ additionalPlugins:
46
+ - Green-Software-Foundation/community-plugins
47
+ - danuw/if-casdk-plugin
48
+
49
+ npmrc: |
50
+ //npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
51
+ @Green-Software-Foundation:registry=https://npm.pkg.github.com/
52
+
53
+ env:
54
+ secret:
55
+ GITHUB_TOKEN: <YOUR_PERSONAL_ACCESS_TOKEN>
56
+ ```
57
+
58
+ ## Using Custom Container Images
59
+
60
+ By creating and using a container image with external plugins pre-installed, you can use external plugins without installing them at pod startup, which reduces pod startup time.
61
+
62
+ `values.yaml` for using `my-image-repository:my-version` as the container image:
63
+
64
+ ```yaml
65
+ image:
66
+ repository: my-image-repository
67
+ tag: my-version
68
+ ```
69
+
70
+ ## Using Kubernetes service
71
+
72
+ By default, a `ClusterIP` service is deployed, so you can access the API server by running `kubectl port-forward`.
73
+
74
+ ```sh
75
+ $ kubectl port-forward svc/if 3000:3000 &
76
+ $ curl -H "Content-Type: application/yaml" --data-binary @manifest.yaml http://localhost:3000/v1/run
77
+ ```
78
+
79
+ You can access the API server from outside the cluster without using `port-forward` by changing the service type to `NodePort` or `LoadBalancer`.
80
+
81
+ `values.yaml` for the `NodePort`:
82
+
83
+ ```yaml
84
+ # Using NodePort
85
+ service:
86
+ type: NodePort
87
+ nodePort: 32000
88
+ ```
89
+
90
+ `values.yaml` for the `LoadBalancer`:
91
+
92
+ ```yaml
93
+ # Using LoadBalancer
94
+ service:
95
+ type: LoadBalancer
96
+ ```
package/README.md CHANGED
@@ -60,6 +60,62 @@ if-run --help
60
60
  if-run -h
61
61
  ```
62
62
 
63
+ ### Using API server
64
+
65
+ The Impact Framework also provides an API server. By default, it listens on localhost:3000, but this can be changed.
66
+
67
+ ```sh
68
+ # Run the API server listening on the default localhost:3000.
69
+ $ if-api
70
+
71
+ # Run the API server listening on 0.0.0.0:8080.
72
+ $ if-api --host 0.0.0.0 --port 8080
73
+ ```
74
+
75
+ If the API server is running, you can send a manifest in the request body and receive the results of `if-run` as a response.
76
+
77
+ ```sh
78
+ # Process manifest
79
+ $ curl -H "Content-Type: application/yaml" --data-binary @manifest.yaml http://localhost:3000/v1/run
80
+ ```
81
+
82
+ Note that in `if-api`, the following builtin plugins are disabled by default for security reasons.
83
+ - Shell
84
+ - CSVImport
85
+ - CSVLookup
86
+
87
+ Please refer to the documentation for detailed usage instructions, including how to enable these plugins.
88
+
89
+ ### Using Docker Container
90
+
91
+ The Impact Framework API server can also be run as a Docker container.
92
+ The official image is provided at `ghcr.io/green-software-foundation/if`, so you can run the container with the following command.
93
+
94
+ ```sh
95
+ # Run with default port (3000)
96
+ $ docker run --rm -p 3000:3000 ghcr.io/green-software-foundation/if
97
+ ```
98
+
99
+ Please refer to [`CONTAINER.md`](CONTAINER.md) for how to install external plugins during container execution and how to build custom images.
100
+
101
+ ### Using API server with Kubernetes
102
+
103
+ The Impact Framework also provides a helm chart for running the API server on a Kubernetes cluster.
104
+ The helm chart is provided in OCI format on GitHub Container Registry, so you need to specify `oci:` when referencing the chart.
105
+
106
+ ```sh
107
+ $ helm install if oci://ghcr.io/green-software-foundation/charts/if
108
+ ```
109
+
110
+ By default, a `ClusterIP` service is deployed, so you can access the API server by running `kubectl port-forward`.
111
+
112
+ ```sh
113
+ $ kubectl port-forward svc/if 3000:3000 &
114
+ $ curl -H "Content-Type: application/yaml" --data-binary @manifest.yaml http://localhost:3000/v1/run
115
+ ```
116
+
117
+ For detailed usage including external plugin installation and NodePort configuration, please refer to [`HELM_CHART.md`](HELM_CHART.md).
118
+
63
119
  ## Documentation
64
120
 
65
121
  Please read our documentation at [if.greensoftware.foundation](https://if.greensoftware.foundation/)
@@ -0,0 +1,15 @@
1
+ #!/bin/sh
2
+ set -e
3
+
4
+ # Install plugins if plugins.txt exists.
5
+ if [ -f plugins.txt ] && [ -r plugins.txt ]; then
6
+ echo "Installing plugins..."
7
+ npm install --no-fund $(cat plugins.txt)
8
+ fi
9
+
10
+ # Run command with node if the first argument contains a "-" or is not a system command.
11
+ if [ "${1#-}" != "${1}" ] || [ -z "$(command -v "${1}")" ] || { [ -f "${1}" ] && ! [ -x "${1}" ]; } || [ -d "${1}" ]; then
12
+ set -- node "$@"
13
+ fi
14
+
15
+ exec "$@"
@@ -2,6 +2,7 @@ import { z } from 'zod';
2
2
  import { AggregationOptions } from '@grnsft/if-core/types';
3
3
  import { manifestSchema } from '../util/validations';
4
4
  export type Manifest = z.infer<typeof manifestSchema>;
5
+ export type Execution = NonNullable<Manifest['execution']>;
5
6
  export type GlobalPlugins = Manifest['initialize']['plugins'];
6
7
  export type PluginOptions = GlobalPlugins[string];
7
8
  export type AggregationParams = Manifest['aggregation'];
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3R5cGVzL21hbmlmZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge0FnZ3JlZ2F0aW9uT3B0aW9uc30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3R5cGVzJztcblxuaW1wb3J0IHttYW5pZmVzdFNjaGVtYX0gZnJvbSAnLi4vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0ID0gei5pbmZlcjx0eXBlb2YgbWFuaWZlc3RTY2hlbWE+O1xuXG5leHBvcnQgdHlwZSBHbG9iYWxQbHVnaW5zID0gTWFuaWZlc3RbJ2luaXRpYWxpemUnXVsncGx1Z2lucyddO1xuXG5leHBvcnQgdHlwZSBQbHVnaW5PcHRpb25zID0gR2xvYmFsUGx1Z2luc1tzdHJpbmddO1xuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvblBhcmFtcyA9IE1hbmlmZXN0WydhZ2dyZWdhdGlvbiddO1xuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25NZXRyaWNzV2l0aE1ldGhvZCA9IHtcbiAgW2tleTogc3RyaW5nXTogQWdncmVnYXRpb25PcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25QYXJhbXNTdXJlID0gRXh0cmFjdDxNYW5pZmVzdFsnYWdncmVnYXRpb24nXSwge30+O1xuXG5leHBvcnQgdHlwZSBDb250ZXh0ID0gT21pdDxNYW5pZmVzdCwgJ3RyZWUnPjtcblxuZXhwb3J0IHR5cGUgQ29udGV4dFdpdGhFeGVjID0gT21pdDxNYW5pZmVzdCwgJ3RyZWUnPjtcbiJdfQ==
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuaWZlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3R5cGVzL21hbmlmZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge0FnZ3JlZ2F0aW9uT3B0aW9uc30gZnJvbSAnQGdybnNmdC9pZi1jb3JlL3R5cGVzJztcblxuaW1wb3J0IHttYW5pZmVzdFNjaGVtYX0gZnJvbSAnLi4vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmV4cG9ydCB0eXBlIE1hbmlmZXN0ID0gei5pbmZlcjx0eXBlb2YgbWFuaWZlc3RTY2hlbWE+O1xuXG5leHBvcnQgdHlwZSBFeGVjdXRpb24gPSBOb25OdWxsYWJsZTxNYW5pZmVzdFsnZXhlY3V0aW9uJ10+O1xuXG5leHBvcnQgdHlwZSBHbG9iYWxQbHVnaW5zID0gTWFuaWZlc3RbJ2luaXRpYWxpemUnXVsncGx1Z2lucyddO1xuXG5leHBvcnQgdHlwZSBQbHVnaW5PcHRpb25zID0gR2xvYmFsUGx1Z2luc1tzdHJpbmddO1xuXG5leHBvcnQgdHlwZSBBZ2dyZWdhdGlvblBhcmFtcyA9IE1hbmlmZXN0WydhZ2dyZWdhdGlvbiddO1xuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25NZXRyaWNzV2l0aE1ldGhvZCA9IHtcbiAgW2tleTogc3RyaW5nXTogQWdncmVnYXRpb25PcHRpb25zO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25QYXJhbXNTdXJlID0gRXh0cmFjdDxNYW5pZmVzdFsnYWdncmVnYXRpb24nXSwge30+O1xuXG5leHBvcnQgdHlwZSBDb250ZXh0ID0gT21pdDxNYW5pZmVzdCwgJ3RyZWUnPjtcblxuZXhwb3J0IHR5cGUgQ29udGV4dFdpdGhFeGVjID0gT21pdDxNYW5pZmVzdCwgJ3RyZWUnPjtcbiJdfQ==
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.debugLogger = void 0;
4
+ const storage_1 = require("../../common/util/storage");
4
5
  const config_1 = require("../../if-run/config");
5
6
  const logMessagesKeys = [
6
7
  'STARTING_IF',
@@ -46,26 +47,11 @@ const overrideConsoleMethods = (debugMode) => {
46
47
  console.error = (...args) => debugLog(LogLevel.Error, args, debugMode);
47
48
  console.debug = (...args) => debugLog(LogLevel.Debug, args, debugMode);
48
49
  };
49
- /**
50
- * Creates an encapsulated object to retrieve the plugin name.
51
- */
52
- const pluginNameManager = (() => {
53
- let pluginName = '';
54
- const manager = {
55
- get currentPluginName() {
56
- return pluginName;
57
- },
58
- set currentPluginName(value) {
59
- pluginName = value;
60
- },
61
- };
62
- return manager;
63
- })();
64
50
  /**
65
51
  * Sets the name of the currently executing plugin.
66
52
  */
67
53
  const setExecutingPluginName = (pluginName) => {
68
- pluginNameManager.currentPluginName = pluginName;
54
+ (0, storage_1.getStorage)().currentPluginName = pluginName;
69
55
  };
70
56
  /**
71
57
  * Logs messages with the specified log level and format.
@@ -96,7 +82,7 @@ const debugLog = (level, args, debugMode) => {
96
82
  return;
97
83
  }
98
84
  const date = new Date().toISOString();
99
- const plugin = pluginNameManager.currentPluginName;
85
+ const plugin = (0, storage_1.getStorage)().currentPluginName;
100
86
  const isExeption = typeof args[0] === 'string' && args[0].includes('**Computing');
101
87
  const message = `${level}: ${date}: ${plugin ? plugin + ': ' : ''}${args.join(', ')}`;
102
88
  const formattedMessage = isExeption ? args.join(', ') : message;
@@ -121,4 +107,4 @@ exports.debugLogger = {
121
107
  overrideConsoleMethods,
122
108
  setExecutingPluginName,
123
109
  };
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctbG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlsL2RlYnVnLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBNEM7QUFFNUMsTUFBTSxlQUFlLEdBQTZCO0lBQ2hELGFBQWE7SUFDYixZQUFZO0lBQ1osa0JBQWtCO0lBQ2xCLHFCQUFxQjtJQUNyQixvQ0FBb0M7SUFDcEMsNkJBQTZCO0lBQzdCLHNCQUFzQjtJQUN0QixxQkFBcUI7SUFDckIsMEJBQTBCO0lBQzFCLDZCQUE2QjtJQUM3Qiw4QkFBOEI7SUFDOUIsWUFBWTtJQUNaLFdBQVc7SUFDWCxrQ0FBa0M7SUFDbEMscUJBQXFCO0lBQ3JCLGtCQUFrQjtJQUNsQix1QkFBdUI7SUFDdkIsd0JBQXdCO0NBQ3pCLENBQUM7QUFFRixJQUFLLFFBS0o7QUFMRCxXQUFLLFFBQVE7SUFDWCx5QkFBYSxDQUFBO0lBQ2IseUJBQWEsQ0FBQTtJQUNiLDJCQUFlLENBQUE7SUFDZiwyQkFBZSxDQUFBO0FBQ2pCLENBQUMsRUFMSSxRQUFRLEtBQVIsUUFBUSxRQUtaO0FBRUQsTUFBTSxlQUFlLEdBQUc7SUFDdEIsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHO0lBQ2hCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtJQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7SUFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO0lBQ3BCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztDQUNyQixDQUFDO0FBRUY7O0dBRUc7QUFDSCxNQUFNLHNCQUFzQixHQUFHLENBQUMsU0FBa0IsRUFBRSxFQUFFO0lBQ3BELE9BQU8sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQVcsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sQ0FBQyxJ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TyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQzNFLElBQUksQ0FDTCxFQUFFLENBQUM7SUFFSixNQUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBRWhFLElBQUksU0FBUyxFQUFFO1FBQ2IsUUFBUSxLQUFLLEVBQUU7WUFDYixLQUFLLFFBQVEsQ0FBQyxJQUFJO2dCQUNoQixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZDLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxJQUFJO2dCQUNoQixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZDLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNqQixlQUFlLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3hDLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNqQixlQUFlLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3hDLE1BQU07U0FDVDtLQUNGO0FBQ0gsQ0FBQyxDQUFDO0FBRVcsUUFBQSxXQUFXLEdBQUc7SUFDekIsc0JBQXNCO0lBQ3RCLHNCQUFzQjtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi8uLi9pZi1ydW4vY29uZmlnJztcblxuY29uc3QgbG9nTWVzc2FnZXNLZXlzOiAoa2V5b2YgdHlwZW9mIFNUUklOR1MpW10gPSBbXG4gICdTVEFSVElOR19JRicsXG4gICdFWElUSU5HX0lGJyxcbiAgJ0xPQURJTkdfTUFOSUZFU1QnLFxuICAnVkFMSURBVElOR19NQU5JRkVTVCcsXG4gICdDQVBUVVJJTkdfUlVOVElNRV9FTlZJUk9OTUVOVF9EQVRBJyxcbiAgJ0NIRUNLSU5HX0FHR1JFR0FUSU9OX01FVEhPRCcsXG4gICdJTklUSUFMSVpJTkdfUExVR0lOUycsXG4gICdJTklUSUFMSVpJTkdfUExVR0lOJyxcbiAgJ0xPQURJTkdfUExVR0lOX0ZST01fUEFUSCcsXG4gICdDT01QVVRJTkdfUElQRUxJTkVfRk9SX05PREUnLFxuICAnQ09NUFVUSU5HX0NPTVBPTkVOVF9QSVBFTElORScsXG4gICdSRUdST1VQSU5HJyxcbiAgJ09CU0VSVklORycsXG4gICdNRVJHSU5HX0RFRkFVTFRTX1dJVEhfSU5QVVRfREFUQScsXG4gICdBR0dSRUdBVElOR19PVVRQVVRTJyxcbiAgJ0FHR1JFR0FUSU5HX05PREUnLFxuICAnUFJFUEFSSU5HX09VVFBVVF9EQVRBJyxcbiAgJ0VYUE9SVElOR19UT19ZQU1MX0ZJTEUnLFxuXTtcblxuZW51bSBMb2dMZXZlbCB7XG4gIEluZm8gPSAnSU5GTycsXG4gIFdhcm4gPSAnV0FSTicsXG4gIEVycm9yID0gJ0VSUk9SJyxcbiAgRGVidWcgPSAnREVCVUcnLFxufVxuXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSB7XG4gIGxvZzogY29uc29sZS5sb2csXG4gIGluZm86IGNvbnNvbGUuaW5mbyxcbiAgd2FybjogY29uc29sZS53YXJuLFxuICBlcnJvcjogY29uc29sZS5lcnJvcixcbiAgZGVidWc6IGNvbnNvbGUuZGVidWcsXG59O1xuXG4vKipcbiAqIE92ZXJyaWRlcyBjb25zb2xlIG1ldGhvZHMgd2l0aCBjdXN0b20gZGVidWcgbG9nZ2luZy5cbiAqL1xuY29uc3Qgb3ZlcnJpZGVDb25zb2xlTWV0aG9kcyA9IChkZWJ1Z01vZGU6IGJvb2xlYW4pID0+IHtcbiAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IGRlYnVnTG9nKExvZ0xldmVsLkluZm8sIGFyZ3MsIGRlYnVnTW9kZSk7XG4gIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gZGVidWdMb2coTG9nTGV2ZWwuSW5mbywgYXJncywgZGVidWdNb2RlKTtcbiAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBkZWJ1Z0xvZyhMb2dMZXZlbC5XYXJuLCBhcmdzLCBkZWJ1Z01vZGUpO1xuICBjb25zb2xlLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBkZWJ1Z0xvZyhMb2dMZXZlbC5FcnJvciwgYXJncywgZGVidWdNb2RlKTtcbiAgY29uc29sZS5kZWJ1ZyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gZGVidWdMb2coTG9nTGV2ZWwuRGVidWcsIGFyZ3MsIGRlYnVnTW9kZSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW5jYXBzdWxhdGVkIG9iamVjdCB0byByZXRyaWV2ZSB0aGUgcGx1Z2luIG5hbWUuXG4gKi9cbmNvbnN0IHBsdWdpbk5hbWVNYW5hZ2VyID0gKCgpID0+IHtcbiAgbGV0IHBsdWdpbk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9ICcnO1xuXG4gIGNvbnN0IG1hbmFnZXIgPSB7XG4gICAgZ2V0IGN1cnJlbnRQbHVnaW5OYW1lKCkge1xuICAgICAgcmV0dXJuIHBsdWdpbk5hbWU7XG4gICAgfSxcbiAgICBzZXQgY3VycmVudFBsdWdpbk5hbWUodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgICAgcGx1Z2luTmFtZSA9IHZhbHVlO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIG1hbmFnZXI7XG59KSgpO1xuXG4vKipcbiAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcGx1Z2luLlxuICovXG5jb25zdCBzZXRFeGVjdXRpbmdQbHVnaW5OYW1lID0gKHBsdWdpbk5hbWU/OiBzdHJpbmcpID0+IHtcbiAgcGx1Z2luTmFtZU1hbmFnZXIuY3VycmVudFBsdWdpbk5hbWUgPSBwbHVnaW5OYW1lO1xufTtcblxuLyoqXG4gKiBMb2dzIG1lc3NhZ2VzIHdpdGggdGhlIHNwZWNpZmllZCBsb2cgbGV2ZWwgYW5kIGZvcm1hdC5cbiAqL1xuY29uc3QgZGVidWdMb2cgPSAobGV2ZWw6IExvZ0xldmVsLCBhcmdzOiBhbnlbXSwgZGVidWdNb2RlOiBib29sZWFuKSA9PiB7XG4gIGlmICghZGVidWdNb2RlKSB7XG4gICAgaWYgKGxldmVsID09PSBMb2dMZXZlbC5EZWJ1Zykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRGVidWdMb2cgPVxuICAgICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmXG4gICAgICBsb2dNZXNzYWdlc0tleXMuc29tZShrZXkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgICB0eXBlb2YgU1RSSU5HU1trZXldID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IChTVFJJTkdTW2tleV0gYXMgRnVuY3Rpb24pLmNhbGwobnVsbCwgJycpXG4gICAgICAgICAgICA6IChTVFJJTkdTW2tleV0gYXMgc3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gYXJnc1swXS5pbmNsdWRlcyhtZXNzYWdlKTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKCFpc0RlYnVnTG9nKSB7XG4gICAgICBvcmlnaW5hbENvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYXJnc1swXSA9PT0gJ3N0cmluZycgJiYgYXJnc1swXS5pbmNsdWRlcygnIyBzdGFydCcpKSB7XG4gICAgb3JpZ2luYWxDb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoYXJnc1swXSA9PT0gJ1xcbicpIHtcbiAgICBvcmlnaW5hbENvbnNvbGUubG9nKCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgY29uc3QgcGx1Z2luID0gcGx1Z2luTmFtZU1hbmFnZXIuY3VycmVudFBsdWdpbk5hbWU7XG4gIGNvbnN0IGlzRXhlcHRpb24gPVxuICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJiBhcmdzWzBdLmluY2x1ZGVzKCcqKkNvbXB1dGluZycpO1xuICBjb25zdCBtZXNzYWdlID0gYCR7bGV2ZWx9OiAke2RhdGV9OiAke3BsdWdpbiA/IHBsdWdpbiArICc6ICcgOiAnJ30ke2FyZ3Muam9pbihcbiAgICAnLCAnXG4gICl9YDtcblxuICBjb25zdCBmb3JtYXR0ZWRNZXNzYWdlID0gaXNFeGVwdGlvbiA/IGFyZ3Muam9pbignLCAnKSA6IG1lc3NhZ2U7XG5cbiAgaWYgKGRlYnVnTW9kZSkge1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgTG9nTGV2ZWwuSW5mbzpcbiAgICAgICAgb3JpZ2luYWxDb25zb2xlLmluZm8oZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5XYXJuOlxuICAgICAgICBvcmlnaW5hbENvbnNvbGUud2Fybihmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLkVycm9yOlxuICAgICAgICBvcmlnaW5hbENvbnNvbGUuZXJyb3IoZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5EZWJ1ZzpcbiAgICAgICAgb3JpZ2luYWxDb25zb2xlLmRlYnVnKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z0xvZ2dlciA9IHtcbiAgb3ZlcnJpZGVDb25zb2xlTWV0aG9kcyxcbiAgc2V0RXhlY3V0aW5nUGx1Z2luTmFtZSxcbn07XG4iXX0=
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVidWctbG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlsL2RlYnVnLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx1REFBcUQ7QUFFckQsZ0RBQTRDO0FBRTVDLE1BQU0sZUFBZSxHQUE2QjtJQUNoRCxhQUFhO0lBQ2IsWUFBWTtJQUNaLGtCQUFrQjtJQUNsQixxQkFBcUI7SUFDckIsb0NBQW9DO0lBQ3BDLDZCQUE2QjtJQUM3QixzQkFBc0I7SUFDdEIscUJBQXFCO0lBQ3JCLDBCQUEwQjtJQUMxQiw2QkFBNkI7SUFDN0IsOEJBQThCO0lBQzlCLFlBQVk7SUFDWixXQUFXO0lBQ1gsa0NBQWtDO0lBQ2xDLHFCQUFxQjtJQUNyQixrQkFBa0I7SUFDbEIsdUJBQXVCO0lBQ3ZCLHdCQUF3QjtDQUN6QixDQUFDO0FBRUYsSUFBSyxRQUtKO0FBTEQsV0FBSyxRQUFRO0lBQ1gseUJBQWEsQ0FBQTtJQUNiLHlCQUFhLENBQUE7SUFDYiwyQkFBZSxDQUFBO0lBQ2YsMkJBQWUsQ0FBQTtBQUNqQixDQUFDLEVBTEksUUFBUSxLQUFSLFFBQVEsUUFLWjtBQUVELE1BQU0sZUFBZSxHQUFHO0lBQ3RCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztJQUNoQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7SUFDbEIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0lBQ2xCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztJQUNwQixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7Q0FDckIsQ0FBQztBQUVGOztHQUVHO0FBQ0gsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQWtCLEVBQUUsRUFBRTtJQUNwRCxPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMz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QUFNLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0lBRWhFLElBQUksU0FBUyxFQUFFO1FBQ2IsUUFBUSxLQUFLLEVBQUU7WUFDYixLQUFLLFFBQVEsQ0FBQyxJQUFJO2dCQUNoQixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZDLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxJQUFJO2dCQUNoQixlQUFlLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZDLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNqQixlQUFlLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3hDLE1BQU07WUFDUixLQUFLLFFBQVEsQ0FBQyxLQUFLO2dCQUNqQixlQUFlLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3hDLE1BQU07U0FDVDtLQUNGO0FBQ0gsQ0FBQyxDQUFDO0FBRVcsUUFBQSxXQUFXLEdBQUc7SUFDekIsc0JBQXNCO0lBQ3RCLHNCQUFzQjtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtnZXRTdG9yYWdlfSBmcm9tICcuLi8uLi9jb21tb24vdXRpbC9zdG9yYWdlJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi8uLi9pZi1ydW4vY29uZmlnJztcblxuY29uc3QgbG9nTWVzc2FnZXNLZXlzOiAoa2V5b2YgdHlwZW9mIFNUUklOR1MpW10gPSBbXG4gICdTVEFSVElOR19JRicsXG4gICdFWElUSU5HX0lGJyxcbiAgJ0xPQURJTkdfTUFOSUZFU1QnLFxuICAnVkFMSURBVElOR19NQU5JRkVTVCcsXG4gICdDQVBUVVJJTkdfUlVOVElNRV9FTlZJUk9OTUVOVF9EQVRBJyxcbiAgJ0NIRUNLSU5HX0FHR1JFR0FUSU9OX01FVEhPRCcsXG4gICdJTklUSUFMSVpJTkdfUExVR0lOUycsXG4gICdJTklUSUFMSVpJTkdfUExVR0lOJyxcbiAgJ0xPQURJTkdfUExVR0lOX0ZST01fUEFUSCcsXG4gICdDT01QVVRJTkdfUElQRUxJTkVfRk9SX05PREUnLFxuICAnQ09NUFVUSU5HX0NPTVBPTkVOVF9QSVBFTElORScsXG4gICdSRUdST1VQSU5HJyxcbiAgJ09CU0VSVklORycsXG4gICdNRVJHSU5HX0RFRkFVTFRTX1dJVEhfSU5QVVRfREFUQScsXG4gICdBR0dSRUdBVElOR19PVVRQVVRTJyxcbiAgJ0FHR1JFR0FUSU5HX05PREUnLFxuICAnUFJFUEFSSU5HX09VVFBVVF9EQVRBJyxcbiAgJ0VYUE9SVElOR19UT19ZQU1MX0ZJTEUnLFxuXTtcblxuZW51bSBMb2dMZXZlbCB7XG4gIEluZm8gPSAnSU5GTycsXG4gIFdhcm4gPSAnV0FSTicsXG4gIEVycm9yID0gJ0VSUk9SJyxcbiAgRGVidWcgPSAnREVCVUcnLFxufVxuXG5jb25zdCBvcmlnaW5hbENvbnNvbGUgPSB7XG4gIGxvZzogY29uc29sZS5sb2csXG4gIGluZm86IGNvbnNvbGUuaW5mbyxcbiAgd2FybjogY29uc29sZS53YXJuLFxuICBlcnJvcjogY29uc29sZS5lcnJvcixcbiAgZGVidWc6IGNvbnNvbGUuZGVidWcsXG59O1xuXG4vKipcbiAqIE92ZXJyaWRlcyBjb25zb2xlIG1ldGhvZHMgd2l0aCBjdXN0b20gZGVidWcgbG9nZ2luZy5cbiAqL1xuY29uc3Qgb3ZlcnJpZGVDb25zb2xlTWV0aG9kcyA9IChkZWJ1Z01vZGU6IGJvb2xlYW4pID0+IHtcbiAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IGRlYnVnTG9nKExvZ0xldmVsLkluZm8sIGFyZ3MsIGRlYnVnTW9kZSk7XG4gIGNvbnNvbGUuaW5mbyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gZGVidWdMb2coTG9nTGV2ZWwuSW5mbywgYXJncywgZGVidWdNb2RlKTtcbiAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBkZWJ1Z0xvZyhMb2dMZXZlbC5XYXJuLCBhcmdzLCBkZWJ1Z01vZGUpO1xuICBjb25zb2xlLmVycm9yID0gKC4uLmFyZ3M6IGFueVtdKSA9PiBkZWJ1Z0xvZyhMb2dMZXZlbC5FcnJvciwgYXJncywgZGVidWdNb2RlKTtcbiAgY29uc29sZS5kZWJ1ZyA9ICguLi5hcmdzOiBhbnlbXSkgPT4gZGVidWdMb2coTG9nTGV2ZWwuRGVidWcsIGFyZ3MsIGRlYnVnTW9kZSk7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgcGx1Z2luLlxuICovXG5jb25zdCBzZXRFeGVjdXRpbmdQbHVnaW5OYW1lID0gKHBsdWdpbk5hbWU/OiBzdHJpbmcpID0+IHtcbiAgZ2V0U3RvcmFnZSgpLmN1cnJlbnRQbHVnaW5OYW1lID0gcGx1Z2luTmFtZTtcbn07XG5cbi8qKlxuICogTG9ncyBtZXNzYWdlcyB3aXRoIHRoZSBzcGVjaWZpZWQgbG9nIGxldmVsIGFuZCBmb3JtYXQuXG4gKi9cbmNvbnN0IGRlYnVnTG9nID0gKGxldmVsOiBMb2dMZXZlbCwgYXJnczogYW55W10sIGRlYnVnTW9kZTogYm9vbGVhbikgPT4ge1xuICBpZiAoIWRlYnVnTW9kZSkge1xuICAgIGlmIChsZXZlbCA9PT0gTG9nTGV2ZWwuRGVidWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0RlYnVnTG9nID1cbiAgICAgIHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJyAmJlxuICAgICAgbG9nTWVzc2FnZXNLZXlzLnNvbWUoa2V5ID0+IHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgdHlwZW9mIFNUUklOR1Nba2V5XSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgPyAoU1RSSU5HU1trZXldIGFzIEZ1bmN0aW9uKS5jYWxsKG51bGwsICcnKVxuICAgICAgICAgICAgOiAoU1RSSU5HU1trZXldIGFzIHN0cmluZyk7XG5cbiAgICAgICAgcmV0dXJuIGFyZ3NbMF0uaW5jbHVkZXMobWVzc2FnZSk7XG4gICAgICB9KTtcblxuICAgIGlmICghaXNEZWJ1Z0xvZykge1xuICAgICAgb3JpZ2luYWxDb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmIGFyZ3NbMF0uaW5jbHVkZXMoJyMgc3RhcnQnKSkge1xuICAgIG9yaWdpbmFsQ29uc29sZS5sb2coLi4uYXJncyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFyZ3NbMF0gPT09ICdcXG4nKSB7XG4gICAgb3JpZ2luYWxDb25zb2xlLmxvZygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIGNvbnN0IHBsdWdpbiA9IGdldFN0b3JhZ2UoKS5jdXJyZW50UGx1Z2luTmFtZTtcbiAgY29uc3QgaXNFeGVwdGlvbiA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnICYmIGFyZ3NbMF0uaW5jbHVkZXMoJyoqQ29tcHV0aW5nJyk7XG4gIGNvbnN0IG1lc3NhZ2UgPSBgJHtsZXZlbH06ICR7ZGF0ZX06ICR7cGx1Z2luID8gcGx1Z2luICsgJzogJyA6ICcnfSR7YXJncy5qb2luKFxuICAgICcsICdcbiAgKX1gO1xuXG4gIGNvbnN0IGZvcm1hdHRlZE1lc3NhZ2UgPSBpc0V4ZXB0aW9uID8gYXJncy5qb2luKCcsICcpIDogbWVzc2FnZTtcblxuICBpZiAoZGVidWdNb2RlKSB7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5JbmZvOlxuICAgICAgICBvcmlnaW5hbENvbnNvbGUuaW5mbyhmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLldhcm46XG4gICAgICAgIG9yaWdpbmFsQ29uc29sZS53YXJuKGZvcm1hdHRlZE1lc3NhZ2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwuRXJyb3I6XG4gICAgICAgIG9yaWdpbmFsQ29uc29sZS5lcnJvcihmb3JtYXR0ZWRNZXNzYWdlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLkRlYnVnOlxuICAgICAgICBvcmlnaW5hbENvbnNvbGUuZGVidWcoZm9ybWF0dGVkTWVzc2FnZSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRlYnVnTG9nZ2VyID0ge1xuICBvdmVycmlkZUNvbnNvbGVNZXRob2RzLFxuICBzZXRFeGVjdXRpbmdQbHVnaW5OYW1lLFxufTtcbiJdfQ==
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Get the storage for the current context
3
+ */
4
+ export declare const getStorage: () => any;
5
+ /**
6
+ * Set up the context and execute the process
7
+ * @param callback The process to be executed after the context is set up
8
+ */
9
+ export declare const executeWithContext: (callback: () => void) => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.executeWithContext = exports.getStorage = void 0;
4
+ const async_hooks_1 = require("async_hooks");
5
+ /**
6
+ * Create global storage
7
+ */
8
+ const globalStorage = {};
9
+ /**
10
+ * Create async local storage
11
+ */
12
+ const asyncLocalStorage = new async_hooks_1.AsyncLocalStorage();
13
+ /**
14
+ * Get the storage for the current context
15
+ */
16
+ const getStorage = () => asyncLocalStorage.getStore() || globalStorage;
17
+ exports.getStorage = getStorage;
18
+ /**
19
+ * Set up the context and execute the process
20
+ * @param callback The process to be executed after the context is set up
21
+ */
22
+ const executeWithContext = (callback) => asyncLocalStorage.run({}, callback);
23
+ exports.executeWithContext = executeWithContext;
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tb24vdXRpbC9zdG9yYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUE4QztBQUU5Qzs7R0FFRztBQUNILE1BQU0sYUFBYSxHQUFRLEVBQUUsQ0FBQztBQUU5Qjs7R0FFRztBQUNILE1BQU0saUJBQWlCLEdBQUcsSUFBSSwrQkFBaUIsRUFBRSxDQUFDO0FBRWxEOztHQUVHO0FBQ0ksTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLElBQUksYUFBYSxDQUFDO0FBQWpFLFFBQUEsVUFBVSxjQUF1RDtBQUU5RTs7O0dBR0c7QUFFSSxNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBb0IsRUFBUSxFQUFFLENBQy9ELGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFEekIsUUFBQSxrQkFBa0Isc0JBQ08iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FzeW5jTG9jYWxTdG9yYWdlfSBmcm9tICdhc3luY19ob29rcyc7XG5cbi8qKlxuICogQ3JlYXRlIGdsb2JhbCBzdG9yYWdlXG4gKi9cbmNvbnN0IGdsb2JhbFN0b3JhZ2U6IGFueSA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZSBhc3luYyBsb2NhbCBzdG9yYWdlXG4gKi9cbmNvbnN0IGFzeW5jTG9jYWxTdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbi8qKlxuICogR2V0IHRoZSBzdG9yYWdlIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTdG9yYWdlID0gKCkgPT4gYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKSB8fCBnbG9iYWxTdG9yYWdlO1xuXG4vKipcbiAqIFNldCB1cCB0aGUgY29udGV4dCBhbmQgZXhlY3V0ZSB0aGUgcHJvY2Vzc1xuICogQHBhcmFtIGNhbGxiYWNrIFRoZSBwcm9jZXNzIHRvIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBjb250ZXh0IGlzIHNldCB1cFxuICovXG5cbmV4cG9ydCBjb25zdCBleGVjdXRlV2l0aENvbnRleHQgPSAoY2FsbGJhY2s6ICgpID0+IHZvaWQpOiB2b2lkID0+XG4gIGFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7fSwgY2FsbGJhY2spO1xuIl19
@@ -0,0 +1,9 @@
1
+ import type { ArgumentConfig, ParseOptions } from 'ts-command-line-args';
2
+ import type { IfApiArgs } from '../types/process-args';
3
+ /**
4
+ * Configuration for if-api.
5
+ */
6
+ export declare const CONFIG: {
7
+ readonly ARGS: ArgumentConfig<IfApiArgs>;
8
+ readonly HELP: ParseOptions<IfApiArgs>;
9
+ };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG = void 0;
4
+ const config_1 = require("../../common/config");
5
+ const { DISCLAIMER_MESSAGE } = config_1.STRINGS;
6
+ /**
7
+ * Configuration for if-api.
8
+ */
9
+ exports.CONFIG = {
10
+ ARGS: {
11
+ debug: {
12
+ type: Boolean,
13
+ alias: 'd',
14
+ description: 'Print debug logs to the console',
15
+ defaultValue: false,
16
+ },
17
+ disableExternalPluginWarning: {
18
+ type: Boolean,
19
+ alias: 'w',
20
+ description: 'Disable external plugin warning',
21
+ defaultValue: false,
22
+ },
23
+ disabledPlugins: {
24
+ type: String,
25
+ alias: 'f',
26
+ description: 'Filename that contains plugin names to be disabled',
27
+ optional: true,
28
+ },
29
+ port: {
30
+ type: String,
31
+ alias: 'p',
32
+ description: 'Port to listen on',
33
+ defaultValue: process.env.PORT ?? '3000',
34
+ },
35
+ host: {
36
+ type: String,
37
+ alias: 'b',
38
+ description: 'Host to listen on',
39
+ defaultValue: process.env.HOST ?? 'localhost',
40
+ },
41
+ help: {
42
+ type: Boolean,
43
+ alias: 'h',
44
+ description: 'Show help',
45
+ optional: true,
46
+ },
47
+ },
48
+ HELP: {
49
+ helpArg: 'help',
50
+ headerContentSections: [
51
+ { header: 'Impact Framework', content: 'Helpful keywords:' },
52
+ ],
53
+ footerContentSections: [
54
+ { header: 'Green Software Foundation', content: DISCLAIMER_MESSAGE },
55
+ ],
56
+ },
57
+ };
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLWFwaS9jb25maWcvY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBLGdEQUE0QztBQUk1QyxNQUFNLEVBQUMsa0JBQWtCLEVBQUMsR0FBRyxnQkFBTyxDQUFDO0FBRXJDOztHQUVHO0FBQ1UsUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFO1FBQ0osS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSxpQ0FBaUM7WUFDOUMsWUFBWSxFQUFFLEtBQUs7U0FDcEI7UUFDRCw0QkFBNEIsRUFBRTtZQUM1QixJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLGlDQUFpQztZQUM5QyxZQUFZLEVBQUUsS0FBSztTQUNwQjtRQUNELGVBQWUsRUFBRTtZQUNmLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLEdBQUc7WUFDVixXQUFXLEVBQUUsb0RBQW9EO1lBQ2pFLFFBQVEsRUFBRSxJQUFJO1NBQ2Y7UUFDRCxJQUFJLEVBQUU7WUFDSixJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLG1CQUFtQjtZQUNoQyxZQUFZLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksTUFBTTtTQUN6QztRQUNELElBQUksRUFBRTtZQUNKLElBQUksRUFBRSxNQUFNO1lBQ1osS0FBSyxFQUFFLEdBQUc7WUFDVixXQUFXLEVBQUUsbUJBQW1CO1lBQ2hDLFlBQVksRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxXQUFXO1NBQzlDO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSxXQUFXO1lBQ3hCLFFBQVEsRUFBRSxJQUFJO1NBQ2Y7S0FDMkI7SUFDOUIsSUFBSSxFQUFFO1FBQ0osT0FBTyxFQUFFLE1BQU07UUFDZixxQkFBcUIsRUFBRTtZQUNyQixFQUFDLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUM7U0FDM0Q7UUFDRCxxQkFBcUIsRUFBRTtZQUNyQixFQUFDLE1BQU0sRUFBRSwyQkFBMkIsRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUM7U0FDbkU7S0FDeUI7Q0FDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtBcmd1bWVudENvbmZpZywgUGFyc2VPcHRpb25zfSBmcm9tICd0cy1jb21tYW5kLWxpbmUtYXJncyc7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi4vLi4vY29tbW9uL2NvbmZpZyc7XG5cbmltcG9ydCB0eXBlIHtJZkFwaUFyZ3N9IGZyb20gJy4uL3R5cGVzL3Byb2Nlc3MtYXJncyc7XG5cbmNvbnN0IHtESVNDTEFJTUVSX01FU1NBR0V9ID0gU1RSSU5HUztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBpZi1hcGkuXG4gKi9cbmV4cG9ydCBjb25zdCBDT05GSUcgPSB7XG4gIEFSR1M6IHtcbiAgICBkZWJ1Zzoge1xuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICAgIGFsaWFzOiAnZCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1ByaW50IGRlYnVnIGxvZ3MgdG8gdGhlIGNvbnNvbGUnLFxuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICB9LFxuICAgIGRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmc6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBhbGlhczogJ3cnLFxuICAgICAgZGVzY3JpcHRpb246ICdEaXNhYmxlIGV4dGVybmFsIHBsdWdpbiB3YXJuaW5nJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgfSxcbiAgICBkaXNhYmxlZFBsdWdpbnM6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGFsaWFzOiAnZicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbGVuYW1lIHRoYXQgY29udGFpbnMgcGx1Z2luIG5hbWVzIHRvIGJlIGRpc2FibGVkJyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gICAgcG9ydDoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgYWxpYXM6ICdwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnUG9ydCB0byBsaXN0ZW4gb24nLFxuICAgICAgZGVmYXVsdFZhbHVlOiBwcm9jZXNzLmVudi5QT1JUID8/ICczMDAwJyxcbiAgICB9LFxuICAgIGhvc3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGFsaWFzOiAnYicsXG4gICAgICBkZXNjcmlwdGlvbjogJ0hvc3QgdG8gbGlzdGVuIG9uJyxcbiAgICAgIGRlZmF1bHRWYWx1ZTogcHJvY2Vzcy5lbnYuSE9TVCA/PyAnbG9jYWxob3N0JyxcbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBhbGlhczogJ2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdTaG93IGhlbHAnLFxuICAgICAgb3B0aW9uYWw6IHRydWUsXG4gICAgfSxcbiAgfSBhcyBBcmd1bWVudENvbmZpZzxJZkFwaUFyZ3M+LFxuICBIRUxQOiB7XG4gICAgaGVscEFyZzogJ2hlbHAnLFxuICAgIGhlYWRlckNvbnRlbnRTZWN0aW9uczogW1xuICAgICAge2hlYWRlcjogJ0ltcGFjdCBGcmFtZXdvcmsnLCBjb250ZW50OiAnSGVscGZ1bCBrZXl3b3JkczonfSxcbiAgICBdLFxuICAgIGZvb3RlckNvbnRlbnRTZWN0aW9uczogW1xuICAgICAge2hlYWRlcjogJ0dyZWVuIFNvZnR3YXJlIEZvdW5kYXRpb24nLCBjb250ZW50OiBESVNDTEFJTUVSX01FU1NBR0V9LFxuICAgIF0sXG4gIH0gYXMgUGFyc2VPcHRpb25zPElmQXBpQXJncz4sXG59IGFzIGNvbnN0O1xuIl19
@@ -0,0 +1,2 @@
1
+ export { CONFIG } from './config';
2
+ export { STRINGS } from './strings';
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STRINGS = exports.CONFIG = void 0;
4
+ var config_1 = require("./config");
5
+ Object.defineProperty(exports, "CONFIG", { enumerable: true, get: function () { return config_1.CONFIG; } });
6
+ var strings_1 = require("./strings");
7
+ Object.defineProperty(exports, "STRINGS", { enumerable: true, get: function () { return strings_1.STRINGS; } });
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvaWYtYXBpL2NvbmZpZy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBZ0M7QUFBeEIsZ0dBQUEsTUFBTSxPQUFBO0FBQ2QscUNBQWtDO0FBQTFCLGtHQUFBLE9BQU8sT0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7Q09ORklHfSBmcm9tICcuL2NvbmZpZyc7XG5leHBvcnQge1NUUklOR1N9IGZyb20gJy4vc3RyaW5ncyc7XG4iXX0=
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Strings for if-api.
3
+ */
4
+ export declare const STRINGS: {
5
+ readonly SERVER_STARTED: (addr: string) => string;
6
+ readonly SERVER_START_FAILED: (err: Error) => string;
7
+ readonly PROCESSING_REQUEST: "Processing request";
8
+ readonly INTERNAL_SERVER_ERROR: "Internal Server Error";
9
+ readonly INVALID_JSON: "Invalid JSON format";
10
+ readonly INVALID_YAML: "Invalid YAML format";
11
+ readonly MISSING_MANIFEST: "Missing manifest in request body";
12
+ readonly UNSUPPORTED_CONTENT_TYPE: "Unsupported content type. Supported types are: application/json, application/yaml";
13
+ readonly DISCLAIMER_MESSAGE: "Impact Framework API - Green Software Foundation";
14
+ readonly INVALID_DISABLED_PLUGINS: (line: string) => string;
15
+ readonly INVALID_PORT_NUMBER: (port: string) => string;
16
+ };