@venizia/ardor 0.3.6 → 0.4.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.
@@ -5,7 +5,7 @@
5
5
  # docker build -f {{appPath}}/.configs/builders/Dockerfile -t {{app}} \
6
6
  # --build-arg APP_BUILD_COMMIT="$(git rev-parse HEAD)" \
7
7
  # --build-arg APP_BUILD_BRANCH="$(git rev-parse --abbrev-ref HEAD)" .
8
- # docker run --rm -p 8080:8080 -e API_UPSTREAM=http://api:3000 {{app}}
8
+ # docker run --rm -p 8080:8080 -e API_UPSTREAM=http://api:3000 -e VITE_API_URL=/api {{app}}
9
9
  #
10
10
  # The preset cannot know which workspace packages this app needs, so the whole context is copied (the
11
11
  # .dockerignore at the root filters it), then installed and built. A project can list the packages by
@@ -64,14 +64,25 @@ LABEL org.opencontainers.image.revision="${APP_BUILD_COMMIT}"
64
64
  COPY --from=builder /home/bun/app/{{appPath}}/.configs/builders/nginx.conf.template /etc/nginx/templates/default.conf.template
65
65
  COPY --from=builder --chown=101:101 /home/bun/app/{{appPath}}/dist /usr/share/nginx/html
66
66
 
67
+ # The runtime config: this script writes /usr/share/nginx/html/config.js from the VITE_ environment variables
68
+ # when the container starts. 0755 because the base entrypoint skips a script without the executable bit; the
69
+ # file it rewrites is the one the build copied from src/public, owned by 101 above.
70
+ COPY --from=builder --chmod=0755 /home/bun/app/{{appPath}}/.configs/builders/docker-entrypoint.d/40-runtime-config.sh /docker-entrypoint.d/40-runtime-config.sh
71
+
67
72
  # Where /api goes: a compose service name, a cluster service, an address (an origin, with no path).
68
73
  ENV API_UPSTREAM=http://api:3000
69
74
 
75
+ # The variables the app cannot run without, comma separated. A container that starts without one of them,
76
+ # or with it empty, stops and names it instead of falling back to a build-time value. Any name works, not
77
+ # only VITE_ ones; `-e APP_REQUIRED_ENV=...` overrides the list for one environment. Uncomment and list yours:
78
+ # ENV APP_REQUIRED_ENV=VITE_API_URL
79
+
70
80
  # The base image reads the DNS servers of /etc/resolv.conf into ${NGINX_LOCAL_RESOLVERS}, which the template
71
81
  # gives to `resolver`: nginx looks the upstream up per request, so the container starts without it.
72
82
  ENV NGINX_ENTRYPOINT_LOCAL_RESOLVERS=1
73
83
 
74
- # No ENTRYPOINT on purpose: the base image's /docker-entrypoint.sh renders the templates.
84
+ # No ENTRYPOINT on purpose: the base image's /docker-entrypoint.sh renders the templates and runs the
85
+ # scripts of /docker-entrypoint.d/ (a custom ENTRYPOINT would replace it and skip both).
75
86
  EXPOSE 8080
76
87
 
77
88
  CMD ["nginx", "-g", "daemon off;"]
