diff --git a/.dagger/.gitignore b/.dagger/.gitignore new file mode 100644 index 0000000..4d803f7 --- /dev/null +++ b/.dagger/.gitignore @@ -0,0 +1,9 @@ +node_modules/ +dist/ +build/ +*.log +.env* +!.env.example +generated/ +.cache/ +out/ diff --git a/.dagger/README.md b/.dagger/README.md new file mode 100644 index 0000000..a5d9232 --- /dev/null +++ b/.dagger/README.md @@ -0,0 +1,104 @@ +# macOS Cross-Compiler Dagger Module + +This Dagger module builds a macOS cross-compiler supporting multiple architectures and compilers. + +## Features + +- **Multi-architecture support**: aarch64 (ARM64) and x86_64 +- **Multiple compilers**: Clang, GCC, Zig +- **Language support**: C, C++, Objective-C, Objective-C++, Fortran, Rust +- **Automated testing**: Validates cross-compiled binaries +- **Container registry**: Automatic image publishing to GitHub Container Registry + +## Usage + +### Prerequisites + +- [Dagger CLI](https://dagger.io/install) +- [Bun runtime](https://bun.sh/docs/installation) + +### Install dependencies + +```bash +bun install +``` + +### Build the cross-compiler + +```bash +dagger call build-image --source=.. +``` + +### Run tests + +```bash +dagger call test --source=.. +``` + +### Run full CI pipeline + +```bash +dagger call ci --source=.. +``` + +### Push to registry (requires credentials) + +```bash +dagger call ci \ + --source=.. \ + --ghcr-username="your-username" \ + --ghcr-password="env://GHCR_PASSWORD" +``` + +### Validate executables (macOS only) + +```bash +dagger call validate --source=.. +``` + +## Configuration + +The module supports the following parameters: + +- `architectures`: Comma-separated list of target architectures (default: "aarch64,x86_64") +- `sdkVersion`: macOS SDK version (default: "15.0") +- `kernelVersion`: Darwin kernel version (default: "24") +- `targetSdkVersion`: Target SDK version for deployment (default: "11.0.0") +- `downloadSdk`: Whether to download SDK or use local copy (default: true) +- `cores`: Number of CPU cores for compilation (default: 16) + +## Architecture + +The build process follows this sequence: + +1. **Base dependencies**: Ubuntu Noble with build tools +2. **Support libraries**: xar, libdispatch, libtapi +3. **SDK preparation**: Download or use local macOS SDK +4. **Cross-compilation tools**: cctools, linker, assembler +5. **Compiler wrappers**: osxcross wrappers for clang and GCC +6. **Zig compiler**: For additional Rust support +7. **GCC compilation**: Full GCC cross-compiler build +8. **Final image**: Combined image with all tools and libraries + +## Output + +The final container image includes: + +- Cross-compilation toolchain for specified architectures +- Clang, GCC, and Zig compilers +- Rust support via zig-cc +- All necessary libraries and SDKs +- Test sample programs + +## Testing + +The module includes comprehensive tests that: + +- Compile sample programs with all supported compilers +- Verify correct target architecture +- Export test artifacts for inspection +- Validate executables on macOS (when available) + +## Integration + +This module integrates with GitHub Actions for continuous integration and automatic image publishing to GitHub Container Registry. diff --git a/.dagger/bun.lock b/.dagger/bun.lock new file mode 100644 index 0000000..aee502a --- /dev/null +++ b/.dagger/bun.lock @@ -0,0 +1,522 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "macos-cross-compiler-dagger", + "dependencies": { + "@dagger.io/dagger": "^0.18.0", + "typescript": "^5.5.4", + }, + "devDependencies": { + "@eslint/js": "^9.30.1", + "@types/node": "^24.0.13", + "eslint": "^9.0.0", + "prettier": "^3.0.0", + "typescript-eslint": "^8.35.1", + }, + }, + }, + "packages": { + "@dagger.io/dagger": ["@dagger.io/dagger@0.18.12", "", { "dependencies": { "@grpc/grpc-js": "^1.13.4", "@lifeomic/axios-fetch": "^3.1.0", "@opentelemetry/api": "^1.9.0", "@opentelemetry/core": "^2.0.1", "@opentelemetry/exporter-trace-otlp-http": "^0.202.0", "@opentelemetry/sdk-metrics": "^2.0.1", "@opentelemetry/sdk-node": "^0.202.0", "@opentelemetry/semantic-conventions": "^1.34.0", "adm-zip": "^0.5.16", "env-paths": "^3.0.0", "execa": "^9.6.0", "graphql": "^16.11.0", "graphql-request": "^7.2.0", "graphql-tag": "^2.12.6", "node-color-log": "^12.0.1", "node-fetch": "^3.3.2", "reflect-metadata": "^0.2.2", "tar": "^7.4.2", "typescript": "^5.8.3" } }, "sha512-agUJsB8P6FidaNjpbY98cVZmiBvNEra52DwdGGJYPnH3pj/1Prjz8Of7lHKtsTJJb9gDbMjuksCJP16xwdNobw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.0", "", {}, "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw=="], + + "@eslint/core": ["@eslint/core@0.15.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.31.0", "", {}, "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="], + + "@graphql-typed-document-node/core": ["@graphql-typed-document-node/core@3.2.0", "", { "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@lifeomic/axios-fetch": ["@lifeomic/axios-fetch@3.1.0", "", { "dependencies": { "@types/node-fetch": "^2.5.10" } }, "sha512-C6ceAnh8W19KuekFsCiK1A+AMBirQFTnoEqMZQ7HE6VXJ18zjGofdXxLU8RTo2gZp/yZK5ufmPwIvRtejj1gxg=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], + + "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.202.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-fTBjMqKCfotFWfLzaKyhjLvyEyq5vDKTTFfBmx21btv3gvy8Lq6N5Dh2OzqeuN4DjtpSvNT1uNVfg08eD2Rfxw=="], + + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@2.0.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-XuY23lSI3d4PEqKA+7SLtAgwqIfc6E/E9eAQWLN1vlpC53ybO3o6jW4BsXo1xvz9lYyyWItfQDDLzezER01mCw=="], + + "@opentelemetry/core": ["@opentelemetry/core@2.0.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-MaZk9SJIDgo1peKevlbhP6+IwIiNPNmswNL4AF0WaQJLbHXjr9SrZMgS12+iqr9ToV4ZVosCcc0f8Rg67LXjxw=="], + + "@opentelemetry/exporter-logs-otlp-grpc": ["@opentelemetry/exporter-logs-otlp-grpc@0.202.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-grpc-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/sdk-logs": "0.202.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Y84L8Yja/A2qjGEzC/To0yrMUXHrtwJzHtZ2za1/ulZplRe5QFsLNyHixIS42ZYUKuNyWMDgOFhnN2Pz5uThtg=="], + + "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.202.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.202.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/sdk-logs": "0.202.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-mJWLkmoG+3r+SsYQC+sbWoy1rjowJhMhFvFULeIPTxSI+EZzKPya0+NZ3+vhhgx2UTybGQlye3FBtCH3o6Rejg=="], + + "@opentelemetry/exporter-logs-otlp-proto": ["@opentelemetry/exporter-logs-otlp-proto@0.202.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.202.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-logs": "0.202.0", "@opentelemetry/sdk-trace-base": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-qYwbmNWPkP7AbzX8o4DRu5bb/a0TWYNcpZc1NEAOhuV7pgBpAUPEClxRWPN94ulIia+PfQjzFGMaRwmLGmNP6g=="], + + "@opentelemetry/exporter-metrics-otlp-grpc": ["@opentelemetry/exporter-metrics-otlp-grpc@0.202.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/exporter-metrics-otlp-http": "0.202.0", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-grpc-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-metrics": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-/dq/rf4KCkTYoP+NyPXTE+5wjvfhAHSqK62vRsJ/IalG61VPQvwaL18yWcavbI+44ImQwtMeZxfIJSox7oQL0w=="], + + "@opentelemetry/exporter-metrics-otlp-http": ["@opentelemetry/exporter-metrics-otlp-http@0.202.0", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-metrics": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-ooYcrf/m9ZuVGpQnER7WRH+JZbDPD389HG7VS/EnvIEF5WpNYEqf+NdmtaAcs51d81QrytTYAubc5bVWi//28w=="], + + "@opentelemetry/exporter-metrics-otlp-proto": ["@opentelemetry/exporter-metrics-otlp-proto@0.202.0", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/exporter-metrics-otlp-http": "0.202.0", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-metrics": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-X0RpPpPjyCAmIq9tySZm0Hk3Ltw8KWsqeNq5I7gS9AR9RzbVHb/l+eiMI1CqSRvW9R47HXcUu/epmEzY8ebFAg=="], + + "@opentelemetry/exporter-prometheus": ["@opentelemetry/exporter-prometheus@0.202.0", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-metrics": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-6RvQqZHAPFiwL1OKRJe4ta6SgJx/g8or41B+OovVVEie3HeCDhDGL9S1VJNkBozUz6wTY8a47fQwdMrCOUdMhQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc": ["@opentelemetry/exporter-trace-otlp-grpc@0.202.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-grpc-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-d5wLdbNA3ahpSeD0I34vbDFMTh4vPsXemH0bKDXLeCVULCAjOJXuZmEiuRammiDgVvvX7CAb/IGLDz8d2QHvoA=="], + + "@opentelemetry/exporter-trace-otlp-http": ["@opentelemetry/exporter-trace-otlp-http@0.202.0", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-/hKE8DaFCJuaQqE1IxpgkcjOolUIwgi3TgHElPVKGdGRBSmJMTmN/cr6vWa55pCJIXPyhKvcMrbrya7DZ3VmzA=="], + + "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.202.0", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-z3vzdMclCETGIn8uUBgpz7w651ftCiH2qh3cewhBk+rF0EYPNQ3mJvyxktLnKIBZ/ci0zUknAzzYC7LIIZmggQ=="], + + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-a9eeyHIipfdxzCfc2XPrE+/TI3wmrZUDFtG2RRXHSbZZULAny7SyybSvaDvS77a7iib5MPiAvluwVvbGTsHxsw=="], + + "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.202.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.202.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-Uz3BxZWPgDwgHM2+vCKEQRh0R8WKrd/q6Tus1vThRClhlPO39Dyz7mDrOr6KuqGXAlBQ1e5Tnymzri4RMZNaWA=="], + + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.202.0", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-transformer": "0.202.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-nMEOzel+pUFYuBJg2znGmHJWbmvMbdX5/RhoKNKowguMbURhz0fwik5tUKplLcUtl8wKPL1y9zPnPxeBn65N0Q=="], + + "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.202.0", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/otlp-exporter-base": "0.202.0", "@opentelemetry/otlp-transformer": "0.202.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-yIEHVxFA5dmYif7lZbbB66qulLLhrklj6mI2X3cuGW5hYPyUErztEmbroM+6teu/XobBi9bLHid2VT4NIaRuGg=="], + + "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.202.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.202.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-logs": "0.202.0", "@opentelemetry/sdk-metrics": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-5XO77QFzs9WkexvJQL9ksxL8oVFb/dfi9NWQSq7Sv0Efr9x3N+nb1iklP1TeVgxqJ7m1xWiC/Uv3wupiQGevMw=="], + + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Hc09CaQ8Tf5AGLmf449H726uRoBNGPBL4bjr7AnnUpzWMvhdn61F78z9qb6IqB737TffBsokGAK1XykFEZ1igw=="], + + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-7PMdPBmGVH2eQNb/AtSJizQNgeNTfh6jQFqys6lfhd6P4r+m/nTh3gKPPpaCXVdRQ+z93vfKk+4UGty390283w=="], + + "@opentelemetry/resources": ["@opentelemetry/resources@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-dZOB3R6zvBwDKnHDTB4X1xtMArB/d324VsbiPkX/Yu0Q8T2xceRthoIVFhJdvgVM2QhGVUyX9tzwiNxGtoBJUw=="], + + "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.202.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.202.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-pv8QiQLQzk4X909YKm0lnW4hpuQg4zHwJ4XBd5bZiXcd9urvrJNoNVKnxGHPiDVX/GiLFvr5DMYsDBQbZCypRQ=="], + + "@opentelemetry/sdk-metrics": ["@opentelemetry/sdk-metrics@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.9.0 <1.10.0" } }, "sha512-wf8OaJoSnujMAHWR3g+/hGvNcsC16rf9s1So4JlMiFaFHiE4HpIA3oUh+uWZQ7CNuK8gVW/pQSkgoa5HkkOl0g=="], + + "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.202.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.202.0", "@opentelemetry/core": "2.0.1", "@opentelemetry/exporter-logs-otlp-grpc": "0.202.0", "@opentelemetry/exporter-logs-otlp-http": "0.202.0", "@opentelemetry/exporter-logs-otlp-proto": "0.202.0", "@opentelemetry/exporter-metrics-otlp-grpc": "0.202.0", "@opentelemetry/exporter-metrics-otlp-http": "0.202.0", "@opentelemetry/exporter-metrics-otlp-proto": "0.202.0", "@opentelemetry/exporter-prometheus": "0.202.0", "@opentelemetry/exporter-trace-otlp-grpc": "0.202.0", "@opentelemetry/exporter-trace-otlp-http": "0.202.0", "@opentelemetry/exporter-trace-otlp-proto": "0.202.0", "@opentelemetry/exporter-zipkin": "2.0.1", "@opentelemetry/instrumentation": "0.202.0", "@opentelemetry/propagator-b3": "2.0.1", "@opentelemetry/propagator-jaeger": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/sdk-logs": "0.202.0", "@opentelemetry/sdk-metrics": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1", "@opentelemetry/sdk-trace-node": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-SF9vXWVd9I5CZ69mW3GfwfLI2SHgyvEqntcg0en5y8kRp5+2PPoa3Mkgj0WzFLrbSgTw4PsXn7c7H6eSdrtV0w=="], + + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@2.0.1", "", { "dependencies": { "@opentelemetry/core": "2.0.1", "@opentelemetry/resources": "2.0.1", "@opentelemetry/semantic-conventions": "^1.29.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-xYLlvk/xdScGx1aEqvxLwf6sXQLXCjk3/1SQT9X9AoN5rXRhkdvIFShuNNmtTEPRBqcsMbS4p/gJLNI2wXaDuQ=="], + + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@2.0.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "2.0.1", "@opentelemetry/core": "2.0.1", "@opentelemetry/sdk-trace-base": "2.0.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UhdbPF19pMpBtCWYP5lHbTogLWx9N0EBxtdagvkn5YtsAnCBZzL7SjktG+ZmupRgifsHMjwUaCCaVmqGfSADmA=="], + + "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.36.0", "", {}, "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@sec-ant/readable-stream": ["@sec-ant/readable-stream@0.4.1", "", {}, "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg=="], + + "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@4.0.0", "", {}, "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ=="], + + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/node": ["@types/node@24.0.13", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ=="], + + "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.36.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/type-utils": "8.36.0", "@typescript-eslint/utils": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.36.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.36.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.36.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.36.0", "@typescript-eslint/types": "^8.36.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0" } }, "sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.36.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.36.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.36.0", "@typescript-eslint/utils": "8.36.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.36.0", "", {}, "sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.36.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.36.0", "@typescript-eslint/tsconfig-utils": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/visitor-keys": "8.36.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.36.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.36.0", "@typescript-eslint/types": "8.36.0", "@typescript-eslint/typescript-estree": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.36.0", "", { "dependencies": { "@typescript-eslint/types": "8.36.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "adm-zip": ["adm-zip@0.5.16", "", {}, "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], + + "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "env-paths": ["env-paths@3.0.0", "", {}, "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ=="], + + "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "execa": ["execa@9.6.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], + + "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + + "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "get-stream": ["get-stream@9.0.1", "", { "dependencies": { "@sec-ant/readable-stream": "^0.4.1", "is-stream": "^4.0.1" } }, "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "graphql": ["graphql@16.11.0", "", {}, "sha512-mS1lbMsxgQj6hge1XZ6p7GPhbrtFwUFYi3wRzXAC/FmYnyXMTvvI3td3rjmQ2u8ewXueaSvRPWaEcgVVOT9Jnw=="], + + "graphql-request": ["graphql-request@7.2.0", "", { "dependencies": { "@graphql-typed-document-node/core": "^3.2.0" }, "peerDependencies": { "graphql": "14 - 16" } }, "sha512-0GR7eQHBFYz372u9lxS16cOtEekFlZYB2qOyq8wDvzRmdRSJ0mgUVX1tzNcIzk3G+4NY+mGtSz411wZdeDF/+A=="], + + "graphql-tag": ["graphql-tag@2.12.6", "", { "dependencies": { "tslib": "^2.1.0" }, "peerDependencies": { "graphql": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, "sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "human-signals": ["human-signals@8.0.1", "", {}, "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "import-in-the-middle": ["import-in-the-middle@1.14.2", "", { "dependencies": { "acorn": "^8.14.0", "acorn-import-attributes": "^1.9.5", "cjs-module-lexer": "^1.2.2", "module-details-from-path": "^1.0.3" } }, "sha512-5tCuY9BV8ujfOpwtAGgsTx9CGUapcFMEEyByLv1B+v2+6DhAcw+Zr0nhQT7uwaZ7DiourxFEscghOR8e1aPLQw=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="], + + "is-stream": ["is-stream@4.0.1", "", {}, "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A=="], + + "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], + + "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], + + "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "node-color-log": ["node-color-log@12.0.1", "", {}, "sha512-fhbWy00HXAVucPHoji9KNZRtXHcDKuMoVJ3QA+vaMEcAyK6psmJAf5TF9t2SmkybuHz0jre+jgUDyXcFmpgSNg=="], + + "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], + + "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + + "npm-run-path": ["npm-run-path@6.0.0", "", { "dependencies": { "path-key": "^4.0.0", "unicorn-magic": "^0.3.0" } }, "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + + "pretty-ms": ["pretty-ms@9.2.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg=="], + + "protobufjs": ["protobufjs@7.5.3", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "reflect-metadata": ["reflect-metadata@0.2.2", "", {}, "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], + + "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-final-newline": ["strip-final-newline@4.0.0", "", {}, "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], + + "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typescript": ["typescript@5.8.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typescript-eslint": ["typescript-eslint@8.36.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.36.0", "@typescript-eslint/parser": "8.36.0", "@typescript-eslint/utils": "8.36.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "unicorn-magic": ["unicorn-magic@0.3.0", "", {}, "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "yoctocolors": ["yoctocolors@2.1.1", "", {}, "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + } +} diff --git a/.dagger/dagger.json b/.dagger/dagger.json new file mode 100644 index 0000000..145cd23 --- /dev/null +++ b/.dagger/dagger.json @@ -0,0 +1,4 @@ +{ + "name": "macos-cross-compiler", + "engineVersion": "v0.18.12" +} diff --git a/.dagger/package.json b/.dagger/package.json new file mode 100644 index 0000000..cdee676 --- /dev/null +++ b/.dagger/package.json @@ -0,0 +1,28 @@ +{ + "name": "macos-cross-compiler-dagger", + "type": "module", + "private": true, + "scripts": { + "build": "echo 'Dagger module ready'", + "test": "echo 'No tests configured for Dagger module'", + "type-check": "bun tsc --noEmit", + "lint": "bunx eslint src", + "format": "bunx prettier --check src", + "format:write": "bunx prettier --write src", + "typecheck": "bunx tsc --noEmit" + }, + "dependencies": { + "@dagger.io/dagger": "^0.18.0", + "typescript": "^5.5.4" + }, + "devDependencies": { + "@eslint/js": "^9.30.1", + "@types/node": "^24.0.13", + "eslint": "^9.0.0", + "prettier": "^3.0.0", + "typescript-eslint": "^8.35.1" + }, + "dagger": { + "runtime": "bun" + } +} diff --git a/.dagger/src/index.ts b/.dagger/src/index.ts new file mode 100644 index 0000000..9e5a199 --- /dev/null +++ b/.dagger/src/index.ts @@ -0,0 +1,737 @@ +import { + func, + argument, + Directory, + object, + Secret, + Container, + dag, +} from "@dagger.io/dagger"; + +// Helper function to log with timestamp +function logWithTimestamp(message: string): void { + console.log(`[${new Date().toISOString()}] ${message}`); +} + +// Helper function to measure execution time +async function withTiming( + operation: string, + fn: () => Promise +): Promise { + const start = Date.now(); + logWithTimestamp(`Starting ${operation}...`); + try { + const result = await fn(); + const duration = Date.now() - start; + logWithTimestamp(`โœ… ${operation} completed in ${duration.toString()}ms`); + return result; + } catch (error) { + const duration = Date.now() - start; + logWithTimestamp( + `โŒ ${operation} failed after ${duration.toString()}ms: ${error instanceof Error ? error.message : String(error)}` + ); + throw error; + } +} + +@object() +export class MacosCrossCompiler { + /** + * Build and push the macOS cross-compiler image + * @param source The source directory + * @param architectures Target architectures (comma-separated) + * @param sdkVersion macOS SDK version + * @param kernelVersion Darwin kernel version + * @param targetSdkVersion Target SDK version for deployment + * @param downloadSdk Whether to download SDK or use local copy + * @param cores Number of CPU cores to use for compilation + * @param ghcrUsername GitHub Container Registry username + * @param ghcrPassword GitHub Container Registry password + * @returns Success message + */ + @func() + async ci( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + architectures: string = "aarch64,x86_64", + sdkVersion: string = "15.0", + kernelVersion: string = "24", + targetSdkVersion: string = "11.0.0", + downloadSdk: boolean = true, + cores: number = 16, + ghcrUsername?: string, + ghcrPassword?: Secret + ): Promise { + logWithTimestamp("๐Ÿš€ Starting macOS cross-compiler CI pipeline"); + + const archList = architectures.split(",").map(arch => arch.trim()); + + // Build the cross-compiler image + const image = await withTiming("cross-compiler image build", async () => { + return await this.buildImage( + source, + architectures, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores + ); + }); + + // Run tests + await withTiming("tests", async () => { + await this.test( + source, + architectures, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores + ); + }); + + // Push image if credentials provided + if (ghcrUsername && ghcrPassword) { + await withTiming("image push", async () => { + await this.pushImage(image, sdkVersion, ghcrUsername, ghcrPassword); + }); + } + + return "โœ… macOS cross-compiler CI pipeline completed successfully"; + } + + /** + * Build the macOS cross-compiler image + * @param source The source directory + * @param architectures Target architectures + * @param sdkVersion macOS SDK version + * @param kernelVersion Darwin kernel version + * @param targetSdkVersion Target SDK version + * @param downloadSdk Whether to download SDK + * @param cores Number of CPU cores + * @returns Built container image + */ + @func() + async buildImage( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + architectures: string = "aarch64,x86_64", + sdkVersion: string = "15.0", + kernelVersion: string = "24", + targetSdkVersion: string = "11.0.0", + downloadSdk: boolean = true, + cores: number = 16 + ): Promise { + logWithTimestamp("๐Ÿ—๏ธ Building macOS cross-compiler image"); + + // Start with base Ubuntu container + let container = dag.container() + .from("ubuntu:noble") + .withWorkdir("/workspace"); + + // Install base dependencies + container = await this.installBaseDeps(container); + + // Build components in dependency order + const xar = await this.buildXar(container, targetSdkVersion, cores); + const libdispatch = await this.buildLibdispatch(container, targetSdkVersion, cores); + const libtapi = await this.buildLibtapi(container, targetSdkVersion, cores); + + // Get or download SDK + const sdk = await this.getSdk(container, sdkVersion, downloadSdk); + + // Build Zig compiler + const zig = await this.buildZig(container); + + // Set up SDK in container + container = container + .withDirectory("/osxcross/SDK/MacOSX" + sdkVersion + ".sdk", sdk) + .withExec(["ln", "-s", "/osxcross/SDK/MacOSX" + sdkVersion + ".sdk/", "/sdk"]) + .withExec(["apt", "update"]) + .withExec(["apt", "install", "-y", "clang", "file", "libmpc-dev", "libmpfr-dev", "curl"]) + .withExec(["curl", "--proto", "=https", "--tlsv1.2", "-sSf", "https://sh.rustup.rs", "|", "sh", "-s", "--", "-y"]) + .withEnvVariable("PATH", "/root/.cargo/bin:/usr/local/bin:/gcc/bin:/cctools/bin:/osxcross/bin:$PATH") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withDirectory("/usr/local/bin", zig); + + // Build for each architecture + const archList = architectures.split(",").map(arch => arch.trim()); + + for (const architecture of archList) { + const triple = `${architecture}-apple-darwin${kernelVersion}`; + + // Build cctools for this architecture + const cctools = await this.buildCctools( + container, + architecture, + kernelVersion, + targetSdkVersion, + cores, + xar, + libtapi, + libdispatch + ); + + // Build wrappers + const clangWrappers = await this.buildClangWrappers( + container, + sdkVersion, + kernelVersion, + targetSdkVersion, + cores + ); + + const gccWrappers = await this.buildGccWrappers( + container, + sdkVersion, + kernelVersion, + targetSdkVersion, + cores + ); + + // Build GCC for this architecture + const gcc = await this.buildGcc( + container, + architecture, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores, + clangWrappers, + cctools, + sdk, + xar, + libtapi, + libdispatch + ); + + // Add binaries to final container + container = container + .withDirectory("/cctools", cctools) + .withDirectory("/osxcross", clangWrappers) + .withDirectory("/osxcross", gccWrappers) + .withDirectory("/gcc", gcc) + .withFile("/usr/local/bin/zig-cc-" + architecture + "-macos", source.file("zig/zig-cc-" + architecture + "-macos")) + .withExec(["chmod", "+x", "/usr/local/bin/zig-cc-" + architecture + "-macos"]); + + // Install Rust targets + container = container + .withExec(["rustup", "target", "add", architecture + "-apple-darwin"]); + } + + // Final library setup + container = container + .withDirectory("/usr/local/lib", xar.directory("lib")) + .withDirectory("/usr/local/lib", libtapi.directory("lib")) + .withDirectory("/usr/local/lib", libdispatch.directory("lib")) + .withExec(["ldconfig"]) + .withWorkdir("/workspace"); + + return container; + } + + /** + * Install base dependencies + */ + private async installBaseDeps(container: Container): Promise { + return container + .withExec(["apt", "update", "-y"]) + .withExec(["apt", "install", "-y", "build-essential", "cmake", "clang", "git"]); + } + + /** + * Build xar library + */ + private async buildXar(container: Container, targetSdkVersion: string, cores: number): Promise { + const xarContainer = container + .withExec(["apt", "install", "-y", "libxml2-dev", "libssl-dev", "zlib1g-dev"]) + .withExec(["git", "clone", "--branch", "5fa4675419cfec60ac19a9c7f7c2d0e7c831a497", "https://github.com/tpoechtrager/xar", "/tmp/xar"]) + .withWorkdir("/tmp/xar") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["./configure", "--prefix=/xar"]) + .withExec(["make", "-j" + cores.toString()]) + .withExec(["make", "install"]); + + return xarContainer.directory("/xar"); + } + + /** + * Build libdispatch library + */ + private async buildLibdispatch(container: Container, targetSdkVersion: string, cores: number): Promise { + const version = "fdf3fc85a9557635668c78801d79f10161d83f12"; + const libdispatchContainer = container + .withExec(["git", "clone", "--branch", version, "https://github.com/tpoechtrager/apple-libdispatch", "/tmp/libdispatch-src"]) + .withWorkdir("/tmp/libdispatch-src") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withEnvVariable("TARGETDIR", "/libdispatch") + .withExec(["mkdir", "-p", "build"]) + .withWorkdir("build") + .withExec(["cmake", "..", "-DCMAKE_BUILD_TYPE=RELEASE", "-DCMAKE_INSTALL_PREFIX=/libdispatch"]) + .withExec(["make", "install", "-j" + cores.toString()]); + + return libdispatchContainer.directory("/libdispatch"); + } + + /** + * Build libtapi library + */ + private async buildLibtapi(container: Container, targetSdkVersion: string, cores: number): Promise { + const version = "1300.6.5"; + const libtapiContainer = container + .withExec(["apt", "install", "-y", "python3"]) + .withExec(["git", "clone", "--branch", version, "https://github.com/tpoechtrager/apple-libtapi", "/tmp/libtapi-src"]) + .withWorkdir("/tmp/libtapi-src") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withEnvVariable("INSTALLPREFIX", "/libtapi") + .withExec(["./build.sh"]) + .withExec(["./install.sh"]); + + return libtapiContainer.directory("/libtapi"); + } + + /** + * Build cctools + */ + private async buildCctools( + container: Container, + architecture: string, + kernelVersion: string, + targetSdkVersion: string, + cores: number, + xar: Directory, + libtapi: Directory, + libdispatch: Directory + ): Promise { + // autoconf does not recognize aarch64 -- use arm instead + const triple = architecture === "aarch64" ? + `arm-apple-darwin${kernelVersion}` : + `${architecture}-apple-darwin${kernelVersion}`; + + const cctoolsVersion = "1010.6"; + const linkerVersion = "951.9"; + + const cctoolsContainer = container + .withExec(["apt", "install", "-y", "llvm-dev", "uuid-dev", "rename"]) + .withExec(["git", "clone", "--branch", `${cctoolsVersion}-ld64-${linkerVersion}`, "https://github.com/tpoechtrager/cctools-port", "/tmp/cctools-src"]) + .withWorkdir("/tmp/cctools-src") + .withDirectory("/xar", xar) + .withDirectory("/libtapi", libtapi) + .withDirectory("/libdispatch", libdispatch) + .withWorkdir("/tmp/cctools-src/cctools") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec([ + "./configure", + "--prefix=/cctools", + "--with-libtapi=/libtapi", + "--with-libxar=/xar", + "--with-libdispatch=/libdispatch", + "--with-libblocksruntime=/libdispatch", + "--target=" + triple + ]); + + // Fix aarch64 target naming + if (architecture === "aarch64") { + cctoolsContainer + .withExec(["find", ".", "-name", "Makefile", "-print0", "|", "xargs", "-0", "sed", "-i", `s/arm-apple-darwin${kernelVersion}/arm64-apple-darwin${kernelVersion}/g`]); + } + + const finalContainer = cctoolsContainer + .withExec(["make", "-j" + cores.toString()]) + .withExec(["make", "install"]); + + // Link aarch64 artifacts + if (architecture === "aarch64") { + finalContainer + .withExec(["bash", "-c", "cd /cctools/bin && for file in *arm64*; do ln -s $file ${file/arm64/aarch64}; done"]); + } + + return finalContainer.directory("/cctools"); + } + + /** + * Build wrapper for clang + */ + private async buildClangWrappers( + container: Container, + sdkVersion: string, + kernelVersion: string, + targetSdkVersion: string, + cores: number + ): Promise { + const wrapperContainer = container + .withExec(["git", "clone", "--branch=29fe6dd35522073c9df5800f8cd1feb4b9a993a8", "https://github.com/tpoechtrager/osxcross", "/tmp/osxcross-src"]) + .withWorkdir("/tmp/osxcross-src/wrapper") + .withEnvVariable("VERSION", "1.5") + .withEnvVariable("SDK_VERSION", sdkVersion) + .withEnvVariable("TARGET", "darwin" + kernelVersion) + .withEnvVariable("LINKER_VERSION", "951.9") + .withEnvVariable("X86_64H_SUPPORTED", "0") + .withEnvVariable("I386_SUPPORTED", "0") + .withEnvVariable("ARM_SUPPORTED", "1") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["make", "wrapper", "-j" + cores.toString()]); + + const compilers = ["clang", "clang++"]; + let finalContainer = wrapperContainer; + + for (const compiler of compilers) { + finalContainer = finalContainer + .withEnvVariable("TARGETCOMPILER", compiler) + .withExec(["./build_wrapper.sh"]); + } + + return finalContainer.directory("/tmp/osxcross-src/target"); + } + + /** + * Build wrapper for GCC + */ + private async buildGccWrappers( + container: Container, + sdkVersion: string, + kernelVersion: string, + targetSdkVersion: string, + cores: number + ): Promise { + const wrapperContainer = container + .withExec(["git", "clone", "--branch=29fe6dd35522073c9df5800f8cd1feb4b9a993a8", "https://github.com/tpoechtrager/osxcross", "/tmp/osxcross-gcc-src"]) + .withWorkdir("/tmp/osxcross-gcc-src/wrapper") + .withEnvVariable("VERSION", "1.5") + .withEnvVariable("SDK_VERSION", sdkVersion) + .withEnvVariable("TARGET", "darwin" + kernelVersion) + .withEnvVariable("LINKER_VERSION", "951.9") + .withEnvVariable("X86_64H_SUPPORTED", "0") + .withEnvVariable("I386_SUPPORTED", "0") + .withEnvVariable("ARM_SUPPORTED", "1") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["make", "wrapper", "-j" + cores.toString()]); + + const compilers = ["gcc", "g++", "gfortran"]; + let finalContainer = wrapperContainer; + + for (const compiler of compilers) { + finalContainer = finalContainer + .withEnvVariable("TARGETCOMPILER", compiler) + .withExec(["./build_wrapper.sh"]); + } + + return finalContainer.directory("/tmp/osxcross-gcc-src/target"); + } + + /** + * Get or download SDK + */ + private async getSdk(container: Container, version: string, downloadSdk: boolean): Promise { + if (downloadSdk) { + const sdkContainer = container + .withExec(["apt", "update"]) + .withExec(["apt", "install", "-y", "wget"]) + .withExec(["wget", `https://github.com/joseluisq/macosx-sdks/releases/download/${version}/MacOSX${version}.sdk.tar.xz`]) + .withExec(["tar", "-xf", `MacOSX${version}.sdk.tar.xz`]) + .withExec(["bash", "-c", `mv MacOSX*.sdk MacOSX${version}.sdk || true`]); + + return sdkContainer.directory(`MacOSX${version}.sdk`); + } else { + const sdkContainer = container + .withFile(`MacOSX${version}.sdk.tar.xz`, dag.host().directory("sdks").file(`MacOSX${version}.sdk.tar.xz`)) + .withExec(["tar", "-xf", `MacOSX${version}.sdk.tar.xz`]); + + return sdkContainer.directory(`MacOSX${version}.sdk`); + } + } + + /** + * Build Zig compiler + */ + private async buildZig(container: Container, targetArch: string = "x86_64"): Promise { + const zigVersion = "0.13.0"; + + // Determine the correct Zig archive based on target architecture + let archSuffix: string; + if (targetArch === "aarch64" || targetArch === "arm64") { + archSuffix = "aarch64"; + } else if (targetArch === "x86_64" || targetArch === "amd64") { + archSuffix = "x86_64"; + } else { + throw new Error(`Unsupported architecture: ${targetArch}`); + } + + const zigContainer = container + .withExec(["apt", "install", "-y", "wget", "xz-utils"]) + .withExec(["wget", "-O", "zig.tar.xz", `https://ziglang.org/download/${zigVersion}/zig-linux-${archSuffix}-${zigVersion}.tar.xz`]) + .withExec(["tar", "-xf", "zig.tar.xz"]) + .withExec(["rm", "zig.tar.xz"]) + .withExec(["bash", "-c", "mv zig* zig"]); + + return zigContainer.directory("zig"); + } + + /** + * Build GCC compiler + */ + private async buildGcc( + container: Container, + architecture: string, + sdkVersion: string, + kernelVersion: string, + targetSdkVersion: string, + downloadSdk: boolean, + cores: number, + clangWrappers: Directory, + cctools: Directory, + sdk: Directory, + xar: Directory, + libtapi: Directory, + libdispatch: Directory + ): Promise { + const triple = `${architecture}-apple-darwin${kernelVersion}`; + + const gccContainer = container + .withExec(["apt", "install", "-y", "gcc", "g++", "zlib1g-dev", "libmpc-dev", "libmpfr-dev", "libgmp-dev", "flex", "file"]) + .withExec(["apt-get", "install", "-y", "--force-yes", "llvm-dev", "libxml2-dev", "uuid-dev", "libssl-dev", "bash", "patch", "make", "tar", "xz-utils", "bzip2", "gzip", "sed", "cpio", "libbz2-dev", "zlib1g-dev"]) + .withExec(["git", "clone", "--branch=gcc-14-2-darwin", "https://github.com/iains/gcc-14-branch", "/tmp/gcc-src"]) + .withDirectory("/osxcross", clangWrappers) + .withDirectory("/cctools", cctools) + .withDirectory("/sdk", sdk) + .withDirectory("/sdk/usr", xar) + .withDirectory("/sdk/usr", libtapi) + .withDirectory("/sdk/usr", libdispatch) + .withDirectory("/usr/local/lib", xar.directory("lib")) + .withDirectory("/usr/local/lib", libtapi.directory("lib")) + .withDirectory("/usr/local/lib", libdispatch.directory("lib")) + .withExec(["ldconfig"]) + .withExec(["mkdir", "-p", "/osxcross/SDK"]) + .withExec(["ln", "-s", "/sdk", `/osxcross/SDK/MacOSX${sdkVersion}.sdk`]) + .withEnvVariable("PATH", "$PATH:/osxcross/bin:/cctools/bin") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["mkdir", "-p", "/tmp/gcc-build"]) + .withWorkdir("/tmp/gcc-build") + .withExec([ + "/tmp/gcc-src/configure", + "--target=" + triple, + "--with-sysroot=/sdk", + "--disable-nls", + "--enable-languages=c,c++,fortran,objc,obj-c++", + "--without-headers", + "--enable-lto", + "--enable-checking=release", + "--disable-libstdcxx-pch", + "--prefix=/gcc", + "--with-system-zlib", + "--disable-multilib", + "--with-ld=/cctools/bin/" + triple + "-ld", + "--with-as=/cctools/bin/" + triple + "-as" + ]) + .withExec(["make", "-j" + cores.toString()]) + .withExec(["make", "install"]); + + return gccContainer.directory("/gcc"); + } + + /** + * Test the cross-compiler + */ + @func() + async test( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + architectures: string = "aarch64,x86_64", + sdkVersion: string = "15.0", + kernelVersion: string = "24", + targetSdkVersion: string = "11.0.0", + downloadSdk: boolean = true, + cores: number = 16 + ): Promise { + logWithTimestamp("๐Ÿงช Testing cross-compiler"); + + const image = await this.buildImage( + source, + architectures, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores + ); + + const testContainer = image + .withDirectory("samples", source.directory("samples")) + .withExec(["mkdir", "-p", "out"]); + + const archList = architectures.split(",").map(arch => arch.trim()); + + for (const architecture of archList) { + const triple = `${architecture}-apple-darwin${kernelVersion}`; + + let archContainer = testContainer + .withEnvVariable("triple", triple) + .withExec([triple + "-clang", "--target=" + triple, "samples/hello.c", "-o", "out/hello-clang"]) + .withExec([triple + "-clang++", "--target=" + triple, "samples/hello.cpp", "-o", "out/hello-clang++"]) + .withExec([triple + "-gcc", "samples/hello.c", "-o", "out/hello-gcc"]) + .withExec([triple + "-g++", "samples/hello.cpp", "-o", "out/hello-g++"]) + .withExec([triple + "-gfortran", "samples/hello.f90", "-o", "out/hello-gfortran"]) + .withExec([ + "zig", "cc", + "-target", `${architecture}-macos`, + "--sysroot=/sdk", + "-I/sdk/usr/include", + "-L/sdk/usr/lib", + "-F/sdk/System/Library/Frameworks", + "-framework", "CoreFoundation", + "-o", "out/hello-zig-c", "samples/hello.c" + ]) + .withEnvVariable("CC", `zig-cc-${architecture}-macos`) + .withWorkdir("samples/rust") + .withExec(["cargo", "build", "--target", `${architecture}-apple-darwin`]) + .withExec(["mv", `target/${architecture}-apple-darwin/debug/hello`, "../../out/hello-rust"]) + .withWorkdir("/workspace"); + + // Verify architecture + const expectedArch = architecture === "aarch64" ? "arm64" : architecture; + const archPattern = architecture === "aarch64" ? "Mach-O 64-bit arm64 executable" : `Mach-O 64-bit ${architecture} executable`; + + archContainer = archContainer + .withExec(["file", "out/hello-clang"]) + .withExec(["bash", "-c", `file out/hello-clang | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-clang++ | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-gcc | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-g++ | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-gfortran | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-zig-c | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-rust | grep -q "${archPattern}"`]); + + // Export artifacts + await archContainer.directory("out").export(`./out/${architecture}`); + } + + return "โœ… Cross-compiler tests passed for all architectures"; + } + + /** + * Push the image to registry + */ + private async pushImage( + image: Container, + sdkVersion: string, + username: string, + password: Secret + ): Promise { + logWithTimestamp("๐Ÿ“ค Pushing image to registry"); + + const registry = "ghcr.io/shepherdjerred/macos-cross-compiler"; + + // Push with both latest and version tags + await image + .withRegistryAuth("ghcr.io", username, password) + .publish(registry + ":latest"); + + await image + .withRegistryAuth("ghcr.io", username, password) + .publish(registry + ":" + sdkVersion); + + return `โœ… Image pushed to ${registry}:latest and ${registry}:${sdkVersion}`; + } + + /** + * Validate the cross-compiler by running executables (macOS only) + */ + @func() + async validate( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + userArch: string = "aarch64" + ): Promise { + logWithTimestamp("โœ… Validating cross-compiled executables"); + + // Convert architecture names + let arch = userArch; + if (arch === "arm64") { + arch = "aarch64"; + } else if (arch === "x86_64") { + arch = "amd64"; + } + + // First run the test to generate binaries + await this.test(source); + + // Run the executables on the host (requires macOS) + const validationContainer = dag.container() + .from("busybox") + .withDirectory("/out", dag.host().directory(`out/${arch}`)) + .withExec(["./out/hello-clang"]) + .withExec(["./out/hello-clang++"]) + .withExec(["./out/hello-g++"]) + .withExec(["./out/hello-gcc"]) + .withExec(["./out/hello-gfortran"]) + .withExec(["./out/hello-zig-c"]) + .withExec(["./out/hello-rust"]); + + await validationContainer.sync(); + + return "โœ… All cross-compiled executables validated successfully"; + } +} diff --git a/.dagger/src/index.ts.backup b/.dagger/src/index.ts.backup new file mode 100644 index 0000000..9e5a199 --- /dev/null +++ b/.dagger/src/index.ts.backup @@ -0,0 +1,737 @@ +import { + func, + argument, + Directory, + object, + Secret, + Container, + dag, +} from "@dagger.io/dagger"; + +// Helper function to log with timestamp +function logWithTimestamp(message: string): void { + console.log(`[${new Date().toISOString()}] ${message}`); +} + +// Helper function to measure execution time +async function withTiming( + operation: string, + fn: () => Promise +): Promise { + const start = Date.now(); + logWithTimestamp(`Starting ${operation}...`); + try { + const result = await fn(); + const duration = Date.now() - start; + logWithTimestamp(`โœ… ${operation} completed in ${duration.toString()}ms`); + return result; + } catch (error) { + const duration = Date.now() - start; + logWithTimestamp( + `โŒ ${operation} failed after ${duration.toString()}ms: ${error instanceof Error ? error.message : String(error)}` + ); + throw error; + } +} + +@object() +export class MacosCrossCompiler { + /** + * Build and push the macOS cross-compiler image + * @param source The source directory + * @param architectures Target architectures (comma-separated) + * @param sdkVersion macOS SDK version + * @param kernelVersion Darwin kernel version + * @param targetSdkVersion Target SDK version for deployment + * @param downloadSdk Whether to download SDK or use local copy + * @param cores Number of CPU cores to use for compilation + * @param ghcrUsername GitHub Container Registry username + * @param ghcrPassword GitHub Container Registry password + * @returns Success message + */ + @func() + async ci( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + architectures: string = "aarch64,x86_64", + sdkVersion: string = "15.0", + kernelVersion: string = "24", + targetSdkVersion: string = "11.0.0", + downloadSdk: boolean = true, + cores: number = 16, + ghcrUsername?: string, + ghcrPassword?: Secret + ): Promise { + logWithTimestamp("๐Ÿš€ Starting macOS cross-compiler CI pipeline"); + + const archList = architectures.split(",").map(arch => arch.trim()); + + // Build the cross-compiler image + const image = await withTiming("cross-compiler image build", async () => { + return await this.buildImage( + source, + architectures, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores + ); + }); + + // Run tests + await withTiming("tests", async () => { + await this.test( + source, + architectures, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores + ); + }); + + // Push image if credentials provided + if (ghcrUsername && ghcrPassword) { + await withTiming("image push", async () => { + await this.pushImage(image, sdkVersion, ghcrUsername, ghcrPassword); + }); + } + + return "โœ… macOS cross-compiler CI pipeline completed successfully"; + } + + /** + * Build the macOS cross-compiler image + * @param source The source directory + * @param architectures Target architectures + * @param sdkVersion macOS SDK version + * @param kernelVersion Darwin kernel version + * @param targetSdkVersion Target SDK version + * @param downloadSdk Whether to download SDK + * @param cores Number of CPU cores + * @returns Built container image + */ + @func() + async buildImage( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + architectures: string = "aarch64,x86_64", + sdkVersion: string = "15.0", + kernelVersion: string = "24", + targetSdkVersion: string = "11.0.0", + downloadSdk: boolean = true, + cores: number = 16 + ): Promise { + logWithTimestamp("๐Ÿ—๏ธ Building macOS cross-compiler image"); + + // Start with base Ubuntu container + let container = dag.container() + .from("ubuntu:noble") + .withWorkdir("/workspace"); + + // Install base dependencies + container = await this.installBaseDeps(container); + + // Build components in dependency order + const xar = await this.buildXar(container, targetSdkVersion, cores); + const libdispatch = await this.buildLibdispatch(container, targetSdkVersion, cores); + const libtapi = await this.buildLibtapi(container, targetSdkVersion, cores); + + // Get or download SDK + const sdk = await this.getSdk(container, sdkVersion, downloadSdk); + + // Build Zig compiler + const zig = await this.buildZig(container); + + // Set up SDK in container + container = container + .withDirectory("/osxcross/SDK/MacOSX" + sdkVersion + ".sdk", sdk) + .withExec(["ln", "-s", "/osxcross/SDK/MacOSX" + sdkVersion + ".sdk/", "/sdk"]) + .withExec(["apt", "update"]) + .withExec(["apt", "install", "-y", "clang", "file", "libmpc-dev", "libmpfr-dev", "curl"]) + .withExec(["curl", "--proto", "=https", "--tlsv1.2", "-sSf", "https://sh.rustup.rs", "|", "sh", "-s", "--", "-y"]) + .withEnvVariable("PATH", "/root/.cargo/bin:/usr/local/bin:/gcc/bin:/cctools/bin:/osxcross/bin:$PATH") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withDirectory("/usr/local/bin", zig); + + // Build for each architecture + const archList = architectures.split(",").map(arch => arch.trim()); + + for (const architecture of archList) { + const triple = `${architecture}-apple-darwin${kernelVersion}`; + + // Build cctools for this architecture + const cctools = await this.buildCctools( + container, + architecture, + kernelVersion, + targetSdkVersion, + cores, + xar, + libtapi, + libdispatch + ); + + // Build wrappers + const clangWrappers = await this.buildClangWrappers( + container, + sdkVersion, + kernelVersion, + targetSdkVersion, + cores + ); + + const gccWrappers = await this.buildGccWrappers( + container, + sdkVersion, + kernelVersion, + targetSdkVersion, + cores + ); + + // Build GCC for this architecture + const gcc = await this.buildGcc( + container, + architecture, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores, + clangWrappers, + cctools, + sdk, + xar, + libtapi, + libdispatch + ); + + // Add binaries to final container + container = container + .withDirectory("/cctools", cctools) + .withDirectory("/osxcross", clangWrappers) + .withDirectory("/osxcross", gccWrappers) + .withDirectory("/gcc", gcc) + .withFile("/usr/local/bin/zig-cc-" + architecture + "-macos", source.file("zig/zig-cc-" + architecture + "-macos")) + .withExec(["chmod", "+x", "/usr/local/bin/zig-cc-" + architecture + "-macos"]); + + // Install Rust targets + container = container + .withExec(["rustup", "target", "add", architecture + "-apple-darwin"]); + } + + // Final library setup + container = container + .withDirectory("/usr/local/lib", xar.directory("lib")) + .withDirectory("/usr/local/lib", libtapi.directory("lib")) + .withDirectory("/usr/local/lib", libdispatch.directory("lib")) + .withExec(["ldconfig"]) + .withWorkdir("/workspace"); + + return container; + } + + /** + * Install base dependencies + */ + private async installBaseDeps(container: Container): Promise { + return container + .withExec(["apt", "update", "-y"]) + .withExec(["apt", "install", "-y", "build-essential", "cmake", "clang", "git"]); + } + + /** + * Build xar library + */ + private async buildXar(container: Container, targetSdkVersion: string, cores: number): Promise { + const xarContainer = container + .withExec(["apt", "install", "-y", "libxml2-dev", "libssl-dev", "zlib1g-dev"]) + .withExec(["git", "clone", "--branch", "5fa4675419cfec60ac19a9c7f7c2d0e7c831a497", "https://github.com/tpoechtrager/xar", "/tmp/xar"]) + .withWorkdir("/tmp/xar") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["./configure", "--prefix=/xar"]) + .withExec(["make", "-j" + cores.toString()]) + .withExec(["make", "install"]); + + return xarContainer.directory("/xar"); + } + + /** + * Build libdispatch library + */ + private async buildLibdispatch(container: Container, targetSdkVersion: string, cores: number): Promise { + const version = "fdf3fc85a9557635668c78801d79f10161d83f12"; + const libdispatchContainer = container + .withExec(["git", "clone", "--branch", version, "https://github.com/tpoechtrager/apple-libdispatch", "/tmp/libdispatch-src"]) + .withWorkdir("/tmp/libdispatch-src") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withEnvVariable("TARGETDIR", "/libdispatch") + .withExec(["mkdir", "-p", "build"]) + .withWorkdir("build") + .withExec(["cmake", "..", "-DCMAKE_BUILD_TYPE=RELEASE", "-DCMAKE_INSTALL_PREFIX=/libdispatch"]) + .withExec(["make", "install", "-j" + cores.toString()]); + + return libdispatchContainer.directory("/libdispatch"); + } + + /** + * Build libtapi library + */ + private async buildLibtapi(container: Container, targetSdkVersion: string, cores: number): Promise { + const version = "1300.6.5"; + const libtapiContainer = container + .withExec(["apt", "install", "-y", "python3"]) + .withExec(["git", "clone", "--branch", version, "https://github.com/tpoechtrager/apple-libtapi", "/tmp/libtapi-src"]) + .withWorkdir("/tmp/libtapi-src") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withEnvVariable("INSTALLPREFIX", "/libtapi") + .withExec(["./build.sh"]) + .withExec(["./install.sh"]); + + return libtapiContainer.directory("/libtapi"); + } + + /** + * Build cctools + */ + private async buildCctools( + container: Container, + architecture: string, + kernelVersion: string, + targetSdkVersion: string, + cores: number, + xar: Directory, + libtapi: Directory, + libdispatch: Directory + ): Promise { + // autoconf does not recognize aarch64 -- use arm instead + const triple = architecture === "aarch64" ? + `arm-apple-darwin${kernelVersion}` : + `${architecture}-apple-darwin${kernelVersion}`; + + const cctoolsVersion = "1010.6"; + const linkerVersion = "951.9"; + + const cctoolsContainer = container + .withExec(["apt", "install", "-y", "llvm-dev", "uuid-dev", "rename"]) + .withExec(["git", "clone", "--branch", `${cctoolsVersion}-ld64-${linkerVersion}`, "https://github.com/tpoechtrager/cctools-port", "/tmp/cctools-src"]) + .withWorkdir("/tmp/cctools-src") + .withDirectory("/xar", xar) + .withDirectory("/libtapi", libtapi) + .withDirectory("/libdispatch", libdispatch) + .withWorkdir("/tmp/cctools-src/cctools") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec([ + "./configure", + "--prefix=/cctools", + "--with-libtapi=/libtapi", + "--with-libxar=/xar", + "--with-libdispatch=/libdispatch", + "--with-libblocksruntime=/libdispatch", + "--target=" + triple + ]); + + // Fix aarch64 target naming + if (architecture === "aarch64") { + cctoolsContainer + .withExec(["find", ".", "-name", "Makefile", "-print0", "|", "xargs", "-0", "sed", "-i", `s/arm-apple-darwin${kernelVersion}/arm64-apple-darwin${kernelVersion}/g`]); + } + + const finalContainer = cctoolsContainer + .withExec(["make", "-j" + cores.toString()]) + .withExec(["make", "install"]); + + // Link aarch64 artifacts + if (architecture === "aarch64") { + finalContainer + .withExec(["bash", "-c", "cd /cctools/bin && for file in *arm64*; do ln -s $file ${file/arm64/aarch64}; done"]); + } + + return finalContainer.directory("/cctools"); + } + + /** + * Build wrapper for clang + */ + private async buildClangWrappers( + container: Container, + sdkVersion: string, + kernelVersion: string, + targetSdkVersion: string, + cores: number + ): Promise { + const wrapperContainer = container + .withExec(["git", "clone", "--branch=29fe6dd35522073c9df5800f8cd1feb4b9a993a8", "https://github.com/tpoechtrager/osxcross", "/tmp/osxcross-src"]) + .withWorkdir("/tmp/osxcross-src/wrapper") + .withEnvVariable("VERSION", "1.5") + .withEnvVariable("SDK_VERSION", sdkVersion) + .withEnvVariable("TARGET", "darwin" + kernelVersion) + .withEnvVariable("LINKER_VERSION", "951.9") + .withEnvVariable("X86_64H_SUPPORTED", "0") + .withEnvVariable("I386_SUPPORTED", "0") + .withEnvVariable("ARM_SUPPORTED", "1") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["make", "wrapper", "-j" + cores.toString()]); + + const compilers = ["clang", "clang++"]; + let finalContainer = wrapperContainer; + + for (const compiler of compilers) { + finalContainer = finalContainer + .withEnvVariable("TARGETCOMPILER", compiler) + .withExec(["./build_wrapper.sh"]); + } + + return finalContainer.directory("/tmp/osxcross-src/target"); + } + + /** + * Build wrapper for GCC + */ + private async buildGccWrappers( + container: Container, + sdkVersion: string, + kernelVersion: string, + targetSdkVersion: string, + cores: number + ): Promise { + const wrapperContainer = container + .withExec(["git", "clone", "--branch=29fe6dd35522073c9df5800f8cd1feb4b9a993a8", "https://github.com/tpoechtrager/osxcross", "/tmp/osxcross-gcc-src"]) + .withWorkdir("/tmp/osxcross-gcc-src/wrapper") + .withEnvVariable("VERSION", "1.5") + .withEnvVariable("SDK_VERSION", sdkVersion) + .withEnvVariable("TARGET", "darwin" + kernelVersion) + .withEnvVariable("LINKER_VERSION", "951.9") + .withEnvVariable("X86_64H_SUPPORTED", "0") + .withEnvVariable("I386_SUPPORTED", "0") + .withEnvVariable("ARM_SUPPORTED", "1") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["make", "wrapper", "-j" + cores.toString()]); + + const compilers = ["gcc", "g++", "gfortran"]; + let finalContainer = wrapperContainer; + + for (const compiler of compilers) { + finalContainer = finalContainer + .withEnvVariable("TARGETCOMPILER", compiler) + .withExec(["./build_wrapper.sh"]); + } + + return finalContainer.directory("/tmp/osxcross-gcc-src/target"); + } + + /** + * Get or download SDK + */ + private async getSdk(container: Container, version: string, downloadSdk: boolean): Promise { + if (downloadSdk) { + const sdkContainer = container + .withExec(["apt", "update"]) + .withExec(["apt", "install", "-y", "wget"]) + .withExec(["wget", `https://github.com/joseluisq/macosx-sdks/releases/download/${version}/MacOSX${version}.sdk.tar.xz`]) + .withExec(["tar", "-xf", `MacOSX${version}.sdk.tar.xz`]) + .withExec(["bash", "-c", `mv MacOSX*.sdk MacOSX${version}.sdk || true`]); + + return sdkContainer.directory(`MacOSX${version}.sdk`); + } else { + const sdkContainer = container + .withFile(`MacOSX${version}.sdk.tar.xz`, dag.host().directory("sdks").file(`MacOSX${version}.sdk.tar.xz`)) + .withExec(["tar", "-xf", `MacOSX${version}.sdk.tar.xz`]); + + return sdkContainer.directory(`MacOSX${version}.sdk`); + } + } + + /** + * Build Zig compiler + */ + private async buildZig(container: Container, targetArch: string = "x86_64"): Promise { + const zigVersion = "0.13.0"; + + // Determine the correct Zig archive based on target architecture + let archSuffix: string; + if (targetArch === "aarch64" || targetArch === "arm64") { + archSuffix = "aarch64"; + } else if (targetArch === "x86_64" || targetArch === "amd64") { + archSuffix = "x86_64"; + } else { + throw new Error(`Unsupported architecture: ${targetArch}`); + } + + const zigContainer = container + .withExec(["apt", "install", "-y", "wget", "xz-utils"]) + .withExec(["wget", "-O", "zig.tar.xz", `https://ziglang.org/download/${zigVersion}/zig-linux-${archSuffix}-${zigVersion}.tar.xz`]) + .withExec(["tar", "-xf", "zig.tar.xz"]) + .withExec(["rm", "zig.tar.xz"]) + .withExec(["bash", "-c", "mv zig* zig"]); + + return zigContainer.directory("zig"); + } + + /** + * Build GCC compiler + */ + private async buildGcc( + container: Container, + architecture: string, + sdkVersion: string, + kernelVersion: string, + targetSdkVersion: string, + downloadSdk: boolean, + cores: number, + clangWrappers: Directory, + cctools: Directory, + sdk: Directory, + xar: Directory, + libtapi: Directory, + libdispatch: Directory + ): Promise { + const triple = `${architecture}-apple-darwin${kernelVersion}`; + + const gccContainer = container + .withExec(["apt", "install", "-y", "gcc", "g++", "zlib1g-dev", "libmpc-dev", "libmpfr-dev", "libgmp-dev", "flex", "file"]) + .withExec(["apt-get", "install", "-y", "--force-yes", "llvm-dev", "libxml2-dev", "uuid-dev", "libssl-dev", "bash", "patch", "make", "tar", "xz-utils", "bzip2", "gzip", "sed", "cpio", "libbz2-dev", "zlib1g-dev"]) + .withExec(["git", "clone", "--branch=gcc-14-2-darwin", "https://github.com/iains/gcc-14-branch", "/tmp/gcc-src"]) + .withDirectory("/osxcross", clangWrappers) + .withDirectory("/cctools", cctools) + .withDirectory("/sdk", sdk) + .withDirectory("/sdk/usr", xar) + .withDirectory("/sdk/usr", libtapi) + .withDirectory("/sdk/usr", libdispatch) + .withDirectory("/usr/local/lib", xar.directory("lib")) + .withDirectory("/usr/local/lib", libtapi.directory("lib")) + .withDirectory("/usr/local/lib", libdispatch.directory("lib")) + .withExec(["ldconfig"]) + .withExec(["mkdir", "-p", "/osxcross/SDK"]) + .withExec(["ln", "-s", "/sdk", `/osxcross/SDK/MacOSX${sdkVersion}.sdk`]) + .withEnvVariable("PATH", "$PATH:/osxcross/bin:/cctools/bin") + .withEnvVariable("MACOSX_DEPLOYMENT_TARGET", targetSdkVersion) + .withExec(["mkdir", "-p", "/tmp/gcc-build"]) + .withWorkdir("/tmp/gcc-build") + .withExec([ + "/tmp/gcc-src/configure", + "--target=" + triple, + "--with-sysroot=/sdk", + "--disable-nls", + "--enable-languages=c,c++,fortran,objc,obj-c++", + "--without-headers", + "--enable-lto", + "--enable-checking=release", + "--disable-libstdcxx-pch", + "--prefix=/gcc", + "--with-system-zlib", + "--disable-multilib", + "--with-ld=/cctools/bin/" + triple + "-ld", + "--with-as=/cctools/bin/" + triple + "-as" + ]) + .withExec(["make", "-j" + cores.toString()]) + .withExec(["make", "install"]); + + return gccContainer.directory("/gcc"); + } + + /** + * Test the cross-compiler + */ + @func() + async test( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + architectures: string = "aarch64,x86_64", + sdkVersion: string = "15.0", + kernelVersion: string = "24", + targetSdkVersion: string = "11.0.0", + downloadSdk: boolean = true, + cores: number = 16 + ): Promise { + logWithTimestamp("๐Ÿงช Testing cross-compiler"); + + const image = await this.buildImage( + source, + architectures, + sdkVersion, + kernelVersion, + targetSdkVersion, + downloadSdk, + cores + ); + + const testContainer = image + .withDirectory("samples", source.directory("samples")) + .withExec(["mkdir", "-p", "out"]); + + const archList = architectures.split(",").map(arch => arch.trim()); + + for (const architecture of archList) { + const triple = `${architecture}-apple-darwin${kernelVersion}`; + + let archContainer = testContainer + .withEnvVariable("triple", triple) + .withExec([triple + "-clang", "--target=" + triple, "samples/hello.c", "-o", "out/hello-clang"]) + .withExec([triple + "-clang++", "--target=" + triple, "samples/hello.cpp", "-o", "out/hello-clang++"]) + .withExec([triple + "-gcc", "samples/hello.c", "-o", "out/hello-gcc"]) + .withExec([triple + "-g++", "samples/hello.cpp", "-o", "out/hello-g++"]) + .withExec([triple + "-gfortran", "samples/hello.f90", "-o", "out/hello-gfortran"]) + .withExec([ + "zig", "cc", + "-target", `${architecture}-macos`, + "--sysroot=/sdk", + "-I/sdk/usr/include", + "-L/sdk/usr/lib", + "-F/sdk/System/Library/Frameworks", + "-framework", "CoreFoundation", + "-o", "out/hello-zig-c", "samples/hello.c" + ]) + .withEnvVariable("CC", `zig-cc-${architecture}-macos`) + .withWorkdir("samples/rust") + .withExec(["cargo", "build", "--target", `${architecture}-apple-darwin`]) + .withExec(["mv", `target/${architecture}-apple-darwin/debug/hello`, "../../out/hello-rust"]) + .withWorkdir("/workspace"); + + // Verify architecture + const expectedArch = architecture === "aarch64" ? "arm64" : architecture; + const archPattern = architecture === "aarch64" ? "Mach-O 64-bit arm64 executable" : `Mach-O 64-bit ${architecture} executable`; + + archContainer = archContainer + .withExec(["file", "out/hello-clang"]) + .withExec(["bash", "-c", `file out/hello-clang | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-clang++ | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-gcc | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-g++ | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-gfortran | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-zig-c | grep -q "${archPattern}"`]) + .withExec(["bash", "-c", `file out/hello-rust | grep -q "${archPattern}"`]); + + // Export artifacts + await archContainer.directory("out").export(`./out/${architecture}`); + } + + return "โœ… Cross-compiler tests passed for all architectures"; + } + + /** + * Push the image to registry + */ + private async pushImage( + image: Container, + sdkVersion: string, + username: string, + password: Secret + ): Promise { + logWithTimestamp("๐Ÿ“ค Pushing image to registry"); + + const registry = "ghcr.io/shepherdjerred/macos-cross-compiler"; + + // Push with both latest and version tags + await image + .withRegistryAuth("ghcr.io", username, password) + .publish(registry + ":latest"); + + await image + .withRegistryAuth("ghcr.io", username, password) + .publish(registry + ":" + sdkVersion); + + return `โœ… Image pushed to ${registry}:latest and ${registry}:${sdkVersion}`; + } + + /** + * Validate the cross-compiler by running executables (macOS only) + */ + @func() + async validate( + @argument({ + ignore: [ + "node_modules", + "dist", + "build", + ".cache", + "*.log", + ".env*", + "!.env.example", + ".dagger", + "generated", + "out", + "dagger_examples", + ], + defaultPath: ".", + }) + source: Directory, + userArch: string = "aarch64" + ): Promise { + logWithTimestamp("โœ… Validating cross-compiled executables"); + + // Convert architecture names + let arch = userArch; + if (arch === "arm64") { + arch = "aarch64"; + } else if (arch === "x86_64") { + arch = "amd64"; + } + + // First run the test to generate binaries + await this.test(source); + + // Run the executables on the host (requires macOS) + const validationContainer = dag.container() + .from("busybox") + .withDirectory("/out", dag.host().directory(`out/${arch}`)) + .withExec(["./out/hello-clang"]) + .withExec(["./out/hello-clang++"]) + .withExec(["./out/hello-g++"]) + .withExec(["./out/hello-gcc"]) + .withExec(["./out/hello-gfortran"]) + .withExec(["./out/hello-zig-c"]) + .withExec(["./out/hello-rust"]); + + await validationContainer.sync(); + + return "โœ… All cross-compiled executables validated successfully"; + } +} diff --git a/.dagger/tsconfig.json b/.dagger/tsconfig.json new file mode 100644 index 0000000..fbd9849 --- /dev/null +++ b/.dagger/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "node", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "declaration": true, + "outDir": "./dist", + "rootDir": "./src", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "allowSyntheticDefaultImports": true, + "resolveJsonModule": true, + "typeRoots": [ + "./node_modules/@types" + ], + "types": [ + "node" + ] + }, + "include": [ + "src/**/*" + ], + "exclude": [ + "node_modules", + "dist" + ] +} diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..45dd2a8 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,21 @@ +FROM ubuntu:noble + +RUN apt update -y && apt install -y gpg wget curl git +RUN install -dm 755 /etc/apt/keyrings +RUN wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor > /etc/apt/keyrings/mise-archive-keyring.gpg +RUN echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=amd64] https://mise.jdx.dev/deb stable main" > /etc/apt/sources.list.d/mise.list +RUN apt update +RUN apt install -y mise + +RUN echo 'eval "$(mise activate bash --shims)"' >> ~/.bash_profile +RUN echo 'eval "$(mise activate bash)"' >> ~/.bashrc + +RUN mise use -g bun@latest +RUN mise use -g node@lts +RUN mise use -g python@latest +RUN mise install +RUN mise reshim + +RUN wget https://github.com/earthly/earthly/releases/latest/download/earthly-linux-amd64 -O /usr/local/bin/earthly +RUN chmod +x /usr/local/bin/earthly +RUN /usr/local/bin/earthly bootstrap --with-autocomplete diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..aaca86e --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,8 @@ +{ + "build": { + "dockerfile": "Dockerfile" + }, + "features": { + "ghcr.io/devcontainers/features/docker-in-docker:2": {} + } +} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..df2c7a0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,59 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +jobs: + dagger-ci: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: | + cd dagger + bun install + + - name: Install Dagger CLI + run: | + curl -L https://dl.dagger.io/dagger/install.sh | BIN_DIR=$HOME/.local/bin sh + echo "$HOME/.local/bin" >> $GITHUB_PATH + + - name: Run Dagger CI pipeline (prod) + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + env: + GHCR_USERNAME: ${{ github.actor }} + GHCR_PASSWORD: ${{ github.token }} + run: | + cd dagger + dagger call ci \ + --source=.. \ + --ghcr-username="$GHCR_USERNAME" \ + --ghcr-password=env://GHCR_PASSWORD + + - name: Run Dagger CI pipeline (dev) + if: github.event_name == 'pull_request' || github.ref != 'refs/heads/main' + run: | + cd dagger + dagger call ci \ + --source=.. + + - name: Upload test artifacts + if: always() + uses: actions/upload-artifact@v4 + with: + name: cross-compiler-test-results + path: out/ + retention-days: 30 + +permissions: + contents: read + packages: write diff --git a/Earthfile b/Earthfile deleted file mode 100644 index f706650..0000000 --- a/Earthfile +++ /dev/null @@ -1,354 +0,0 @@ -VERSION 0.8 -FROM ubuntu:noble -WORKDIR /workspace -ARG --global cores=16 - -ci: - # TODO: build for arm64 too - BUILD --platform=linux/amd64 +image - BUILD +test - -deps: - RUN apt update -y - RUN apt install -y build-essential cmake clang git - -xar: - FROM +deps - ARG --required target_sdk_version - RUN apt install -y libxml2-dev libssl-dev zlib1g-dev - GIT CLONE --branch 5fa4675419cfec60ac19a9c7f7c2d0e7c831a497 https://github.com/tpoechtrager/xar . - WORKDIR xar - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - RUN ./configure --prefix=/xar - RUN make -j$cores - RUN make install - SAVE ARTIFACT /xar/* - -libdispatch: - FROM +deps - ARG --required target_sdk_version - ARG version=fdf3fc85a9557635668c78801d79f10161d83f12 - GIT CLONE --branch $version https://github.com/tpoechtrager/apple-libdispatch . - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - ENV TARGETDIR=/libdispatch - RUN mkdir -p build - WORKDIR build - RUN CC=clang CXX=clang++ cmake .. -DCMAKE_BUILD_TYPE=RELEASE -DCMAKE_INSTALL_PREFIX=$TARGETDIR - RUN make install -j$cores - SAVE ARTIFACT /libdispatch/* - -libtapi: - FROM +deps - RUN apt install -y python3 - ARG --required target_sdk_version - ARG version=1300.6.5 - GIT CLONE --branch $version https://github.com/tpoechtrager/apple-libtapi . - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - ENV INSTALLPREFIX=/libtapi - RUN ./build.sh - RUN ./install.sh - SAVE ARTIFACT /libtapi/* - -cctools: - ARG --required architecture - ARG --required kernel_version - ARG --required target_sdk_version - # autoconf does not recognize aarch64 -- use arm instead - # https://github.com/tpoechtrager/cctools-port/issues/6 - IF [ $architecture = "aarch64" ] - ARG triple=arm-apple-darwin$kernel_version - ELSE - ARG triple=$architecture-apple-darwin$kernel_version - END - FROM +deps - RUN apt install -y llvm-dev uuid-dev rename - ARG cctools_version=1010.6 - ARG linker_verison=951.9 - GIT CLONE --branch $cctools_version-ld64-$linker_verison https://github.com/tpoechtrager/cctools-port . - COPY (+xar/ --target_sdk_version=$target_sdk_version) /xar - COPY (+libtapi/ --target_sdk_version=$target_sdk_version) /libtapi - COPY (+libdispatch/ --target_sdk_version=$target_sdk_version) /libdispatch - WORKDIR cctools - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - RUN ./configure \ - --prefix=/cctools \ - --with-libtapi=/libtapi \ - --with-libxar=/libxar \ - --with-libdispatch=/libdispatch \ - --with-libblocksruntime=/libdispatch \ - --target=$triple - # now that we've tricked autoconf by pretending to build for arm, let's _actually_ build for arm64 - # https://github.com/tpoechtrager/cctools-port/issues/6 - RUN find . -name Makefile -print0 | xargs -0 sed -i "s/arm-apple-darwin$kernel_version/arm64-apple-darwin$kernel_version/g" - RUN make -j$cores - RUN make install - # link aarch64 artifacts so that the target triple is consistent with what clang/gcc will expect - IF [ $architecture = "aarch64" ] - FOR file IN $(ls /cctools/bin/*) - RUN /bin/bash -c "ln -s $file \${file/arm64/"aarch64"} " - END - END - ENV PATH=$PATH:/cctools/bin - SAVE ARTIFACT /cctools/* - -wrapper: - ARG --required sdk_version - ARG --required kernel_version - ARG --required target_sdk_version - FROM +deps - RUN apt install -y - GIT CLONE --branch=29fe6dd35522073c9df5800f8cd1feb4b9a993a8 https://github.com/tpoechtrager/osxcross . - WORKDIR wrapper - # this is in build.sh in osxcross - ENV VERSION=1.5 - ENV SDK_VERSION=$sdk_version - ENV TARGET=darwin$kernel_version - # this needs to match the version of the linker in cctools - ENV LINKER_VERSION=951.9 - ENV X86_64H_SUPPORTED=0 - ENV I386_SUPPORTED=0 - ENV ARM_SUPPORTED=1 - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - RUN make wrapper -j$cores - -wrapper.clang: - ARG --required sdk_version - ARG --required kernel_version - ARG --required target_sdk_version - FROM +wrapper --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version - ARG compilers=clang clang++ - FOR compiler IN $compilers - ENV TARGETCOMPILER=$compiler - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - RUN ./build_wrapper.sh - END - SAVE ARTIFACT /workspace/target/* - -wrapper.gcc: - ARG --required sdk_version - ARG --required kernel_version - ARG --required target_sdk_version - FROM +wrapper --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version - ARG compilers=gcc g++ gfortran - FOR compiler IN $compilers - ENV TARGETCOMPILER=$compiler - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - RUN ./build_wrapper.sh - END - SAVE ARTIFACT /workspace/target/* - -sdk.download: - RUN apt update - RUN apt install -y wget - ARG --required version - RUN wget https://github.com/joseluisq/macosx-sdks/releases/download/$version/MacOSX$version.sdk.tar.xz - SAVE ARTIFACT MacOSX$version.sdk.tar.xz - -sdk: - ARG --required version - ARG --required download_sdk - FROM +deps - IF [ $download_sdk = "true" ] - COPY (+sdk.download/MacOSX$version.sdk.tar.xz --version=$version) . - RUN tar -xf MacOSX$version.sdk.tar.xz - RUN mv MacOSX*.sdk MacOSX$version.sdk || true # newer versions of the SDK don't need to be moved - ELSE - COPY sdks/MacOSX$version.sdk.tar.xz . - RUN tar -xf MacOSX$version.sdk.tar.xz - END - SAVE ARTIFACT MacOSX$version.sdk/* - -gcc: - ARG --required download_sdk - ARG --required architecture - ARG --required sdk_version - ARG --required kernel_version - ARG --required target_sdk_version - ARG triple=$architecture-apple-darwin$kernel_version - FROM +deps - RUN apt install -y gcc g++ zlib1g-dev libmpc-dev libmpfr-dev libgmp-dev flex file - - # TODO: this shouldn't be needed - RUN apt-get install -y --force-yes llvm-dev libxml2-dev uuid-dev libssl-dev bash patch make tar xz-utils bzip2 gzip sed cpio libbz2-dev zlib1g-dev - - IF [ $architecture = "aarch64" ] - GIT CLONE --branch=gcc-14-2-darwin https://github.com/iains/gcc-14-branch gcc - ELSE IF [ $architecture = "x86_64" ] - GIT CLONE --branch=gcc-14-2-darwin https://github.com/iains/gcc-14-branch gcc - ELSE - RUN false - END - - COPY (+wrapper.clang/ --kernel_version=$kernel_version --sdk_version=$sdk_version --target_sdk_version=$target_sdk_version) /osxcross - ENV PATH=$PATH:/osxcross/bin - COPY (+cctools/ --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version) /cctools - ENV PATH=$PATH:/cctools/bin - - COPY (+sdk/ --version=$sdk_version --download_sdk=$download_sdk) /sdk - RUN mkdir -p /osxcross/SDK - RUN ln -s /sdk /osxcross/SDK/MacOSX$sdk_version.sdk - - # TODO: I think we can remove these - COPY (+xar/ --target_sdk_version=$target_sdk_version) /sdk/usr - COPY (+libtapi/ --target_sdk_version=$target_sdk_version) /sdk/usr - COPY (+libdispatch/ --target_sdk_version=$target_sdk_version) /sdk/usr - - COPY (+xar/lib --target_sdk_version=$target_sdk_version) /usr/local/lib - COPY (+libtapi/lib --target_sdk_version=$target_sdk_version) /usr/local/lib - COPY (+libdispatch/lib --target_sdk_version=$target_sdk_version) /usr/local/lib - RUN ldconfig - - # GCC requires that you build in a directory that is not a subdirectory of the source code - # https://gcc.gnu.org/install/configure.html - WORKDIR build - - # this being set is very important! we'll be building iphone binaries otherwise. - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - RUN ../gcc/configure \ - --target=$triple \ - --with-sysroot=/sdk \ - --disable-nls \ - --enable-languages=c,c++,fortran,objc,obj-c++ \ - --without-headers \ - --enable-lto \ - --enable-checking=release \ - --disable-libstdcxx-pch \ # TODO: maybe enable this - --prefix=/gcc \ - --with-system-zlib \ - --disable-multilib \ - --with-ld=/cctools/bin/$triple-ld \ - --with-as=/cctools/bin/$triple-as - RUN make -j$cores - RUN make install - SAVE ARTIFACT /gcc/* - -image: - ARG architectures=aarch64 x86_64 - ARG sdk_version=15.0 - ARG kernel_version=24 - ARG target_sdk_version=11.0.0 - ARG download_sdk=true - COPY (+sdk/ --version=$sdk_version --download_sdk=$download_sdk) /osxcross/SDK/MacOSX$sdk_version.sdk/ - RUN ln -s /osxcross/SDK/MacOSX$sdk_version.sdk/ /sdk - RUN apt update - # this is the clang we'll actually be using to compile stuff with! - RUN apt install -y clang - # for inspecting the binaries - RUN apt install -y file - # for gcc - RUN apt install -y libmpc-dev libmpfr-dev - - # for rust - COPY ./zig+zig/zig /usr/local/bin - RUN apt install -y curl - RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y - ENV PATH=$PATH:/root/.cargo/bin - - FOR architecture IN $architectures - ENV triple=$architecture-apple-darwin$kernel_version - COPY (+cctools/ --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version) /cctools - COPY (+gcc/ --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /gcc - COPY (+wrapper.clang/ --kernel_version=$kernel_version --sdk_version=$sdk_version --target_sdk_version=$target_sdk_version) /osxcross - COPY (+wrapper.gcc/ --kernel_version=$kernel_version --sdk_version=$sdk_version --target_sdk_version=$target_sdk_version) /osxcross - COPY (+gcc/lib --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/lib - COPY (+gcc/include --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/include - COPY (+gcc/$triple/lib --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/lib - COPY (+gcc/$triple/include --architecture=$architecture --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk) /usr/local/include - COPY ./zig/zig-cc-$architecture-macos /usr/local/bin/ - RUN rustup target add $architecture-apple-darwin - ENV triple="" - END - - COPY (+xar/lib --target_sdk_version=$target_sdk_version) /usr/local/lib - COPY (+libtapi/lib --target_sdk_version=$target_sdk_version) /usr/local/lib - COPY (+libdispatch/lib --target_sdk_version=$target_sdk_version) /usr/local/lib - RUN ldconfig - - ENV PATH=$PATH:/usr/local/bin - ENV PATH=$PATH:/gcc/bin - ENV PATH=$PATH:/cctools/bin - ENV PATH=$PATH:/osxcross/bin - ENV MACOSX_DEPLOYMENT_TARGET=$target_sdk_version - WORKDIR /workspace - SAVE IMAGE --push ghcr.io/shepherdjerred/macos-cross-compiler:latest - SAVE IMAGE --push ghcr.io/shepherdjerred/macos-cross-compiler:$sdk_version - -test: - ARG architectures=aarch64 x86_64 - ARG sdk_version=15.0 - ARG kernel_version=24 - ARG target_sdk_version=11.0.0 - ARG download_sdk=true - FROM +image --architectures=$architectures --sdk_version=$sdk_version --kernel_version=$kernel_version --target_sdk_version=$target_sdk_version --download_sdk=$download_sdk - COPY ./samples/ samples/ - FOR architecture IN $architectures - ENV triple=$architecture-apple-darwin$kernel_version - - RUN mkdir -p out/ - - # compile the samples - RUN $triple-clang --target=$triple samples/hello.c -o out/hello-clang - RUN $triple-clang++ --target=$triple samples/hello.cpp -o out/hello-clang++ - RUN $triple-gcc samples/hello.c -o out/hello-gcc - RUN $triple-g++ samples/hello.cpp -o out/hello-g++ - RUN $triple-gfortran samples/hello.f90 -o out/hello-gfortran - RUN zig cc \ - -target $architecture-macos \ - --sysroot=/sdk \ - -I/sdk/usr/include \ - -L/sdk/usr/lib \ - -F/sdk/System/Library/Frameworks \ - -framework CoreFoundation \ - -o out/hello-zig-c samples/hello.c - ENV CC="zig-cc-$architecture-macos" - RUN cd samples/rust && cargo build --target $architecture-apple-darwin && mv target/$architecture-apple-darwin/debug/hello ../../out/hello-rust - - # verify that the cross-compiler targeted the correct architecture - IF [ "$architecture" = "aarch64" ] - RUN file out/hello-clang | grep -q "Mach-O 64-bit arm64 executable" - RUN file out/hello-clang++ | grep -q "Mach-O 64-bit arm64 executable" - RUN file out/hello-gcc | grep -q "Mach-O 64-bit arm64 executable" - RUN file out/hello-g++ | grep -q "Mach-O 64-bit arm64 executable" - RUN file out/hello-gfortran | grep -q "Mach-O 64-bit arm64 executable" - RUN file out/hello-zig-c | grep -q "Mach-O 64-bit arm64 executable" - RUN file out/hello-rust | grep -q "Mach-O 64-bit arm64 executable" - ELSE - RUN file out/hello-clang | grep -q "Mach-O 64-bit $architecture executable" - RUN file out/hello-clang++ | grep -q "Mach-O 64-bit $architecture executable" - RUN file out/hello-gcc | grep -q "Mach-O 64-bit $architecture executable" - RUN file out/hello-g++ | grep -q "Mach-O 64-bit $architecture executable" - RUN file out/hello-gfortran | grep -q "Mach-O 64-bit $architecture executable" - RUN file out/hello-zig-c | grep -q "Mach-O 64-bit $architecture executable" - RUN file out/hello-rust | grep -q "Mach-O 64-bit $architecture executable" - END - - SAVE ARTIFACT out/* AS LOCAL out/$architecture/ - END - -# Can only be run on macOS -validate: - LOCALLY - - ARG USERARCH - LET arch = $USERARCH - # convert arm64 -> aarch64 - IF [ $arch = "arm64" ] - SET arch=aarch64 - END - # convert x86_64 -> amd64 - IF [ $arch = "x86_64" ] - SET arch=amd64 - END - - WAIT - BUILD +test - END - - RUN ./out/$arch/hello-clang - RUN ./out/$arch/hello-clang++ - RUN ./out/$arch/hello-g++ - RUN ./out/$arch/hello-gcc - # note: required fortran to be installed on your macOS device - RUN ./out/$arch/hello-gfortran - RUN ./out/$arch/hello-zig-c - RUN ./out/$arch/hello-rust diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index c5a64d0..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,52 +0,0 @@ -pipeline { - agent { - kubernetes { - defaultContainer 'earthly' - inheritFrom 'default' - yaml ''' - spec: - containers: - - name: tailscale - image: tailscale/tailscale - securityContext: - privileged: true - env: - - name: TS_AUTHKEY - valueFrom: - secretKeyRef: - name: tailscale-auth-key - key: TS_AUTHKEY - - name: TS_ACCEPT_DNS - value: true - - name: TS_KUBE_SECRET - value: - - name: TS_USERSPACE - value: false - - name: earthly - image: earthly/earthly - env: - - name: NO_BUILDKIT - value: 1 - - name: NO_COLOR - value: 1 - command: ["sleep"] - args: ["1h"] -''' - } - } - - environment { - GITHUB_USERNAME = "shepherdjerred" - GITHUB_TOKEN = credentials('GITHUB_TOKEN') - EARTHLY_TOKEN = credentials('EARTHLY_TOKEN') - } - - stages { - stage('Build') { - steps { - sh 'echo $GITHUB_TOKEN | docker login ghcr.io -u GITHUB_USERNAME --password-stdin' - sh 'earthly --sat=lamport --org=sjerred --ci --push +ci'; - } - } - } -} diff --git a/dagger.json b/dagger.json new file mode 100644 index 0000000..145cd23 --- /dev/null +++ b/dagger.json @@ -0,0 +1,4 @@ +{ + "name": "macos-cross-compiler", + "engineVersion": "v0.18.12" +} diff --git a/zig/Earthfile b/zig/Earthfile deleted file mode 100644 index 57856d5..0000000 --- a/zig/Earthfile +++ /dev/null @@ -1,20 +0,0 @@ -VERSION 0.8 - -zig: - ARG zig_version="0.13.0" - ARG TARGETARCH - FROM ubuntu:noble - RUN apt update - RUN apt install -y wget xz-utils - IF [ $TARGETARCH = "aarch64" ] || [ $TARGETARCH = "arm64" ] - RUN wget -O zig.tar.xz https://ziglang.org/download/$zig_version/zig-linux-aarch64-$zig_version.tar.xz - ELSE IF [ $TARGETARCH = "x86_64" ] || [ $TARGETARCH = "amd64" ] - RUN wget -O zig.tar.xz https://ziglang.org/download/$zig_version/zig-linux-x86_64-$zig_version.tar.xz - ELSE - RUN echo "Unsupported architecture: $TARGETARCH" - RUN exit 1 - END - RUN tar -xf zig.tar.xz - RUN rm zig.tar.xz - RUN mv zig* zig - SAVE ARTIFACT zig