From e25d2a34f28d785056ff4d7f5bcefe984610c89b Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 25 Jul 2025 11:17:25 -0300 Subject: [PATCH 01/26] added initial files --- packages/ferric/src/generate.ts | 0 packages/ferric/src/template.ts | 58 +++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 packages/ferric/src/generate.ts create mode 100644 packages/ferric/src/template.ts diff --git a/packages/ferric/src/generate.ts b/packages/ferric/src/generate.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/ferric/src/template.ts b/packages/ferric/src/template.ts new file mode 100644 index 00000000..2800ab51 --- /dev/null +++ b/packages/ferric/src/template.ts @@ -0,0 +1,58 @@ +export function cargoTomlTemplate(projectName: string) { + return ` +[package] +name = ${projectName} +version = "1.0.0" +edition = "2021" +license = "MIT" + +[lib] +crate-type = ["cdylib"] + +[dependencies.napi] +version = "3.1" +default-features = false +# see https://nodejs.org/api/n-api.html#node-api-version-matrix +features = ["napi4"] + +[dependencies.napi-derive] +version = "3.1" +features = ["type-def"] + +[build-dependencies] +napi-build = "2" + +[profile.release] +lto = true +codegen-units = 1 +strip = "symbols" +opt-level = "z" +panic = "abort" +`; +} + +export const GIT_IGNORE_TEMPLATE = ` +target +Cargo.lock + +*.xcframework/ +*.apple.node/ +*.android.node/ + +dist +`; + +export const BUILD_RS_TEMPLATE = ` +fn main() { + napi_build::setup(); +} +`; + +export const LIB_RS_TEMPLATE = ` +use napi_derive::napi; + +#[napi] +pub fn sum(a: i32, b: i32) -> i32 { + a + b +} +`; From 4745e5aac795f213ce4210fe7ca9d2eb94d751f6 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 25 Jul 2025 11:21:03 -0300 Subject: [PATCH 02/26] removed ferric example --- packages/ferric-example/.gitignore | 10 ---------- packages/ferric-example/Cargo.toml | 25 ------------------------- packages/ferric-example/build.rs | 3 --- packages/ferric-example/package.json | 21 --------------------- packages/ferric-example/src/lib.rs | 6 ------ 5 files changed, 65 deletions(-) delete mode 100644 packages/ferric-example/.gitignore delete mode 100644 packages/ferric-example/Cargo.toml delete mode 100644 packages/ferric-example/build.rs delete mode 100644 packages/ferric-example/package.json delete mode 100644 packages/ferric-example/src/lib.rs diff --git a/packages/ferric-example/.gitignore b/packages/ferric-example/.gitignore deleted file mode 100644 index 31c8570c..00000000 --- a/packages/ferric-example/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -/target -Cargo.lock - -/*.xcframework/ -/*.apple.node/ -/*.android.node/ - -# Generated files -/ferric_example.d.ts -/ferric_example.js diff --git a/packages/ferric-example/Cargo.toml b/packages/ferric-example/Cargo.toml deleted file mode 100644 index 2524a0e8..00000000 --- a/packages/ferric-example/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "ferric-example" -version = "1.0.0" -edition = "2021" -license = "MIT" - -[lib] -crate-type = ["cdylib"] - -[dependencies.napi] -version = "3.1" -default-features = false -# see https://nodejs.org/api/n-api.html#node-api-version-matrix -features = ["napi3"] - -[dependencies.napi-derive] -version = "3.1" -features = ["type-def"] - -[build-dependencies] -napi-build = "2" - -[profile.release] -lto = true -codegen-units = 1 diff --git a/packages/ferric-example/build.rs b/packages/ferric-example/build.rs deleted file mode 100644 index bbfc9e4b..00000000 --- a/packages/ferric-example/build.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - napi_build::setup(); -} diff --git a/packages/ferric-example/package.json b/packages/ferric-example/package.json deleted file mode 100644 index 2365f4e5..00000000 --- a/packages/ferric-example/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@react-native-node-api/ferric-example", - "private": true, - "type": "commonjs", - "version": "0.1.0", - "homepage": "https://github.com/callstackincubator/react-native-node-api", - "repository": { - "type": "git", - "url": "git+https://github.com/callstackincubator/react-native-node-api.git", - "directory": "packages/ferric-example" - }, - "main": "ferric_example.js", - "types": "ferric_example.d.ts", - "scripts": { - "build": "ferric build", - "bootstrap": "npm run build" - }, - "devDependencies": { - "ferric-cli": "*" - } -} diff --git a/packages/ferric-example/src/lib.rs b/packages/ferric-example/src/lib.rs deleted file mode 100644 index ecfd7ab1..00000000 --- a/packages/ferric-example/src/lib.rs +++ /dev/null @@ -1,6 +0,0 @@ -use napi_derive::napi; - -#[napi] -pub fn sum(a: i32, b: i32) -> i32 { - a + b -} From bfb0e6e68c97d59ba03bee003fc6d45364c05dcb Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 25 Jul 2025 20:41:58 -0300 Subject: [PATCH 03/26] add some setup --- package-lock.json | 1002 +++++++++++++++++++- packages/ferric/__tests__/build.test.ts | 7 + packages/ferric/__tests__/generate.test.ts | 7 + packages/ferric/package.json | 12 +- packages/ferric/src/generate.ts | 8 + packages/ferric/src/program.ts | 8 +- packages/ferric/tsconfig.tests.json | 2 +- 7 files changed, 1030 insertions(+), 16 deletions(-) create mode 100644 packages/ferric/__tests__/build.test.ts create mode 100644 packages/ferric/__tests__/generate.test.ts diff --git a/package-lock.json b/package-lock.json index cf6c2324..aecb9e2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5541,10 +5541,6 @@ "node": "^12.20.0 || >=14" } }, - "node_modules/@react-native-node-api/ferric-example": { - "resolved": "packages/ferric-example", - "link": true - }, "node_modules/@react-native-node-api/node-addon-examples": { "resolved": "packages/node-addon-examples", "link": true @@ -5888,6 +5884,286 @@ "node": ">=16.17" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", + "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", + "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", + "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", + "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", + "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", + "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", + "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", + "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", + "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", + "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", + "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", + "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", + "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", + "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", + "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", + "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", + "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", + "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", + "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", + "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -5998,10 +6274,27 @@ "@babel/types": "^7.20.7" } }, + "node_modules/@types/chai": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", + "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, @@ -6302,6 +6595,121 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vscode/sudo-prompt": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.1.tgz", @@ -6545,6 +6953,16 @@ "util": "^0.12.5" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -6980,6 +7398,16 @@ "node": ">= 0.8" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -7098,6 +7526,23 @@ ], "license": "CC-BY-4.0" }, + "node_modules/chai": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", + "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7120,6 +7565,16 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -7679,6 +8134,16 @@ "node": ">=0.10.0" } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -7961,6 +8426,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -8214,6 +8686,16 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -8264,6 +8746,16 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/exponential-backoff": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", @@ -10096,6 +10588,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", + "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", + "dev": true, + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10105,6 +10604,16 @@ "yallist": "^3.0.2" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -10845,7 +11354,26 @@ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/natural-compare": { @@ -11360,6 +11888,23 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11421,6 +11966,35 @@ "node": ">= 0.4" } }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -12060,6 +12634,46 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup": { + "version": "4.45.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", + "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.45.1", + "@rollup/rollup-android-arm64": "4.45.1", + "@rollup/rollup-darwin-arm64": "4.45.1", + "@rollup/rollup-darwin-x64": "4.45.1", + "@rollup/rollup-freebsd-arm64": "4.45.1", + "@rollup/rollup-freebsd-x64": "4.45.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", + "@rollup/rollup-linux-arm-musleabihf": "4.45.1", + "@rollup/rollup-linux-arm64-gnu": "4.45.1", + "@rollup/rollup-linux-arm64-musl": "4.45.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-musl": "4.45.1", + "@rollup/rollup-linux-s390x-gnu": "4.45.1", + "@rollup/rollup-linux-x64-gnu": "4.45.1", + "@rollup/rollup-linux-x64-musl": "4.45.1", + "@rollup/rollup-win32-arm64-msvc": "4.45.1", + "@rollup/rollup-win32-ia32-msvc": "4.45.1", + "@rollup/rollup-win32-x64-msvc": "4.45.1", + "fsevents": "~2.3.2" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12389,6 +13003,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -12469,6 +13090,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -12571,6 +13202,13 @@ "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -12598,6 +13236,13 @@ "node": ">= 0.6" } }, + "node_modules/std-env": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", + "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", + "dev": true, + "license": "MIT" + }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -12703,6 +13348,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", + "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/strnum": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", @@ -12819,6 +13484,95 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", + "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13207,6 +13961,218 @@ "node": ">= 0.8" } }, + "node_modules/vite": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -13285,6 +14251,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -13746,6 +14729,9 @@ }, "bin": { "ferric": "bin/ferric.js" + }, + "devDependencies": { + "vitest": "^3.2.4" } }, "packages/ferric-example": { diff --git a/packages/ferric/__tests__/build.test.ts b/packages/ferric/__tests__/build.test.ts new file mode 100644 index 00000000..2009fd2d --- /dev/null +++ b/packages/ferric/__tests__/build.test.ts @@ -0,0 +1,7 @@ +import { assert, describe, it } from "vitest"; + +describe("", () => { + it("", () => { + assert.equal(1, 1); + }); +}); diff --git a/packages/ferric/__tests__/generate.test.ts b/packages/ferric/__tests__/generate.test.ts new file mode 100644 index 00000000..2009fd2d --- /dev/null +++ b/packages/ferric/__tests__/generate.test.ts @@ -0,0 +1,7 @@ +import { assert, describe, it } from "vitest"; + +describe("", () => { + it("", () => { + assert.equal(1, 1); + }); +}); diff --git a/packages/ferric/package.json b/packages/ferric/package.json index d862a1a9..c0c1967b 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -13,15 +13,19 @@ "ferric": "./bin/ferric.js" }, "scripts": { - "start": "tsx src/run.ts" + "start": "tsx src/run.ts", + "test": "vitest" }, "dependencies": { - "@napi-rs/cli": "~3.0.3", "@commander-js/extra-typings": "^13.1.0", + "@napi-rs/cli": "~3.0.3", "bufout": "^0.3.2", "chalk": "^5.4.1", "commander": "^13.1.0", - "react-native-node-api": "0.3.2", - "ora": "^8.2.0" + "ora": "^8.2.0", + "react-native-node-api": "0.3.2" + }, + "devDependencies": { + "vitest": "^3.2.4" } } diff --git a/packages/ferric/src/generate.ts b/packages/ferric/src/generate.ts index e69de29b..122d8c13 100644 --- a/packages/ferric/src/generate.ts +++ b/packages/ferric/src/generate.ts @@ -0,0 +1,8 @@ +import { Command } from "@commander-js/extra-typings"; + +export const generateCommand = new Command("generate") + .description("Generate the project scaffold") + .argument("", "Type the project name") + .action((str, options) => { + + }) diff --git a/packages/ferric/src/program.ts b/packages/ferric/src/program.ts index f8059c48..a205aeaf 100644 --- a/packages/ferric/src/program.ts +++ b/packages/ferric/src/program.ts @@ -2,8 +2,10 @@ import { Command } from "@commander-js/extra-typings"; import { printBanner } from "./banner.js"; import { buildCommand } from "./build.js"; +import { generateCommand } from "./generate.js"; export const program = new Command("ferric") - .hook("preAction", () => printBanner()) - .description("Rust Node-API Modules for React Native") - .addCommand(buildCommand); + .hook("preAction", () => printBanner()) + .description("Rust Node-API Modules for React Native") + .addCommand(buildCommand) + .addCommand(generateCommand); diff --git a/packages/ferric/tsconfig.tests.json b/packages/ferric/tsconfig.tests.json index 17ee7c84..f6c792b5 100644 --- a/packages/ferric/tsconfig.tests.json +++ b/packages/ferric/tsconfig.tests.json @@ -4,7 +4,7 @@ "composite": true, "emitDeclarationOnly": true }, - "include": ["src/**/*.test.ts"], + "include": ["__tests__/**/*.test.ts"], "exclude": [], "references": [ { From 1fb0a22748185e8d2a718ca56aca81f5a6922081 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 25 Jul 2025 21:29:02 -0300 Subject: [PATCH 04/26] add scripts --- apps/test-app/package.json | 7 +++++-- package-lock.json | 7 ++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/apps/test-app/package.json b/apps/test-app/package.json index dc360b3a..212a314a 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -14,7 +14,10 @@ "test:ios": "mocha-remote --exit-on-error -- concurrently --passthrough-arguments --kill-others-on-fail npm:metro 'npm:ios -- {@}' --", "test:ios:allTests": "MOCHA_REMOTE_CONTEXT=allTests npm run test:ios -- ", "test:ios:nodeAddonExamples": "MOCHA_REMOTE_CONTEXT=nodeAddonExamples npm run test:ios -- ", - "test:ios:ferricExample": "MOCHA_REMOTE_CONTEXT=ferricExample npm run test:ios -- " + "test:ios:ferricExample": "MOCHA_REMOTE_CONTEXT=ferricExample npm run test:ios -- ", + "gen:rs": "ferric init lib_in_rust", + "build:rs": "ferric build --cwd lib_in_rust", + "build:rs:release": "npm run build:rs --configuration release" }, "dependencies": { "@babel/core": "^7.26.10", @@ -30,7 +33,7 @@ "@types/mocha": "^10.0.10", "@types/react": "^19.0.0", "concurrently": "^9.1.2", - "ferric-example": "^0.1.0", + "ferric-cli": "*", "mocha": "^11.6.0", "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", diff --git a/package-lock.json b/package-lock.json index aecb9e2d..05a6c943 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,7 @@ "@types/mocha": "^10.0.10", "@types/react": "^19.0.0", "concurrently": "^9.1.2", - "ferric-example": "^0.1.0", + "ferric-cli": "*", "mocha": "^11.6.0", "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", @@ -8911,10 +8911,6 @@ "resolved": "packages/ferric", "link": true }, - "node_modules/ferric-example": { - "resolved": "packages/ferric-example", - "link": true - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -14737,6 +14733,7 @@ "packages/ferric-example": { "name": "@react-native-node-api/ferric-example", "version": "0.1.0", + "extraneous": true, "devDependencies": { "ferric-cli": "*" } From da39e3a0edec3f72097dd253343e60d0dfee84ab Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 25 Jul 2025 22:04:08 -0300 Subject: [PATCH 05/26] changed template to files --- apps/test-app/package.json | 2 +- packages/ferric/src/templates/.gitignore | 8 +++++ .../src/{template.ts => templates/Cargo.toml} | 33 +------------------ packages/ferric/src/templates/build.rs | 3 ++ packages/ferric/src/templates/lib.rs | 6 ++++ 5 files changed, 19 insertions(+), 33 deletions(-) create mode 100644 packages/ferric/src/templates/.gitignore rename packages/ferric/src/{template.ts => templates/Cargo.toml} (50%) create mode 100644 packages/ferric/src/templates/build.rs create mode 100644 packages/ferric/src/templates/lib.rs diff --git a/apps/test-app/package.json b/apps/test-app/package.json index 212a314a..017c3cbf 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -17,7 +17,7 @@ "test:ios:ferricExample": "MOCHA_REMOTE_CONTEXT=ferricExample npm run test:ios -- ", "gen:rs": "ferric init lib_in_rust", "build:rs": "ferric build --cwd lib_in_rust", - "build:rs:release": "npm run build:rs --configuration release" + "build:rs:release": "npm run build:rs -- --configuration release" }, "dependencies": { "@babel/core": "^7.26.10", diff --git a/packages/ferric/src/templates/.gitignore b/packages/ferric/src/templates/.gitignore new file mode 100644 index 00000000..24a51298 --- /dev/null +++ b/packages/ferric/src/templates/.gitignore @@ -0,0 +1,8 @@ +target +Cargo.lock + +*.xcframework/ +*.apple.node/ +*.android.node/ + +dist diff --git a/packages/ferric/src/template.ts b/packages/ferric/src/templates/Cargo.toml similarity index 50% rename from packages/ferric/src/template.ts rename to packages/ferric/src/templates/Cargo.toml index 2800ab51..ea332e8a 100644 --- a/packages/ferric/src/template.ts +++ b/packages/ferric/src/templates/Cargo.toml @@ -1,7 +1,5 @@ -export function cargoTomlTemplate(projectName: string) { - return ` [package] -name = ${projectName} +name = "PROJECT_NAME" version = "1.0.0" edition = "2021" license = "MIT" @@ -27,32 +25,3 @@ lto = true codegen-units = 1 strip = "symbols" opt-level = "z" -panic = "abort" -`; -} - -export const GIT_IGNORE_TEMPLATE = ` -target -Cargo.lock - -*.xcframework/ -*.apple.node/ -*.android.node/ - -dist -`; - -export const BUILD_RS_TEMPLATE = ` -fn main() { - napi_build::setup(); -} -`; - -export const LIB_RS_TEMPLATE = ` -use napi_derive::napi; - -#[napi] -pub fn sum(a: i32, b: i32) -> i32 { - a + b -} -`; diff --git a/packages/ferric/src/templates/build.rs b/packages/ferric/src/templates/build.rs new file mode 100644 index 00000000..bbfc9e4b --- /dev/null +++ b/packages/ferric/src/templates/build.rs @@ -0,0 +1,3 @@ +fn main() { + napi_build::setup(); +} diff --git a/packages/ferric/src/templates/lib.rs b/packages/ferric/src/templates/lib.rs new file mode 100644 index 00000000..1064d5bf --- /dev/null +++ b/packages/ferric/src/templates/lib.rs @@ -0,0 +1,6 @@ +use napi_derive::napi; + +#[napi] +pub fn sum(a: i32, b: i32) -> i32 { + a + b +} From 0fdc681458f1c4878da079d3db9549a08c05914a Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 10:53:48 -0300 Subject: [PATCH 06/26] add changes --- package-lock.json | 1000 +------------------- packages/ferric/__tests__/build.test.ts | 7 - packages/ferric/__tests__/generate.test.ts | 7 - packages/ferric/package.json | 5 +- packages/ferric/src/build.test.ts | 8 + packages/ferric/src/generate.test.ts | 8 + packages/ferric/src/templates/Cargo.toml | 2 +- packages/ferric/tsconfig.tests.json | 2 +- 8 files changed, 24 insertions(+), 1015 deletions(-) delete mode 100644 packages/ferric/__tests__/build.test.ts delete mode 100644 packages/ferric/__tests__/generate.test.ts create mode 100644 packages/ferric/src/build.test.ts create mode 100644 packages/ferric/src/generate.test.ts diff --git a/package-lock.json b/package-lock.json index 05a6c943..6c25412e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5884,286 +5884,6 @@ "node": ">=16.17" } }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", - "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", - "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", - "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", - "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", - "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", - "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", - "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", - "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", - "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", - "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", - "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", - "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", - "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", - "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", - "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", - "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", - "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", - "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", - "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", - "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@sideway/address": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", @@ -6274,23 +5994,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/chai": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.2.tgz", - "integrity": "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -6595,121 +6298,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@vitest/expect": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", - "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", - "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "3.2.4", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", - "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", - "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.2.4", - "pathe": "^2.0.3", - "strip-literal": "^3.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", - "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "magic-string": "^0.30.17", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", - "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyspy": "^4.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", - "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.2.4", - "loupe": "^3.1.4", - "tinyrainbow": "^2.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/@vscode/sudo-prompt": { "version": "9.3.1", "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.1.tgz", @@ -6953,16 +6541,6 @@ "util": "^0.12.5" } }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", @@ -7398,16 +6976,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -7526,23 +7094,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chai": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz", - "integrity": "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -7565,16 +7116,6 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "license": "MIT" }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" - } - }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", @@ -8134,16 +7675,6 @@ "node": ">=0.10.0" } }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -8426,13 +7957,6 @@ "node": ">= 0.4" } }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", @@ -8686,16 +8210,6 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -8746,16 +8260,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/exponential-backoff": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz", @@ -10584,13 +10088,6 @@ "loose-envify": "cli.js" } }, - "node_modules/loupe": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.0.tgz", - "integrity": "sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==", - "dev": true, - "license": "MIT" - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -10600,16 +10097,6 @@ "yallist": "^3.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", @@ -11345,31 +10832,12 @@ "license": "MIT" }, "node_modules/mute-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "license": "ISC", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/natural-compare": { @@ -11884,23 +11352,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pathval": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", - "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.16" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -11962,35 +11413,6 @@ "node": ">= 0.4" } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -12630,46 +12052,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rollup": { - "version": "4.45.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz", - "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.45.1", - "@rollup/rollup-android-arm64": "4.45.1", - "@rollup/rollup-darwin-arm64": "4.45.1", - "@rollup/rollup-darwin-x64": "4.45.1", - "@rollup/rollup-freebsd-arm64": "4.45.1", - "@rollup/rollup-freebsd-x64": "4.45.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", - "@rollup/rollup-linux-arm-musleabihf": "4.45.1", - "@rollup/rollup-linux-arm64-gnu": "4.45.1", - "@rollup/rollup-linux-arm64-musl": "4.45.1", - "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", - "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-gnu": "4.45.1", - "@rollup/rollup-linux-riscv64-musl": "4.45.1", - "@rollup/rollup-linux-s390x-gnu": "4.45.1", - "@rollup/rollup-linux-x64-gnu": "4.45.1", - "@rollup/rollup-linux-x64-musl": "4.45.1", - "@rollup/rollup-win32-arm64-msvc": "4.45.1", - "@rollup/rollup-win32-ia32-msvc": "4.45.1", - "@rollup/rollup-win32-x64-msvc": "4.45.1", - "fsevents": "~2.3.2" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -12999,13 +12381,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -13086,16 +12461,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -13198,13 +12563,6 @@ "node": ">=8" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, "node_modules/stackframe": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", @@ -13232,13 +12590,6 @@ "node": ">= 0.6" } }, - "node_modules/std-env": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz", - "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==", - "dev": true, - "license": "MIT" - }, "node_modules/stdin-discarder": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", @@ -13344,26 +12695,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dev": true, - "license": "MIT", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", - "dev": true, - "license": "MIT" - }, "node_modules/strnum": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", @@ -13480,95 +12811,6 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinypool": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", - "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.0.0 || >=20.0.0" - } - }, - "node_modules/tinyrainbow": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", - "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tinyspy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.3.tgz", - "integrity": "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13957,218 +13199,6 @@ "node": ">= 0.8" } }, - "node_modules/vite": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.6.tgz", - "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-node": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", - "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.1", - "es-module-lexer": "^1.7.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite/node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", - "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/chai": "^5.2.2", - "@vitest/expect": "3.2.4", - "@vitest/mocker": "3.2.4", - "@vitest/pretty-format": "^3.2.4", - "@vitest/runner": "3.2.4", - "@vitest/snapshot": "3.2.4", - "@vitest/spy": "3.2.4", - "@vitest/utils": "3.2.4", - "chai": "^5.2.0", - "debug": "^4.4.1", - "expect-type": "^1.2.1", - "magic-string": "^0.30.17", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.14", - "tinypool": "^1.1.1", - "tinyrainbow": "^2.0.0", - "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", - "vite-node": "3.2.4", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.2.4", - "@vitest/ui": "3.2.4", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vlq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", @@ -14247,23 +13277,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -14725,9 +13738,6 @@ }, "bin": { "ferric": "bin/ferric.js" - }, - "devDependencies": { - "vitest": "^3.2.4" } }, "packages/ferric-example": { diff --git a/packages/ferric/__tests__/build.test.ts b/packages/ferric/__tests__/build.test.ts deleted file mode 100644 index 2009fd2d..00000000 --- a/packages/ferric/__tests__/build.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { assert, describe, it } from "vitest"; - -describe("", () => { - it("", () => { - assert.equal(1, 1); - }); -}); diff --git a/packages/ferric/__tests__/generate.test.ts b/packages/ferric/__tests__/generate.test.ts deleted file mode 100644 index 2009fd2d..00000000 --- a/packages/ferric/__tests__/generate.test.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { assert, describe, it } from "vitest"; - -describe("", () => { - it("", () => { - assert.equal(1, 1); - }); -}); diff --git a/packages/ferric/package.json b/packages/ferric/package.json index c0c1967b..7bc3cb53 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -14,7 +14,7 @@ }, "scripts": { "start": "tsx src/run.ts", - "test": "vitest" + "test": "tsx --test --test-reporter=@reporters/github --test-reporter-destination=stdout --test-reporter=spec --test-reporter-destination=stdout src/**/*.test.ts" }, "dependencies": { "@commander-js/extra-typings": "^13.1.0", @@ -24,8 +24,5 @@ "commander": "^13.1.0", "ora": "^8.2.0", "react-native-node-api": "0.3.2" - }, - "devDependencies": { - "vitest": "^3.2.4" } } diff --git a/packages/ferric/src/build.test.ts b/packages/ferric/src/build.test.ts new file mode 100644 index 00000000..25250d9b --- /dev/null +++ b/packages/ferric/src/build.test.ts @@ -0,0 +1,8 @@ +import assert from "node:assert/strict"; +import { describe, it } from "node:test"; + +describe("", () => { + it("", () => { + assert.equal(1, 1); + }); +}); diff --git a/packages/ferric/src/generate.test.ts b/packages/ferric/src/generate.test.ts new file mode 100644 index 00000000..25250d9b --- /dev/null +++ b/packages/ferric/src/generate.test.ts @@ -0,0 +1,8 @@ +import assert from "node:assert/strict"; +import { describe, it } from "node:test"; + +describe("", () => { + it("", () => { + assert.equal(1, 1); + }); +}); diff --git a/packages/ferric/src/templates/Cargo.toml b/packages/ferric/src/templates/Cargo.toml index ea332e8a..f498994b 100644 --- a/packages/ferric/src/templates/Cargo.toml +++ b/packages/ferric/src/templates/Cargo.toml @@ -11,7 +11,7 @@ crate-type = ["cdylib"] version = "3.1" default-features = false # see https://nodejs.org/api/n-api.html#node-api-version-matrix -features = ["napi4"] +features = ["napi3"] [dependencies.napi-derive] version = "3.1" diff --git a/packages/ferric/tsconfig.tests.json b/packages/ferric/tsconfig.tests.json index f6c792b5..17ee7c84 100644 --- a/packages/ferric/tsconfig.tests.json +++ b/packages/ferric/tsconfig.tests.json @@ -4,7 +4,7 @@ "composite": true, "emitDeclarationOnly": true }, - "include": ["__tests__/**/*.test.ts"], + "include": ["src/**/*.test.ts"], "exclude": [], "references": [ { From 77bcff1e09ae563539b355e0e7cc3e47e2ad5ce3 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 13:30:13 -0300 Subject: [PATCH 07/26] added package template --- packages/ferric/src/templates/Cargo.toml | 2 +- packages/ferric/src/templates/package.json | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 packages/ferric/src/templates/package.json diff --git a/packages/ferric/src/templates/Cargo.toml b/packages/ferric/src/templates/Cargo.toml index f498994b..cc658495 100644 --- a/packages/ferric/src/templates/Cargo.toml +++ b/packages/ferric/src/templates/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "PROJECT_NAME" +name = "project_name" version = "1.0.0" edition = "2021" license = "MIT" diff --git a/packages/ferric/src/templates/package.json b/packages/ferric/src/templates/package.json new file mode 100644 index 00000000..16ea6965 --- /dev/null +++ b/packages/ferric/src/templates/package.json @@ -0,0 +1,15 @@ +{ + "name": "project_name", + "private": true, + "version": "0.1.0", + "main": "dist/project_name.js", + "types": "dist/project_name.d.ts", + "scripts": { + "gen:proj": "ferric init", + "build": "ferric build", + "build:release": "npm run build -- --configuration release" + }, + "devDependencies": { + "ferric-cli": "latest" + } +} \ No newline at end of file From de848cde8f91138f44b5ae721acfedc7778c799b Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 13:35:05 -0300 Subject: [PATCH 08/26] renamed command --- packages/ferric/src/build.test.ts | 2 +- packages/ferric/src/{generate.test.ts => init.test.ts} | 2 +- packages/ferric/src/{generate.ts => init.ts} | 4 ++-- packages/ferric/src/program.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename packages/ferric/src/{generate.test.ts => init.test.ts} (83%) rename packages/ferric/src/{generate.ts => init.ts} (64%) diff --git a/packages/ferric/src/build.test.ts b/packages/ferric/src/build.test.ts index 25250d9b..73e5b3b0 100644 --- a/packages/ferric/src/build.test.ts +++ b/packages/ferric/src/build.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; -describe("", () => { +describe("build", () => { it("", () => { assert.equal(1, 1); }); diff --git a/packages/ferric/src/generate.test.ts b/packages/ferric/src/init.test.ts similarity index 83% rename from packages/ferric/src/generate.test.ts rename to packages/ferric/src/init.test.ts index 25250d9b..a35dd8f1 100644 --- a/packages/ferric/src/generate.test.ts +++ b/packages/ferric/src/init.test.ts @@ -1,7 +1,7 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; -describe("", () => { +describe("init", () => { it("", () => { assert.equal(1, 1); }); diff --git a/packages/ferric/src/generate.ts b/packages/ferric/src/init.ts similarity index 64% rename from packages/ferric/src/generate.ts rename to packages/ferric/src/init.ts index 122d8c13..614049c6 100644 --- a/packages/ferric/src/generate.ts +++ b/packages/ferric/src/init.ts @@ -1,8 +1,8 @@ import { Command } from "@commander-js/extra-typings"; -export const generateCommand = new Command("generate") +export const initCommand = new Command("init") .description("Generate the project scaffold") .argument("", "Type the project name") - .action((str, options) => { + .action(() => { }) diff --git a/packages/ferric/src/program.ts b/packages/ferric/src/program.ts index a205aeaf..10c0fbd0 100644 --- a/packages/ferric/src/program.ts +++ b/packages/ferric/src/program.ts @@ -2,10 +2,10 @@ import { Command } from "@commander-js/extra-typings"; import { printBanner } from "./banner.js"; import { buildCommand } from "./build.js"; -import { generateCommand } from "./generate.js"; +import { initCommand } from "./init.js"; export const program = new Command("ferric") .hook("preAction", () => printBanner()) .description("Rust Node-API Modules for React Native") .addCommand(buildCommand) - .addCommand(generateCommand); + .addCommand(initCommand); From 2720b0139767c63ec9d76d68fbdc7222a65d6356 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 18:47:07 -0300 Subject: [PATCH 09/26] add progress --- .../test-app/lib_in_rust}/.gitignore | 0 apps/test-app/lib_in_rust/Cargo.toml | 27 +++++++ apps/test-app/lib_in_rust/build.rs | 3 + apps/test-app/lib_in_rust/package.json | 14 ++++ apps/test-app/lib_in_rust/src/lib.rs | 6 ++ apps/test-app/package.json | 4 +- packages/ferric/package.json | 7 +- packages/ferric/src/build.test.ts | 7 +- packages/ferric/src/init.test.ts | 6 +- packages/ferric/src/init.ts | 75 ++++++++++++++++++- packages/ferric/src/program.ts | 8 +- packages/ferric/src/templates/gitignore | 8 ++ packages/ferric/src/templates/package.json | 3 +- packages/ferric/tsconfig.json | 1 + 14 files changed, 150 insertions(+), 19 deletions(-) rename {packages/ferric/src/templates => apps/test-app/lib_in_rust}/.gitignore (100%) create mode 100644 apps/test-app/lib_in_rust/Cargo.toml create mode 100644 apps/test-app/lib_in_rust/build.rs create mode 100644 apps/test-app/lib_in_rust/package.json create mode 100644 apps/test-app/lib_in_rust/src/lib.rs create mode 100644 packages/ferric/src/templates/gitignore diff --git a/packages/ferric/src/templates/.gitignore b/apps/test-app/lib_in_rust/.gitignore similarity index 100% rename from packages/ferric/src/templates/.gitignore rename to apps/test-app/lib_in_rust/.gitignore diff --git a/apps/test-app/lib_in_rust/Cargo.toml b/apps/test-app/lib_in_rust/Cargo.toml new file mode 100644 index 00000000..cc658495 --- /dev/null +++ b/apps/test-app/lib_in_rust/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "project_name" +version = "1.0.0" +edition = "2021" +license = "MIT" + +[lib] +crate-type = ["cdylib"] + +[dependencies.napi] +version = "3.1" +default-features = false +# see https://nodejs.org/api/n-api.html#node-api-version-matrix +features = ["napi3"] + +[dependencies.napi-derive] +version = "3.1" +features = ["type-def"] + +[build-dependencies] +napi-build = "2" + +[profile.release] +lto = true +codegen-units = 1 +strip = "symbols" +opt-level = "z" diff --git a/apps/test-app/lib_in_rust/build.rs b/apps/test-app/lib_in_rust/build.rs new file mode 100644 index 00000000..bbfc9e4b --- /dev/null +++ b/apps/test-app/lib_in_rust/build.rs @@ -0,0 +1,3 @@ +fn main() { + napi_build::setup(); +} diff --git a/apps/test-app/lib_in_rust/package.json b/apps/test-app/lib_in_rust/package.json new file mode 100644 index 00000000..516e41cc --- /dev/null +++ b/apps/test-app/lib_in_rust/package.json @@ -0,0 +1,14 @@ +{ + "name": "project_name", + "private": true, + "version": "0.1.0", + "main": "dist/project_name.js", + "types": "dist/project_name.d.ts", + "scripts": { + "build": "ferric build", + "build:release": "npm run build -- --configuration release" + }, + "devDependencies": { + "ferric-cli": "latest" + } +} diff --git a/apps/test-app/lib_in_rust/src/lib.rs b/apps/test-app/lib_in_rust/src/lib.rs new file mode 100644 index 00000000..1064d5bf --- /dev/null +++ b/apps/test-app/lib_in_rust/src/lib.rs @@ -0,0 +1,6 @@ +use napi_derive::napi; + +#[napi] +pub fn sum(a: i32, b: i32) -> i32 { + a + b +} diff --git a/apps/test-app/package.json b/apps/test-app/package.json index 017c3cbf..aac1ae56 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -33,13 +33,13 @@ "@types/mocha": "^10.0.10", "@types/react": "^19.0.0", "concurrently": "^9.1.2", - "ferric-cli": "*", + "ferric-cli": "workspace:*", "mocha": "^11.6.0", "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", "react": "19.0.0", "react-native": "0.79.5", - "react-native-node-addon-examples": "*", + "@react-native-node-api/node-addon-examples": "workspace:*", "react-native-node-api": "*", "react-native-test-app": "^4.3.3" } diff --git a/packages/ferric/package.json b/packages/ferric/package.json index 7bc3cb53..9c3e8a58 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -14,7 +14,9 @@ }, "scripts": { "start": "tsx src/run.ts", - "test": "tsx --test --test-reporter=@reporters/github --test-reporter-destination=stdout --test-reporter=spec --test-reporter-destination=stdout src/**/*.test.ts" + "build": "tsc --build --verbose && pnpm copy-templates", + "test": "tsx --test --test-reporter=@reporters/github --test-reporter-destination=stdout --test-reporter=spec --test-reporter-destination=stdout src/**/*.test.ts", + "copy-templates": "copyfiles -u 1 src/templates/**/* dist" }, "dependencies": { "@commander-js/extra-typings": "^13.1.0", @@ -24,5 +26,8 @@ "commander": "^13.1.0", "ora": "^8.2.0", "react-native-node-api": "0.3.2" + }, + "devDependencies": { + "copyfiles": "^2.4.1" } } diff --git a/packages/ferric/src/build.test.ts b/packages/ferric/src/build.test.ts index 73e5b3b0..61111938 100644 --- a/packages/ferric/src/build.test.ts +++ b/packages/ferric/src/build.test.ts @@ -2,7 +2,8 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; describe("build", () => { - it("", () => { - assert.equal(1, 1); - }); + it("", () => { + // Needs init, to generate project and then build + assert.equal(1, 1); + }); }); diff --git a/packages/ferric/src/init.test.ts b/packages/ferric/src/init.test.ts index a35dd8f1..faaaed77 100644 --- a/packages/ferric/src/init.test.ts +++ b/packages/ferric/src/init.test.ts @@ -2,7 +2,7 @@ import assert from "node:assert/strict"; import { describe, it } from "node:test"; describe("init", () => { - it("", () => { - assert.equal(1, 1); - }); + it("", () => { + assert.equal(1, 1); + }); }); diff --git a/packages/ferric/src/init.ts b/packages/ferric/src/init.ts index 614049c6..77664d0d 100644 --- a/packages/ferric/src/init.ts +++ b/packages/ferric/src/init.ts @@ -1,8 +1,75 @@ import { Command } from "@commander-js/extra-typings"; +import fs from "node:fs"; +import fsPromise from "node:fs/promises"; +import path from "node:path"; +import { oraPromise } from "ora"; +import { prettyPath } from "react-native-node-api"; export const initCommand = new Command("init") - .description("Generate the project scaffold") - .argument("", "Type the project name") - .action(() => { + .description("Generate the project scaffold") + .argument("", "Type the project name") + .action(async (str) => { + const projectName = str && str.length > 0 ? str : "ferric_project"; + const generatePath = path.join(process.cwd(), projectName); + await oraPromise( + generateProject({ outputPath: generatePath, projectName }), + { + text: "Generating project", + successText: `Generated project ${prettyPath(generatePath)}`, + failText: (error) => `Failed to generate the project: ${error.message}`, + }, + ); + }); - }) +async function replaceStrInFile( + filePath: string, + oldStr: string, + newStr: string, +) { + const content = await fsPromise.readFile(filePath, "utf8"); + const updatedContent = content.replace(`/${oldStr}/gi`, newStr); + await fsPromise.writeFile(filePath, updatedContent, "utf8"); +} + +function createFolder(path: string) { + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } +} + +async function copyAllTemplateFiles(outputFilePath: string) { + const templateDir = path.join(import.meta.dirname, "templates"); + await fsPromise.cp(templateDir, outputFilePath, { + recursive: true, + }); + await fsPromise.rename( + `${outputFilePath}/lib.rs`, + `${outputFilePath}/src/lib.rs`, + ); + await fsPromise.rename( + `${outputFilePath}/gitignore`, + `${outputFilePath}/.gitignore`, + ); +} + +async function generateProject({ + outputPath, + projectName, +}: { + outputPath: string; + projectName: string; +}) { + createFolder(outputPath); + createFolder(`${outputPath}/src`); + await copyAllTemplateFiles(outputPath); + await replaceStrInFile( + `${outputPath}/package.json`, + "project_name", + projectName, + ); + await replaceStrInFile( + `${outputPath}/Cargo.toml`, + "project_name", + projectName, + ); +} diff --git a/packages/ferric/src/program.ts b/packages/ferric/src/program.ts index 10c0fbd0..0474fde2 100644 --- a/packages/ferric/src/program.ts +++ b/packages/ferric/src/program.ts @@ -5,7 +5,7 @@ import { buildCommand } from "./build.js"; import { initCommand } from "./init.js"; export const program = new Command("ferric") - .hook("preAction", () => printBanner()) - .description("Rust Node-API Modules for React Native") - .addCommand(buildCommand) - .addCommand(initCommand); + .hook("preAction", () => printBanner()) + .description("Rust Node-API Modules for React Native") + .addCommand(buildCommand) + .addCommand(initCommand); diff --git a/packages/ferric/src/templates/gitignore b/packages/ferric/src/templates/gitignore new file mode 100644 index 00000000..24a51298 --- /dev/null +++ b/packages/ferric/src/templates/gitignore @@ -0,0 +1,8 @@ +target +Cargo.lock + +*.xcframework/ +*.apple.node/ +*.android.node/ + +dist diff --git a/packages/ferric/src/templates/package.json b/packages/ferric/src/templates/package.json index 16ea6965..516e41cc 100644 --- a/packages/ferric/src/templates/package.json +++ b/packages/ferric/src/templates/package.json @@ -5,11 +5,10 @@ "main": "dist/project_name.js", "types": "dist/project_name.d.ts", "scripts": { - "gen:proj": "ferric init", "build": "ferric build", "build:release": "npm run build -- --configuration release" }, "devDependencies": { "ferric-cli": "latest" } -} \ No newline at end of file +} diff --git a/packages/ferric/tsconfig.json b/packages/ferric/tsconfig.json index a678ba53..02cf7169 100644 --- a/packages/ferric/tsconfig.json +++ b/packages/ferric/tsconfig.json @@ -5,6 +5,7 @@ "declarationMap": true, "outDir": "dist", "rootDir": "src", + "esModuleInterop": true, "types": ["node"] }, "include": ["src/**/*.ts"], From 1ac1df29c0694d6a6bdf576d93d1a5e73321cc5c Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 18:59:40 -0300 Subject: [PATCH 10/26] fixed replacing --- apps/test-app/lib_in_rust/Cargo.toml | 2 +- apps/test-app/lib_in_rust/package.json | 6 +- packages/ferric/README.md | 18 +++++ packages/ferric/package.json | 2 +- packages/ferric/src/init.ts | 104 ++++++++++++------------- 5 files changed, 75 insertions(+), 57 deletions(-) diff --git a/apps/test-app/lib_in_rust/Cargo.toml b/apps/test-app/lib_in_rust/Cargo.toml index cc658495..a743d2d6 100644 --- a/apps/test-app/lib_in_rust/Cargo.toml +++ b/apps/test-app/lib_in_rust/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "project_name" +name = "lib_in_rust" version = "1.0.0" edition = "2021" license = "MIT" diff --git a/apps/test-app/lib_in_rust/package.json b/apps/test-app/lib_in_rust/package.json index 516e41cc..bcf6bc14 100644 --- a/apps/test-app/lib_in_rust/package.json +++ b/apps/test-app/lib_in_rust/package.json @@ -1,9 +1,9 @@ { - "name": "project_name", + "name": "lib_in_rust", "private": true, "version": "0.1.0", - "main": "dist/project_name.js", - "types": "dist/project_name.d.ts", + "main": "dist/lib_in_rust.js", + "types": "dist/lib_in_rust.d.ts", "scripts": { "build": "ferric build", "build:release": "npm run build -- --configuration release" diff --git a/packages/ferric/README.md b/packages/ferric/README.md index c61bdb9a..912ec790 100644 --- a/packages/ferric/README.md +++ b/packages/ferric/README.md @@ -1,3 +1,21 @@ # `ferric` A wrapper around Cargo making it easier to produce prebuilt binaries targeting iOS and Android matching the [the prebuilt binary specification](https://github.com/callstackincubator/react-native-node-api/blob/main/docs/PREBUILDS.md) as well as [napi.rs](https://napi.rs/) to generate bindings from annotated Rust code. + +### Project Structure + +After generating the project, a folder would be created with the following file structure for the lib. + +```markdown +lib_name +│ Cargo.toml +│ build.rs +│ .gitignore +└───src +│ │ lib.rs +└───dist (after build) +│ │ index.js +│ │ index.d.ts +│ │ native_android_folder +│ │ native_ios_folder +``` diff --git a/packages/ferric/package.json b/packages/ferric/package.json index 9c3e8a58..426adf60 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -14,7 +14,7 @@ }, "scripts": { "start": "tsx src/run.ts", - "build": "tsc --build --verbose && pnpm copy-templates", + "build": "tsc --build && pnpm copy-templates", "test": "tsx --test --test-reporter=@reporters/github --test-reporter-destination=stdout --test-reporter=spec --test-reporter-destination=stdout src/**/*.test.ts", "copy-templates": "copyfiles -u 1 src/templates/**/* dist" }, diff --git a/packages/ferric/src/init.ts b/packages/ferric/src/init.ts index 77664d0d..9856abba 100644 --- a/packages/ferric/src/init.ts +++ b/packages/ferric/src/init.ts @@ -6,70 +6,70 @@ import { oraPromise } from "ora"; import { prettyPath } from "react-native-node-api"; export const initCommand = new Command("init") - .description("Generate the project scaffold") - .argument("", "Type the project name") - .action(async (str) => { - const projectName = str && str.length > 0 ? str : "ferric_project"; - const generatePath = path.join(process.cwd(), projectName); - await oraPromise( - generateProject({ outputPath: generatePath, projectName }), - { - text: "Generating project", - successText: `Generated project ${prettyPath(generatePath)}`, - failText: (error) => `Failed to generate the project: ${error.message}`, - }, - ); - }); + .description("Generate the project scaffold") + .argument("", "Type the project name") + .action(async (str) => { + const projectName = str && str.length > 0 ? str : "ferric_project"; + const generatePath = path.join(process.cwd(), projectName); + await oraPromise( + generateProject({ outputPath: generatePath, projectName }), + { + text: "Generating project", + successText: `Generated project ${prettyPath(generatePath)}`, + failText: (error) => `Failed to generate the project: ${error.message}`, + }, + ); + }); async function replaceStrInFile( - filePath: string, - oldStr: string, - newStr: string, + filePath: string, + oldStr: string, + newStr: string, ) { - const content = await fsPromise.readFile(filePath, "utf8"); - const updatedContent = content.replace(`/${oldStr}/gi`, newStr); - await fsPromise.writeFile(filePath, updatedContent, "utf8"); + const content = await fsPromise.readFile(filePath, "utf8"); + const updatedContent = content.replaceAll(oldStr, newStr); + await fsPromise.writeFile(filePath, updatedContent, "utf8"); } function createFolder(path: string) { - if (!fs.existsSync(path)) { - fs.mkdirSync(path); - } + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } } async function copyAllTemplateFiles(outputFilePath: string) { - const templateDir = path.join(import.meta.dirname, "templates"); - await fsPromise.cp(templateDir, outputFilePath, { - recursive: true, - }); - await fsPromise.rename( - `${outputFilePath}/lib.rs`, - `${outputFilePath}/src/lib.rs`, - ); - await fsPromise.rename( - `${outputFilePath}/gitignore`, - `${outputFilePath}/.gitignore`, - ); + const templateDir = path.join(import.meta.dirname, "templates"); + await fsPromise.cp(templateDir, outputFilePath, { + recursive: true, + }); + await fsPromise.rename( + `${outputFilePath}/lib.rs`, + `${outputFilePath}/src/lib.rs`, + ); + await fsPromise.rename( + `${outputFilePath}/gitignore`, + `${outputFilePath}/.gitignore`, + ); } async function generateProject({ - outputPath, - projectName, + outputPath, + projectName, }: { - outputPath: string; - projectName: string; + outputPath: string; + projectName: string; }) { - createFolder(outputPath); - createFolder(`${outputPath}/src`); - await copyAllTemplateFiles(outputPath); - await replaceStrInFile( - `${outputPath}/package.json`, - "project_name", - projectName, - ); - await replaceStrInFile( - `${outputPath}/Cargo.toml`, - "project_name", - projectName, - ); + createFolder(outputPath); + createFolder(`${outputPath}/src`); + await copyAllTemplateFiles(outputPath); + await replaceStrInFile( + `${outputPath}/package.json`, + "project_name", + projectName, + ); + await replaceStrInFile( + `${outputPath}/Cargo.toml`, + "project_name", + projectName, + ); } From 789e2b8a14aff9710650dcb744adbe6664d77cdd Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:01:26 -0300 Subject: [PATCH 11/26] removed test files --- packages/ferric/src/build.test.ts | 9 --------- packages/ferric/src/init.test.ts | 8 -------- 2 files changed, 17 deletions(-) delete mode 100644 packages/ferric/src/build.test.ts delete mode 100644 packages/ferric/src/init.test.ts diff --git a/packages/ferric/src/build.test.ts b/packages/ferric/src/build.test.ts deleted file mode 100644 index 61111938..00000000 --- a/packages/ferric/src/build.test.ts +++ /dev/null @@ -1,9 +0,0 @@ -import assert from "node:assert/strict"; -import { describe, it } from "node:test"; - -describe("build", () => { - it("", () => { - // Needs init, to generate project and then build - assert.equal(1, 1); - }); -}); diff --git a/packages/ferric/src/init.test.ts b/packages/ferric/src/init.test.ts deleted file mode 100644 index faaaed77..00000000 --- a/packages/ferric/src/init.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import assert from "node:assert/strict"; -import { describe, it } from "node:test"; - -describe("init", () => { - it("", () => { - assert.equal(1, 1); - }); -}); From 30d0fe90f3ef7b165855434317d6dba60ae09c65 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:02:55 -0300 Subject: [PATCH 12/26] removed pnpm workspace stuff --- apps/test-app/package.json | 4 ++-- packages/cmake-rn/package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/test-app/package.json b/apps/test-app/package.json index aac1ae56..471a6f20 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -33,13 +33,13 @@ "@types/mocha": "^10.0.10", "@types/react": "^19.0.0", "concurrently": "^9.1.2", - "ferric-cli": "workspace:*", + "ferric-cli": "*", "mocha": "^11.6.0", "mocha-remote-cli": "^1.13.2", "mocha-remote-react-native": "^1.13.2", "react": "19.0.0", "react-native": "0.79.5", - "@react-native-node-api/node-addon-examples": "workspace:*", + "@react-native-node-api/node-addon-examples": "*", "react-native-node-api": "*", "react-native-test-app": "^4.3.3" } diff --git a/packages/cmake-rn/package.json b/packages/cmake-rn/package.json index 4f56012f..b272bddf 100644 --- a/packages/cmake-rn/package.json +++ b/packages/cmake-rn/package.json @@ -28,7 +28,7 @@ "cmake-js": "^7.3.1", "commander": "^13.1.0", "ora": "^8.2.0", - "react-native-node-api": "0.3.2" + "react-native-node-api": "*" }, "peerDependencies": { "node-addon-api": "^8.3.1", From cf4b994d52b2bacdfaf0cdaac24ebd226c839f68 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:06:11 -0300 Subject: [PATCH 13/26] updated package lock --- package-lock.json | 202 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 193 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3871df87..c0f0cc61 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,6 +43,7 @@ "@react-native-community/cli": "^18.0.0", "@react-native-community/cli-platform-android": "^18.0.0", "@react-native-community/cli-platform-ios": "^18.0.0", + "@react-native-node-api/node-addon-examples": "*", "@react-native/babel-preset": "0.79.0", "@react-native/metro-config": "0.79.0", "@react-native/typescript-config": "0.79.0", @@ -56,7 +57,6 @@ "mocha-remote-react-native": "^1.13.2", "react": "19.0.0", "react-native": "0.79.5", - "react-native-node-addon-examples": "*", "react-native-node-api": "*", "react-native-test-app": "^4.3.3" } @@ -6341,9 +6341,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", "dev": true, "license": "MIT" }, @@ -7897,6 +7897,67 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, + "node_modules/copyfiles": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz", + "integrity": "sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^7.0.5", + "minimatch": "^3.0.3", + "mkdirp": "^1.0.4", + "noms": "0.0.0", + "through2": "^2.0.1", + "untildify": "^4.0.0", + "yargs": "^16.1.0" + }, + "bin": { + "copyfiles": "copyfiles", + "copyup": "copyfiles" + } + }, + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/core-js-compat": { "version": "3.41.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.41.0.tgz", @@ -7910,6 +7971,13 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, "node_modules/cosmiconfig": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", @@ -9827,6 +9895,13 @@ "node": ">=8" } }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true, + "license": "MIT" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -11294,6 +11369,37 @@ "url": "https://github.com/sponsors/antelle" } }, + "node_modules/noms": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz", + "integrity": "sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==", + "dev": true, + "license": "ISC", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "~1.0.31" + } + }, + "node_modules/noms/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/noms/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true, + "license": "MIT" + }, "node_modules/normalize-package-data": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", @@ -11861,6 +11967,13 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", @@ -12122,10 +12235,6 @@ } } }, - "node_modules/react-native-node-addon-examples": { - "resolved": "packages/node-addon-examples", - "link": true - }, "node_modules/react-native-node-api": { "resolved": "packages/host", "link": true @@ -13207,6 +13316,57 @@ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -13489,6 +13649,16 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", @@ -13761,6 +13931,16 @@ "async-limiter": "~1.0.0" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -13897,7 +14077,7 @@ "cmake-js": "^7.3.1", "commander": "^13.1.0", "ora": "^8.2.0", - "react-native-node-api": "0.3.2" + "react-native-node-api": "*" }, "bin": { "cmake-rn": "bin/cmake-rn.js" @@ -14134,6 +14314,9 @@ }, "bin": { "ferric": "bin/ferric.js" + }, + "devDependencies": { + "copyfiles": "^2.4.1" } }, "packages/ferric-example": { @@ -14405,6 +14588,7 @@ "devDependencies": { "@babel/core": "^7.26.10", "@babel/types": "^7.27.0", + "@types/babel__core": "^7.20.5", "fswin": "^3.24.829", "metro-config": "0.81.1", "node-api-headers": "^1.5.0", From 9aedc4419c34f7c2c78ee6203c6123df394c9021 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:07:29 -0300 Subject: [PATCH 14/26] added changeset --- .changeset/many-pens-join.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .changeset/many-pens-join.md diff --git a/.changeset/many-pens-join.md b/.changeset/many-pens-join.md new file mode 100644 index 00000000..1aa8aa8e --- /dev/null +++ b/.changeset/many-pens-join.md @@ -0,0 +1,8 @@ +--- +"ferric-cli": minor +"@react-native-node-api/test-app": minor +--- + +- Created `init` command to generate / scaffold the project. +- Replacing `ferric-example` with `app-test`, scaffolding the project there. +- Added `Cargo.toml` optimizations for size. From 344a87593669acd110ce5e643ae04a0c9715a6de Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:11:24 -0300 Subject: [PATCH 15/26] add changes --- .github/workflows/check.yml | 4 ++-- apps/test-app/App.tsx | 11 ----------- eslint.config.js | 1 - package.json | 3 +-- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c84b9b62..8096e948 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -133,9 +133,9 @@ jobs: - name: Build weak-node-api for all architectures run: npm run build-weak-node-api -- --android working-directory: packages/host - - name: Build ferric-example for all architectures + - name: Build lib_in_rust for android architectures run: npm run build -- --android - working-directory: packages/ferric-example + working-directory: packages/apps/test-app/lib_in_rust - name: Run tests (Android) timeout-minutes: 75 uses: reactivecircus/android-emulator-runner@v2 diff --git a/apps/test-app/App.tsx b/apps/test-app/App.tsx index 3fa20d0e..d4007fe0 100644 --- a/apps/test-app/App.tsx +++ b/apps/test-app/App.tsx @@ -45,17 +45,6 @@ function loadTests({ }); } }); - - describeIf(ferricExample, "ferric-example", () => { - it("exports a callable sum function", () => { - /* eslint-disable-next-line @typescript-eslint/no-require-imports -- TODO: Determine why a dynamic import doesn't work on Android */ - const exampleAddon = require("ferric-example"); - const result = exampleAddon.sum(1, 3); - if (result !== 4) { - throw new Error(`Expected 1 + 3 to equal 4, but got ${result}`); - } - }); - }); } export default function App() { diff --git a/eslint.config.js b/eslint.config.js index 9b1b463e..4d36c0a3 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -12,7 +12,6 @@ export default tseslint.config( "apps/test-app/ios/**", "packages/host/hermes/**", "packages/node-addon-examples/examples/**", - "packages/ferric-example/ferric_example.d.ts", ]), eslint.configs.recommended, tseslint.configs.recommended, diff --git a/package.json b/package.json index c7ff7c2f..f7fa7c2f 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,7 @@ "packages/cmake-rn", "packages/ferric", "packages/host", - "packages/node-addon-examples", - "packages/ferric-example" + "packages/node-addon-examples" ], "homepage": "https://github.com/callstackincubator/react-native-node-api#readme", "scripts": { From 5f3f5139bab459a6fcd5bed6eb06ef1b0af3fa84 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:11:55 -0300 Subject: [PATCH 16/26] updated check --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 8096e948..3682d281 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -135,7 +135,7 @@ jobs: working-directory: packages/host - name: Build lib_in_rust for android architectures run: npm run build -- --android - working-directory: packages/apps/test-app/lib_in_rust + working-directory: apps/test-app/lib_in_rust - name: Run tests (Android) timeout-minutes: 75 uses: reactivecircus/android-emulator-runner@v2 From 2b5471aa121f54bea31d74e0b094ff9bb4c2df39 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:13:50 -0300 Subject: [PATCH 17/26] removed unused var --- apps/test-app/App.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/test-app/App.tsx b/apps/test-app/App.tsx index d4007fe0..6eff3f90 100644 --- a/apps/test-app/App.tsx +++ b/apps/test-app/App.tsx @@ -21,13 +21,11 @@ function describeIf( type Context = { allTests?: boolean; nodeAddonExamples?: boolean; - ferricExample?: boolean; }; function loadTests({ allTests = false, nodeAddonExamples = allTests, - ferricExample = allTests, }: Context) { describeIf(nodeAddonExamples, "Node Addon Examples", () => { for (const [suiteName, examples] of Object.entries( From 21a91f6cb7f5468fb84f5966e8935f3657afe301 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 19:16:02 -0300 Subject: [PATCH 18/26] format and updated readme --- packages/ferric/README.md | 14 +++++ packages/ferric/src/init.ts | 104 ++++++++++++++++++------------------ 2 files changed, 66 insertions(+), 52 deletions(-) diff --git a/packages/ferric/README.md b/packages/ferric/README.md index 912ec790..b87e0a24 100644 --- a/packages/ferric/README.md +++ b/packages/ferric/README.md @@ -2,6 +2,20 @@ A wrapper around Cargo making it easier to produce prebuilt binaries targeting iOS and Android matching the [the prebuilt binary specification](https://github.com/callstackincubator/react-native-node-api/blob/main/docs/PREBUILDS.md) as well as [napi.rs](https://napi.rs/) to generate bindings from annotated Rust code. +## Install the project + +`npm install --save-dev ferric-cli` + +## Add scripts + +```json +"scripts": { + "gen:rs": "ferric init lib_name", + "build": "ferric build --cwd lib_name", + "build:release": "npm run build -- --configuration release", +}, +``` + ### Project Structure After generating the project, a folder would be created with the following file structure for the lib. diff --git a/packages/ferric/src/init.ts b/packages/ferric/src/init.ts index 9856abba..e4cec744 100644 --- a/packages/ferric/src/init.ts +++ b/packages/ferric/src/init.ts @@ -6,70 +6,70 @@ import { oraPromise } from "ora"; import { prettyPath } from "react-native-node-api"; export const initCommand = new Command("init") - .description("Generate the project scaffold") - .argument("", "Type the project name") - .action(async (str) => { - const projectName = str && str.length > 0 ? str : "ferric_project"; - const generatePath = path.join(process.cwd(), projectName); - await oraPromise( - generateProject({ outputPath: generatePath, projectName }), - { - text: "Generating project", - successText: `Generated project ${prettyPath(generatePath)}`, - failText: (error) => `Failed to generate the project: ${error.message}`, - }, - ); - }); + .description("Generate the project scaffold") + .argument("", "Type the project name") + .action(async (str) => { + const projectName = str && str.length > 0 ? str : "ferric_project"; + const generatePath = path.join(process.cwd(), projectName); + await oraPromise( + generateProject({ outputPath: generatePath, projectName }), + { + text: "Generating project", + successText: `Generated project ${prettyPath(generatePath)}`, + failText: (error) => `Failed to generate the project: ${error.message}`, + }, + ); + }); async function replaceStrInFile( - filePath: string, - oldStr: string, - newStr: string, + filePath: string, + oldStr: string, + newStr: string, ) { - const content = await fsPromise.readFile(filePath, "utf8"); - const updatedContent = content.replaceAll(oldStr, newStr); - await fsPromise.writeFile(filePath, updatedContent, "utf8"); + const content = await fsPromise.readFile(filePath, "utf8"); + const updatedContent = content.replaceAll(oldStr, newStr); + await fsPromise.writeFile(filePath, updatedContent, "utf8"); } function createFolder(path: string) { - if (!fs.existsSync(path)) { - fs.mkdirSync(path); - } + if (!fs.existsSync(path)) { + fs.mkdirSync(path); + } } async function copyAllTemplateFiles(outputFilePath: string) { - const templateDir = path.join(import.meta.dirname, "templates"); - await fsPromise.cp(templateDir, outputFilePath, { - recursive: true, - }); - await fsPromise.rename( - `${outputFilePath}/lib.rs`, - `${outputFilePath}/src/lib.rs`, - ); - await fsPromise.rename( - `${outputFilePath}/gitignore`, - `${outputFilePath}/.gitignore`, - ); + const templateDir = path.join(import.meta.dirname, "templates"); + await fsPromise.cp(templateDir, outputFilePath, { + recursive: true, + }); + await fsPromise.rename( + `${outputFilePath}/lib.rs`, + `${outputFilePath}/src/lib.rs`, + ); + await fsPromise.rename( + `${outputFilePath}/gitignore`, + `${outputFilePath}/.gitignore`, + ); } async function generateProject({ - outputPath, - projectName, + outputPath, + projectName, }: { - outputPath: string; - projectName: string; + outputPath: string; + projectName: string; }) { - createFolder(outputPath); - createFolder(`${outputPath}/src`); - await copyAllTemplateFiles(outputPath); - await replaceStrInFile( - `${outputPath}/package.json`, - "project_name", - projectName, - ); - await replaceStrInFile( - `${outputPath}/Cargo.toml`, - "project_name", - projectName, - ); + createFolder(outputPath); + createFolder(`${outputPath}/src`); + await copyAllTemplateFiles(outputPath); + await replaceStrInFile( + `${outputPath}/package.json`, + "project_name", + projectName, + ); + await replaceStrInFile( + `${outputPath}/Cargo.toml`, + "project_name", + projectName, + ); } From 2f074fa7601a7b3887bf0d4da883c8a10267bdab Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 26 Jul 2025 21:20:43 -0300 Subject: [PATCH 19/26] updated readme --- packages/ferric/README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/ferric/README.md b/packages/ferric/README.md index b87e0a24..1a6e7518 100644 --- a/packages/ferric/README.md +++ b/packages/ferric/README.md @@ -12,8 +12,8 @@ A wrapper around Cargo making it easier to produce prebuilt binaries targeting i "scripts": { "gen:rs": "ferric init lib_name", "build": "ferric build --cwd lib_name", - "build:release": "npm run build -- --configuration release", -}, + "build:release": "npm run build -- --configuration release" +} ``` ### Project Structure @@ -33,3 +33,5 @@ lib_name │ │ native_android_folder │ │ native_ios_folder ``` + +> Example project seen in `apps/test-app/lib_in_rust`. From be9202a20ada6fa81c44b8f1740b8254b0a92ced Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sun, 27 Jul 2025 15:41:03 -0300 Subject: [PATCH 20/26] some refactoring --- packages/ferric/src/init.ts | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/packages/ferric/src/init.ts b/packages/ferric/src/init.ts index e4cec744..c0420538 100644 --- a/packages/ferric/src/init.ts +++ b/packages/ferric/src/init.ts @@ -42,14 +42,12 @@ async function copyAllTemplateFiles(outputFilePath: string) { await fsPromise.cp(templateDir, outputFilePath, { recursive: true, }); - await fsPromise.rename( - `${outputFilePath}/lib.rs`, - `${outputFilePath}/src/lib.rs`, - ); - await fsPromise.rename( - `${outputFilePath}/gitignore`, - `${outputFilePath}/.gitignore`, - ); + await moveFile(`${outputFilePath}/lib.rs`, `${outputFilePath}/src/lib.rs`); + await moveFile(`${outputFilePath}/gitignore`, `${outputFilePath}/.gitignore`); +} + +async function moveFile(currentPath: string, newPath: string) { + await fsPromise.rename(currentPath, newPath); } async function generateProject({ @@ -62,14 +60,11 @@ async function generateProject({ createFolder(outputPath); createFolder(`${outputPath}/src`); await copyAllTemplateFiles(outputPath); + const strToReplace = "project_name"; await replaceStrInFile( `${outputPath}/package.json`, - "project_name", - projectName, - ); - await replaceStrInFile( - `${outputPath}/Cargo.toml`, - "project_name", + strToReplace, projectName, ); + await replaceStrInFile(`${outputPath}/Cargo.toml`, strToReplace, projectName); } From efab2cb33c34fe8a7633337d402916f5dd2cac69 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sun, 27 Jul 2025 21:07:23 -0300 Subject: [PATCH 21/26] changed pnpm command --- packages/ferric/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ferric/package.json b/packages/ferric/package.json index 426adf60..25d1834a 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -14,7 +14,7 @@ }, "scripts": { "start": "tsx src/run.ts", - "build": "tsc --build && pnpm copy-templates", + "build": "tsc --build && npm run copy-templates", "test": "tsx --test --test-reporter=@reporters/github --test-reporter-destination=stdout --test-reporter=spec --test-reporter-destination=stdout src/**/*.test.ts", "copy-templates": "copyfiles -u 1 src/templates/**/* dist" }, From b9b5565ed3b88ec0bd44680146e04be66dacebed Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sun, 3 Aug 2025 16:47:32 -0300 Subject: [PATCH 22/26] improved readme --- packages/ferric/README.md | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/ferric/README.md b/packages/ferric/README.md index 1a6e7518..9e251089 100644 --- a/packages/ferric/README.md +++ b/packages/ferric/README.md @@ -4,7 +4,32 @@ A wrapper around Cargo making it easier to produce prebuilt binaries targeting i ## Install the project -`npm install --save-dev ferric-cli` +
+ npm + + ``` + npm install --save-dev ferric-cli + ``` + +
+ +
+ pnpm + + ``` + pnpm install -D ferric-cli + ``` + +
+ +
+ yarn + + ``` + yarn add -D ferric-cli + ``` + +
## Add scripts From 82a991a5d6c6c36d55afdf88a701d9be897f80b9 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sun, 3 Aug 2025 16:54:24 -0300 Subject: [PATCH 23/26] fix readme format --- packages/ferric/README.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/ferric/README.md b/packages/ferric/README.md index 9e251089..6bde1021 100644 --- a/packages/ferric/README.md +++ b/packages/ferric/README.md @@ -7,27 +7,27 @@ A wrapper around Cargo making it easier to produce prebuilt binaries targeting i
npm - ``` - npm install --save-dev ferric-cli - ``` +``` + npm install --save-dev ferric-cli +```
pnpm - ``` - pnpm install -D ferric-cli - ``` +``` + pnpm install -D ferric-cli +```
yarn - ``` - yarn add -D ferric-cli - ``` +``` + yarn add -D ferric-cli +```
From 759d9e2c754be6f36b31143e8c2dc9d5729d3478 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 8 Aug 2025 11:56:11 -0300 Subject: [PATCH 24/26] updated some package versions --- packages/ferric/package.json | 2 +- packages/ferric/src/templates/Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ferric/package.json b/packages/ferric/package.json index 25d1834a..c0803a69 100644 --- a/packages/ferric/package.json +++ b/packages/ferric/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@commander-js/extra-typings": "^13.1.0", - "@napi-rs/cli": "~3.0.3", + "@napi-rs/cli": "^3.1", "bufout": "^0.3.2", "chalk": "^5.4.1", "commander": "^13.1.0", diff --git a/packages/ferric/src/templates/Cargo.toml b/packages/ferric/src/templates/Cargo.toml index cc658495..06d60062 100644 --- a/packages/ferric/src/templates/Cargo.toml +++ b/packages/ferric/src/templates/Cargo.toml @@ -8,13 +8,13 @@ license = "MIT" crate-type = ["cdylib"] [dependencies.napi] -version = "3.1" +version = "3" default-features = false # see https://nodejs.org/api/n-api.html#node-api-version-matrix features = ["napi3"] [dependencies.napi-derive] -version = "3.1" +version = "3" features = ["type-def"] [build-dependencies] From 87d7ee63db53d18e0fd2b7f181e16a46fe276058 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Fri, 8 Aug 2025 11:59:46 -0300 Subject: [PATCH 25/26] updated package lock --- package-lock.json | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index ff3925ee..3ddcafac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,8 +13,7 @@ "packages/ferric", "packages/host", "packages/node-addon-examples", - "packages/node-tests", - "packages/ferric-example" + "packages/node-tests" ], "devDependencies": { "@changesets/cli": "^2.29.5", @@ -30,7 +29,7 @@ "prettier": "^3.6.2", "react-native": "0.79.5", "tsx": "^4.20.3", - "typescript": "^5.8", + "typescript": "^5.8.0", "typescript-eslint": "^8.38.0" } }, @@ -4077,9 +4076,9 @@ } }, "node_modules/@napi-rs/cli": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-3.0.3.tgz", - "integrity": "sha512-5PxtOcax9PoOriYWYf8BFNgOzUnsogYUDRM8p2leT2VtG/NTMZCyoRQMzSMB0qEaw+Durkefc5jXCpEF6wrWbA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-3.1.1.tgz", + "integrity": "sha512-fwg/YgV0caxXwZjgq+jOadmb0R5apmlQ9XkU4r1StmgHs+1CXsiGJshVetOnbBMpJ7wdvFGfbFKkXGgTPBMMDg==", "license": "MIT", "dependencies": { "@inquirer/prompts": "^7.4.0", @@ -4094,8 +4093,7 @@ "js-yaml": "^4.1.0", "lodash-es": "^4.17.21", "semver": "^7.7.1", - "typanion": "^3.14.0", - "wasm-sjlj": "^1.0.6" + "typanion": "^3.14.0" }, "bin": { "napi": "dist/cli.js", @@ -14220,12 +14218,6 @@ "makeerror": "1.0.12" } }, - "node_modules/wasm-sjlj": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/wasm-sjlj/-/wasm-sjlj-1.0.6.tgz", - "integrity": "sha512-pjaKtLJejlWm6+okPV2X1A6nIsRDD4qeK97eCh8DP8KXi3Nzn/HY01vpHhZHlhDri12eZqipjm8HhdTVw+ATxw==", - "license": "MIT" - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -14745,7 +14737,7 @@ "version": "0.2.3", "dependencies": { "@commander-js/extra-typings": "^13.1.0", - "@napi-rs/cli": "~3.0.3", + "@napi-rs/cli": "^3.1", "bufout": "^0.3.2", "chalk": "^5.4.1", "commander": "^13.1.0", @@ -15028,7 +15020,6 @@ "devDependencies": { "@babel/core": "^7.26.10", "@babel/types": "^7.27.0", - "@types/babel__core": "^7.20.5", "fswin": "^3.24.829", "metro-config": "0.81.1", "node-api-headers": "^1.5.0", From a7107cd5efcc4518e69d1a83379ef4da10b1edb3 Mon Sep 17 00:00:00 2001 From: Douglas Galdino Date: Sat, 9 Aug 2025 09:59:02 -0300 Subject: [PATCH 26/26] removed some config from files --- .github/workflows/check.yml | 1 - eslint.config.js | 3 --- package-lock.json | 8 -------- 3 files changed, 12 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 92ad550e..a7a53aac 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -41,7 +41,6 @@ jobs: # Bootstrap host package to get weak-node-api and ferric-example to get types # TODO: Solve this by adding an option to ferric to build only types or by committing the types into the repo as a fixture for an "init" command - run: npm run bootstrap --workspace react-native-node-api - - run: npm run bootstrap --workspace @react-native-node-api/ferric-example - run: npm run lint env: DEBUG: eslint:eslint diff --git a/eslint.config.js b/eslint.config.js index c0af837e..33a3bb74 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -13,9 +13,6 @@ export default tseslint.config( "apps/test-app/ios/**", "packages/host/hermes/**", "packages/node-addon-examples/examples/**", - "packages/ferric-example/ferric_example.js", - "packages/ferric-example/ferric_example.d.ts", - "packages/ferric-example/target/**", "packages/node-tests/node/**", "packages/node-tests/tests/**", "packages/node-tests/*.generated.js", diff --git a/package-lock.json b/package-lock.json index 3ddcafac..22d3cfcd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14751,14 +14751,6 @@ "copyfiles": "^2.4.1" } }, - "packages/ferric-example": { - "name": "@react-native-node-api/ferric-example", - "version": "0.1.0", - "extraneous": true, - "devDependencies": { - "ferric-cli": "*" - } - }, "packages/ferric/node_modules/@commander-js/extra-typings": { "version": "13.1.0", "resolved": "https://registry.npmjs.org/@commander-js/extra-typings/-/extra-typings-13.1.0.tgz",