@@ -0,0 +1,129 @@
1
+ #!/bin/sh
2
+ # Writes /usr/share/nginx/html/config.js from the container's environment, so one built image serves
3
+ # every environment: `docker run -e VITE_API_URL=https://api.example.com image`.
4
+ #
5
+ # The nginx image runs every executable file of /docker-entrypoint.d/ in `sort -V` order before it starts
6
+ # nginx. The 40 puts this after the base image's own scripts. A script without the executable bit is
7
+ # skipped, hence `COPY --chmod=0755` in the Dockerfile; the Dockerfile must not declare an ENTRYPOINT,
8
+ # which would replace the script that runs this directory.
9
+ #
10
+ # What is published: the variables named VITE_ followed by capitals, digits and underscores, and nothing
11
+ # else. That is Vite's own rule for what reaches the browser, so the same names work in dev and here.
12
+ # Every published value is readable by every visitor: never put a secret in a VITE_ variable. A name
13
+ # with SECRET, PASSWORD or TOKEN in it stops the container, to catch that mistake early (a name with KEY
14
+ # is fine: public keys are normal). Values are escaped as JavaScript string content, so no value can
15
+ # end its string or the file.
16
+ #
17
+ # Required variables: APP_REQUIRED_ENV lists, comma separated, the variables the app cannot run without,
18
+ # for example `ENV APP_REQUIRED_ENV="VITE_API_URL,API_UPSTREAM"` in the app's Dockerfile (an operator
19
+ # overrides it with `-e`). A listed variable that is unset or empty stops the container with exit 1, and
20
+ # the message names every missing one - never a value. Any variable name can be listed, not only VITE_
21
+ # ones; a spaces-only or empty entry is skipped, and an entry that is not a variable name is an error.
22
+ # Nothing listed checks nothing. A mounted config.js is kept before any check, as the operator supplied it.
23
+ #
24
+ # RUNTIME_CONFIG_TARGET names another file, for the tests; it is not a VITE_ name, so it is never published.
25
+ set -eu
26
+
27
+ TARGET="${RUNTIME_CONFIG_TARGET:-/usr/share/nginx/html/config.js}"
28
+
29
+ # A read-only file is one the operator mounted over config.js: keep it as it is.
30
+ if [ -e "$TARGET" ] && [ ! -w "$TARGET" ]; then
31
+ echo "[runtime-config] $TARGET is read-only (mounted): keeping the supplied file"
32
+ exit 0
33
+ fi
34
+
35
+ # One awk program, so the values never pass through a shell expansion. ENVIRON holds them as they are.
36
+ BODY=$(awk '
37
+ function escape(text, result, index_, character) {
38
+ result = ""
39
+ for (index_ = 1; index_ <= length(text); index_++) {
40
+ character = substr(text, index_, 1)
41
+ result = result ((character in escapes) ? escapes[character] : character)
42
+ }
43
+ return result
44
+ }
45
+
46
+ BEGIN {
47
+ for (code = 1; code < 32; code++) {
48
+ escapes[sprintf("%c", code)] = sprintf("\\u%04x", code)
49
+ }
50
+ escapes[sprintf("%c", 127)] = "\\u007f"
51
+ escapes["\\"] = "\\\\"
52
+ escapes["\""] = "\\\""
53
+ escapes["<"] = "\\u003c"
54
+ escapes[">"] = "\\u003e"
55
+ escapes["&"] = "\\u0026"
56
+
57
+ count = 0
58
+ failed = 0
59
+
60
+ # Names only, in the order declared; a value never reaches a message.
61
+ entries = split(ENVIRON["APP_REQUIRED_ENV"], declared, ",")
62
+ missing = ""
63
+ for (position = 1; position <= entries; position++) {
64
+ entry = declared[position]
65
+ gsub(/^[ \t]+/, "", entry)
66
+ gsub(/[ \t]+$/, "", entry)
67
+ if (entry == "") {
68
+ continue
69
+ }
70
+ if (entry !~ /^[A-Za-z_][A-Za-z0-9_]*$/) {
71
+ print "[runtime-config] FATAL: APP_REQUIRED_ENV entry " position " is not a variable name (letters, digits and _, not starting with a digit)" > "/dev/stderr"
72
+ failed = 1
73
+ continue
74
+ }
75
+ if (entry in seen) {
76
+ continue
77
+ }
78
+ seen[entry] = 1
79
+ if (!(entry in ENVIRON) || ENVIRON[entry] == "") {
80
+ missing = missing (missing == "" ? "" : ", ") entry
81
+ }
82
+ }
83
+ if (missing != "") {
84
+ print "[runtime-config] FATAL: required variable(s) missing or empty: " missing > "/dev/stderr"
85
+ failed = 1
86
+ }
87
+
88
+ for (name in ENVIRON) {
89
+ if (name !~ /^VITE_[A-Z0-9_]+$/) {
90
+ continue
91
+ }
92
+ if (name ~ /SECRET|PASSWORD|TOKEN/) {
93
+ print "[runtime-config] " name " looks like a secret, and every VITE_ variable is published to every visitor: rename it or keep it out of VITE_" > "/dev/stderr"
94
+ failed = 1
95
+ continue
96
+ }
97
+ names[++count] = name
98
+ }
99
+ if (failed) {
100
+ exit 1
101
+ }
102
+
103
+ for (i = 2; i <= count; i++) {
104
+ current = names[i]
105
+ for (j = i - 1; j >= 1 && names[j] > current; j--) {
106
+ names[j + 1] = names[j]
107
+ }
108
+ names[j + 1] = current
109
+ }
110
+
111
+ for (i = 1; i <= count; i++) {
112
+ printf " \"%s\": \"%s\"%s\n", names[i], escape(ENVIRON[names[i]]), (i < count ? "," : "")
113
+ }
114
+ }
115
+ ' </dev/null) || {
116
+ echo "[runtime-config] FATAL: config.js was not written" >&2
117
+ exit 1
118
+ }
119
+
120
+ {
121
+ printf 'window.__APP_CONFIG__ = Object.freeze({'
122
+ if [ -n "$BODY" ]; then
123
+ printf '\n%s\n' "$BODY"
124
+ fi
125
+ printf '});\n'
126
+ } >"$TARGET"
127
+
128
+ NAMES=$(printf '%s\n' "$BODY" | sed -n 's/^ "\([A-Z0-9_]*\)": .*/\1/p' | tr '\n' ' ')
129
+ echo "[runtime-config] wrote $TARGET with: ${NAMES:-nothing}"
@@ -20,6 +20,12 @@ server {
20
20
  proxy_set_header X-Forwarded-Proto $scheme;
21
21
  }
22
22
 
23
+ # The runtime config is written when the container starts and has no hash in its name: never cached.
24
+ location = /config.js {
25
+ add_header Cache-Control "no-store";
26
+ try_files $uri =404;
27
+ }
28
+
23
29
  # The built files carry a content hash in their name, so a browser may keep them for good.
24
30
  location /assets/ {
25
31
  expires 1y;
@@ -1,4 +1,4 @@
1
- # Paths oxfmt skips: one gitignore-style pattern per line, relative to this app.
2
- # `devz lint` passes each line on as !pattern; lines starting with # are comments.
1
+ # Paths bun fmt skips: one gitignore-style pattern per line, relative to this app.
2
+ # `devz lint` passes each line on as --ignore-pattern; lines starting with # are comments.
3
3
  # Example: vendored code that keeps its own format.
4
4
  # src/vendor/**
@@ -6,3 +6,8 @@ PORT={{devPort}}
6
6
 
7
7
  # The backend the dev server forwards /api to. Empty: the one chosen when the app was added (none, if it had no backend).
8
8
  API_URL={{apiUrl}}
9
+
10
+ # The API the app calls. Empty: /api. In dev the app reads it as import.meta.env.VITE_API_URL; in the image it
11
+ # is the VITE_API_URL given to `docker run -e`, which config.js carries to the browser when the container starts.
12
+ # Every VITE_ variable is public: anything published is readable by every visitor. Never put a secret in one.
13
+ VITE_API_URL=
@@ -1,10 +1,11 @@
1
1
  import 'reflect-metadata';
2
2
 
3
- import { describe, expect, test } from 'bun:test';
3
+ import { afterEach, describe, expect, test } from 'bun:test';
4
4
 
5
5
  import {
6
6
  BaseArdorApplication,
7
7
  CoreBindings,
8
+ RUNTIME_CONFIG_GLOBAL,
8
9
  type IApplicationInfo,
9
10
  type IArtifactIndex,
10
11
  } from '@venizia/ardor';
@@ -24,14 +25,26 @@ class TestApplication extends BaseArdorApplication {
24
25
  bindContext(): void {}
25
26
  }
26
27
 
28
+ const restUrlOf = async (): Promise<unknown> => {
29
+ const application = new TestApplication();
30
+
31
+ await application.start();
32
+
33
+ return application.get<{ url: string }>({ key: CoreBindings.REST_DATA_PROVIDER_OPTIONS }).url;
34
+ };
35
+
27
36
  describe('AdminConfiguration', () => {
37
+ afterEach(() => {
38
+ Reflect.deleteProperty(globalThis, RUNTIME_CONFIG_GLOBAL);
39
+ });
40
+
28
41
  test('binds the REST data provider options under their key', async () => {
29
- const application = new TestApplication();
42
+ expect(await restUrlOf()).toBe('/api');
43
+ });
30
44
 
31
- await application.start();
45
+ test('the API url is the one config.js wrote when the container started', async () => {
46
+ Reflect.set(globalThis, RUNTIME_CONFIG_GLOBAL, { VITE_API_URL: 'https://api.example.com' });
32
47
 
33
- expect(application.get({ key: CoreBindings.REST_DATA_PROVIDER_OPTIONS })).toMatchObject({
34
- url: '/api',
35
- });
48
+ expect(await restUrlOf()).toBe('https://api.example.com');
36
49
  });
37
50
  });
@@ -5,6 +5,7 @@ import {
5
5
  DefaultI18nProvider,
6
6
  DefaultRestDataProvider,
7
7
  englishMessages,
8
+ getRuntimeConfig,
8
9
  inject,
9
10
  provide,
10
11
  } from '@venizia/ardor';
@@ -20,8 +21,16 @@ export class AdminConfiguration {
20
21
 
21
22
  @provide({ key: CoreBindings.REST_DATA_PROVIDER_OPTIONS })
22
23
  restDataProviderOptions() {
23
- // No sign-in: no request carries an Authorization header.
24
- return { url: '/api', noAuthPathRegex: /./ };
24
+ // No sign-in: no request carries an Authorization header. The API is `/api` (the image's nginx
25
+ // forwards it to API_UPSTREAM) unless VITE_API_URL says otherwise: set in .env in dev, or written to
26
+ // config.js when the container starts, so one built image serves every environment.
27
+ const url = getRuntimeConfig({
28
+ key: 'VITE_API_URL',
29
+ buildTimeEnv: import.meta.env,
30
+ defaultValue: '/api',
31
+ });
32
+
33
+ return { url, noAuthPathRegex: /./ };
25
34
  }
26
35
 
27
36
  @provide({ key: CoreBindings.I18N_PROVIDER_OPTIONS })
@@ -4,11 +4,17 @@
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <meta name="color-scheme" content="light dark" />
7
- <link rel="icon" href="data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2092%20123'%3E%3Cpath%20d%3D'M46%202C46%202%204%2052%204%2080a42%2042%200%200%200%2084%200C88%2060%2070%2036%2046%202Z'%20fill%3D'%230091EA'%2F%3E%3Cpath%20d%3D'M30%2092c-6-14-2-32%2014-38-4%2012%204%2022%2014%2024%2010%202%2016-6%2016-14%206%2014%202%2030-10%2038-12%208-28%204-34-10Z'%20fill%3D'%237DF3FF'%2F%3E%3C%2Fsvg%3E" />
7
+ <link
8
+ rel="icon"
9
+ href="data:image/svg+xml,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2092%20123'%3E%3Cpath%20d%3D'M46%202C46%202%204%2052%204%2080a42%2042%200%200%200%2084%200C88%2060%2070%2036%2046%202Z'%20fill%3D'%230091EA'%2F%3E%3Cpath%20d%3D'M30%2092c-6-14-2-32%2014-38-4%2012%204%2022%2014%2024%2010%202%2016-6%2016-14%206%2014%202%2030-10%2038-12%208-28%204-34-10Z'%20fill%3D'%237DF3FF'%2F%3E%3C%2Fsvg%3E"
10
+ />
8
11
  <title>{{app}}</title>
9
12
  </head>
10
13
  <body>
11
14
  <div id="root"></div>
15
+ <!-- The runtime config: a classic script, so it runs before the module below. The image rewrites it when the
16
+ container starts; src/public/config.js is the empty one that dev and the build use. -->
17
+ <script src="/config.js"></script>
12
18
  <script type="module" src="/main.tsx"></script>
13
19
  </body>
14
20
  </html>
@@ -0,0 +1,3 @@
1
+ // The runtime config. The image's entrypoint replaces this file when the container starts, with the VITE_
2
+ // environment variables; in dev and in the build it is empty, and the app falls back to import.meta.env.
3
+ window.__APP_CONFIG__ = {};
@@ -13,12 +13,12 @@
13
13
  "dependencies": {
14
14
  "@reduxjs/toolkit": "^2.13.0",
15
15
  "@tanstack/react-query": "^5.104.5",
16
- "@venizia/ardor": "0.3.6",
17
- "@venizia/ignis-connectors": "0.3.6",
18
- "@venizia/ignis-filter": "0.3.6",
19
- "@venizia/ignis-helpers": "0.3.6",
20
- "@venizia/ignis-inversion": "0.3.7",
21
- "@venizia/ignis-kernel": "0.3.6",
16
+ "@venizia/ardor": "0.4.0",
17
+ "@venizia/ignis-connectors": "0.4.0",
18
+ "@venizia/ignis-filter": "0.4.0",
19
+ "@venizia/ignis-helpers": "0.4.0",
20
+ "@venizia/ignis-inversion": "0.4.0",
21
+ "@venizia/ignis-kernel": "0.4.0",
22
22
  "class-variance-authority": "^0.7.1",
23
23
  "clsx": "^2.1.1",
24
24
  "ra-core": "^5.15.5",
@@ -35,11 +35,10 @@
35
35
  "@types/bun": "^1.4.3",
36
36
  "@types/react": "^19",
37
37
  "@types/react-dom": "^19",
38
- "@venizia/dev-configs": "0.3.6",
39
- "@venizia/ignis-boot": "0.3.6",
38
+ "@venizia/dev-configs": "0.4.0",
39
+ "@venizia/ignis-boot": "0.4.0",
40
40
  "@vitejs/plugin-react": "^6.1.2",
41
41
  "eslint": "^10.13.0",
42
- "oxfmt": "0.74.0",
43
42
  "oxlint": "1.89.0",
44
43
  "oxlint-tsgolint": "7.0.2004",
45
44
  "tailwindcss": "^4.3.3",
@@ -47,12 +46,12 @@
47
46
  "vite": "^8.3.5"
48
47
  },
49
48
  "peers": {
50
- "@venizia/dev-configs": "^0.3.6",
51
- "@venizia/ignis-connectors": "^0.3.6",
52
- "@venizia/ignis-filter": "^0.3.6",
53
- "@venizia/ignis-helpers": "^0.3.6",
54
- "@venizia/ignis-inversion": "^0.3.7",
55
- "@venizia/ignis-kernel": "^0.3.6"
49
+ "@venizia/dev-configs": "^0.4.0",
50
+ "@venizia/ignis-connectors": "^0.4.0",
51
+ "@venizia/ignis-filter": "^0.4.0",
52
+ "@venizia/ignis-helpers": "^0.4.0",
53
+ "@venizia/ignis-inversion": "^0.4.0",
54
+ "@venizia/ignis-kernel": "^0.4.0"
56
55
  },
57
56
  "scripts": {
58
57
  "server:dev": "vite --config .configs/builders/vite.config.mts",
@@ -1,4 +1,4 @@
1
- # Paths oxfmt skips: one gitignore-style pattern per line, relative to this app.
2
- # `devz lint` passes each line on as !pattern; lines starting with # are comments.
1
+ # Paths bun fmt skips: one gitignore-style pattern per line, relative to this app.
2
+ # `devz lint` passes each line on as --ignore-pattern; lines starting with # are comments.
3
3
  # Example: vendored code that keeps its own format.
4
4
  # src/vendor/**
@@ -5,10 +5,9 @@
5
5
  "devDependencies": {
6
6
  "@types/bun": "^1.4.3",
7
7
  "@types/react": "^19",
8
- "@venizia/ardor": "^0.3.6",
9
- "@venizia/dev-configs": "0.3.6",
8
+ "@venizia/ardor": "^0.4.0",
9
+ "@venizia/dev-configs": "0.4.0",
10
10
  "eslint": "^10.13.0",
11
- "oxfmt": "0.74.0",
12
11
  "oxlint": "1.89.0",
13
12
  "oxlint-tsgolint": "7.0.2004",
14
13
  "react": "^19.3.1",
@@ -18,7 +17,7 @@
18
17
  "typescript": "^6.0.3"
19
18
  },
20
19
  "peerDependencies": {
21
- "@venizia/ardor": "^0.3.6",
20
+ "@venizia/ardor": "^0.4.0",
22
21
  "react": "^19.3.1",
23
22
  "react-dom": "^19.3.1",
24
23
  "react-router-dom": "^7.18.4",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@venizia/ardor",
3
- "version": "0.3.6",
3
+ "version": "0.4.0",
4
4
  "description": "ARDOR - frontend application framework for the VENIZIA family. One entry point over ardor-kernel, ardor-react and ardor-admin: IGNIS inversion of control, a REST data layer, auth and i18n providers, and the React bindings for a react-admin application.",
5
5
  "keywords": [
6
6
  "ardor",
@@ -18,24 +18,29 @@
18
18
  "venizia"
19
19
  ],
20
20
  "homepage": "https://ardor.venizia.ai",
21
- "repository": {
22
- "type": "git",
23
- "url": "git+https://github.com/VENIZIA-AI/ardor.git",
24
- "directory": "packages/ardor"
25
- },
26
21
  "bugs": {
27
22
  "url": "https://github.com/VENIZIA-AI/ardor/issues"
28
23
  },
24
+ "license": "MIT",
29
25
  "author": {
30
26
  "name": "VENIZIA AI Developer",
31
27
  "email": "developer@venizia.ai",
32
28
  "url": "https://venizia.ai"
33
29
  },
34
- "license": "MIT",
35
- "engines": {
36
- "bun": ">=1.4"
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/VENIZIA-AI/ardor.git",
33
+ "directory": "packages/ardor"
37
34
  },
35
+ "files": [
36
+ "README.md",
37
+ "LICENSE.md",
38
+ "dist",
39
+ "!/**/__tests__",
40
+ "!**/*.tsbuildinfo"
41
+ ],
38
42
  "type": "module",
43
+ "sideEffects": false,
39
44
  "main": "./dist/index.js",
40
45
  "module": "./dist/index.js",
41
46
  "types": "./dist/index.d.ts",
@@ -57,20 +62,6 @@
57
62
  },
58
63
  "./package.json": "./package.json"
59
64
  },
60
- "sideEffects": false,
61
- "vulcan": {
62
- "presets": {
63
- "app": "./dist/presets/app/preset.json",
64
- "lib": "./dist/presets/lib/preset.json"
65
- }
66
- },
67
- "files": [
68
- "README.md",
69
- "LICENSE.md",
70
- "dist",
71
- "!/**/__tests__",
72
- "!**/*.tsbuildinfo"
73
- ],
74
65
  "publishConfig": {
75
66
  "access": "public"
76
67
  },
@@ -79,18 +70,28 @@
79
70
  "prepublishOnly": "make rebuild"
80
71
  },
81
72
  "dependencies": {
82
- "@venizia/ardor-admin": "0.3.6",
83
- "@venizia/ardor-kernel": "0.3.6",
84
- "@venizia/ardor-react": "0.3.6"
73
+ "@venizia/ardor-admin": "0.4.0",
74
+ "@venizia/ardor-kernel": "0.4.0",
75
+ "@venizia/ardor-react": "0.4.0"
76
+ },
77
+ "devDependencies": {
78
+ "@size-limit/preset-small-lib": "^14.2.0",
79
+ "@venizia/dev-configs": "^0.4.0",
80
+ "eslint": "^10.13.0",
81
+ "oxlint": "1.89.0",
82
+ "oxlint-tsgolint": "7.0.2004",
83
+ "size-limit": "^14.2.0",
84
+ "tsc-alias": "~1.8.17",
85
+ "typescript": "^6.0.3"
85
86
  },
86
87
  "peerDependencies": {
87
88
  "@reduxjs/toolkit": ">=2.13.0",
88
89
  "@tanstack/react-query": ">=5.104.5",
89
- "@venizia/ignis-connectors": "^0.3.6",
90
- "@venizia/ignis-filter": "^0.3.6",
91
- "@venizia/ignis-helpers": "^0.3.6",
92
- "@venizia/ignis-inversion": "^0.3.7",
93
- "@venizia/ignis-kernel": "^0.3.6",
90
+ "@venizia/ignis-connectors": "^0.4.0",
91
+ "@venizia/ignis-filter": "^0.4.0",
92
+ "@venizia/ignis-helpers": "^0.4.0",
93
+ "@venizia/ignis-inversion": "^0.4.0",
94
+ "@venizia/ignis-kernel": "^0.4.0",
94
95
  "ra-core": ">=5.15.5",
95
96
  "ra-i18n-polyglot": ">=5.15.5",
96
97
  "react": ">=19.3.1",
@@ -108,17 +109,6 @@
108
109
  "optional": true
109
110
  }
110
111
  },
111
- "devDependencies": {
112
- "@size-limit/preset-small-lib": "^14.2.0",
113
- "@venizia/dev-configs": "^0.3.6",
114
- "eslint": "^10.13.0",
115
- "oxfmt": "0.74.0",
116
- "oxlint": "1.89.0",
117
- "oxlint-tsgolint": "7.0.2004",
118
- "size-limit": "^14.2.0",
119
- "tsc-alias": "~1.8.17",
120
- "typescript": "^6.0.3"
121
- },
122
112
  "size-limit": [
123
113
  {
124
114
  "path": "dist/index.js",
@@ -140,5 +130,14 @@
140
130
  ],
141
131
  "limit": "350 B"
142
132
  }
143
- ]
133
+ ],
134
+ "engines": {
135
+ "bun": ">=1.4"
136
+ },
137
+ "vulcan": {
138
+ "presets": {
139
+ "app": "./dist/presets/app/preset.json",
140
+ "lib": "./dist/presets/lib/preset.json"
141
+ }
142
+ }
144
143
  }
@@ -1,4 +0,0 @@
1
- import { defineConfig } from 'oxfmt';
2
- import { browserOxfmtConfigs } from '@venizia/dev-configs/formatters';
3
-
4
- export default defineConfig(browserOxfmtConfigs);
@@ -1,4 +0,0 @@
1
- import { defineConfig } from 'oxfmt';
2
- import { browserOxfmtConfigs } from '@venizia/dev-configs/formatters';
3
-
4
- export default defineConfig(browserOxfmtConfigs);