ziex 0.1.0-dev.864 → 0.1.0-dev.866

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/bin/ziex +61 -0
  2. package/install.cjs +218 -0
  3. package/package.json +16 -1
package/bin/ziex ADDED
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+
3
+ // Stub that delegates to the native zx binary.
4
+ // The postinstall script copies it to bin/zx, but if that hasn't run
5
+ // (e.g. bunx), we resolve the platform package's binary directly.
6
+
7
+ import { execFileSync } from "child_process";
8
+ import { existsSync } from "fs";
9
+ import { createRequire } from "module";
10
+ import { dirname, join } from "path";
11
+ import { fileURLToPath } from "url";
12
+
13
+ const __dirname = dirname(fileURLToPath(import.meta.url));
14
+ const require = createRequire(import.meta.url);
15
+ const isWindows = process.platform === "win32";
16
+ const ext = isWindows ? ".exe" : "";
17
+
18
+ function findBinary() {
19
+ // 1. Check if postinstall already placed the binary
20
+ const localBin = join(__dirname, `zx${ext}`);
21
+ if (existsSync(localBin)) return localBin;
22
+
23
+ // 2. Resolve from the platform-specific optional dependency
24
+ const platformPkgs = {
25
+ "darwin-arm64": "@ziex/cli-darwin-arm64",
26
+ "darwin-x64": "@ziex/cli-darwin-x64",
27
+ "linux-x64": "@ziex/cli-linux-x64",
28
+ "linux-arm64": "@ziex/cli-linux-arm64",
29
+ "win32-x64": "@ziex/cli-win32-x64",
30
+ "win32-arm64": "@ziex/cli-win32-arm64",
31
+ };
32
+
33
+ const pkg = platformPkgs[`${process.platform}-${process.arch}`];
34
+ if (pkg) {
35
+ try {
36
+ const pkgDir = dirname(require.resolve(`${pkg}/package.json`));
37
+ const bin = join(pkgDir, "bin", `zx${ext}`);
38
+ if (existsSync(bin)) return bin;
39
+ } catch {}
40
+ }
41
+
42
+ return null;
43
+ }
44
+
45
+ const bin = findBinary();
46
+ if (!bin) {
47
+ console.error(
48
+ "Error: ziex native binary not found. The postinstall script may not have run.",
49
+ );
50
+ console.error("Try reinstalling: npm install -g ziex");
51
+ process.exit(1);
52
+ }
53
+
54
+ try {
55
+ execFileSync(bin, process.argv.slice(2), { stdio: "inherit" });
56
+ } catch (e) {
57
+ if (e.status !== undefined) {
58
+ process.exit(e.status);
59
+ }
60
+ throw e;
61
+ }
package/install.cjs ADDED
@@ -0,0 +1,218 @@
1
+ // Postinstall script for ziex npm package
2
+ // Resolves the native binary from platform-specific optionalDependencies
3
+ // or falls back to downloading from GitHub releases.
4
+
5
+ const { existsSync, mkdirSync, copyFileSync, chmodSync, createWriteStream, unlinkSync } = require("fs");
6
+ const { execSync } = require("child_process");
7
+ const path = require("path");
8
+ const https = require("https");
9
+ const { createGunzip } = require("zlib");
10
+
11
+ const PLATFORM_MAP = {
12
+ darwin: {
13
+ arm64: { pkg: "@ziex/cli-darwin-arm64", target: "macos-aarch64" },
14
+ x64: { pkg: "@ziex/cli-darwin-x64", target: "macos-x64" },
15
+ },
16
+ linux: {
17
+ x64: { pkg: "@ziex/cli-linux-x64", target: "linux-x64" },
18
+ arm64: { pkg: "@ziex/cli-linux-arm64", target: "linux-aarch64" },
19
+ },
20
+ win32: {
21
+ x64: { pkg: "@ziex/cli-win32-x64", target: "windows-x64" },
22
+ arm64: { pkg: "@ziex/cli-win32-arm64", target: "windows-aarch64" },
23
+ },
24
+ };
25
+
26
+ const GITHUB_REPO = "ziex-dev/ziex";
27
+
28
+ function getPlatformInfo() {
29
+ const os = process.platform;
30
+ const arch = process.arch;
31
+ const info = PLATFORM_MAP[os]?.[arch];
32
+ if (!info) {
33
+ throw new Error(`Unsupported platform: ${os}-${arch}`);
34
+ }
35
+ return info;
36
+ }
37
+
38
+ function getVersion() {
39
+ const pkg = require("./package.json");
40
+ return pkg.version;
41
+ }
42
+
43
+ function getBinaryName(target) {
44
+ const isWindows = process.platform === "win32";
45
+ return `zx-${target}${isWindows ? ".exe" : ""}`;
46
+ }
47
+
48
+ function getOutputPath() {
49
+ const binDir = path.join(__dirname, "bin");
50
+ const isWindows = process.platform === "win32";
51
+ return path.join(binDir, isWindows ? "zx.exe" : "zx");
52
+ }
53
+
54
+ // Try to resolve binary from optionalDependencies
55
+ function tryResolveFromOptionalDep(pkgName) {
56
+ try {
57
+ const pkgPath = require.resolve(`${pkgName}/package.json`);
58
+ const pkgDir = path.dirname(pkgPath);
59
+ const pkgJson = require(pkgPath);
60
+ const binName = pkgJson.bin?.zx || pkgJson.bin?.ziex;
61
+ if (binName) {
62
+ const binPath = path.join(pkgDir, binName);
63
+ if (existsSync(binPath)) {
64
+ return binPath;
65
+ }
66
+ }
67
+ // Fallback: look for the binary directly
68
+ const isWindows = process.platform === "win32";
69
+ const possibleNames = isWindows ? ["zx.exe"] : ["zx"];
70
+ for (const name of possibleNames) {
71
+ const candidate = path.join(pkgDir, "bin", name);
72
+ if (existsSync(candidate)) return candidate;
73
+ }
74
+ } catch {
75
+ // Package not installed
76
+ }
77
+ return null;
78
+ }
79
+
80
+ // Download from GitHub releases
81
+ function downloadFromGitHub(target, version) {
82
+ return new Promise((resolve, reject) => {
83
+ const isWindows = process.platform === "win32";
84
+ const ext = isWindows ? "zip" : "tar.gz";
85
+ const tag = version.startsWith("0.") ? `zx-v${version}` : `zx-v${version}`;
86
+ const url = `https://github.com/${GITHUB_REPO}/releases/download/${tag}/zx-${target}.${ext}`;
87
+ const latestUrl = `https://github.com/${GITHUB_REPO}/releases/latest/download/zx-${target}.${ext}`;
88
+
89
+ const binDir = path.join(__dirname, "bin");
90
+ mkdirSync(binDir, { recursive: true });
91
+ const archivePath = path.join(binDir, `zx-${target}.${ext}`);
92
+
93
+ console.log(`Downloading ziex binary for ${target}...`);
94
+
95
+ function download(downloadUrl, isRetry) {
96
+ const followRedirect = (url) => {
97
+ const proto = url.startsWith("https") ? https : require("http");
98
+ proto
99
+ .get(url, { headers: { "User-Agent": "ziex-npm" } }, (res) => {
100
+ if (res.statusCode >= 300 && res.statusCode < 400 && res.headers.location) {
101
+ followRedirect(res.headers.location);
102
+ return;
103
+ }
104
+ if (res.statusCode !== 200) {
105
+ if (!isRetry) {
106
+ // Retry with latest
107
+ download(latestUrl, true);
108
+ return;
109
+ }
110
+ reject(new Error(`Download failed with status ${res.statusCode}: ${downloadUrl}`));
111
+ return;
112
+ }
113
+
114
+ const file = createWriteStream(archivePath);
115
+ res.pipe(file);
116
+ file.on("finish", () => {
117
+ file.close(() => resolve(archivePath));
118
+ });
119
+ })
120
+ .on("error", reject);
121
+ };
122
+ followRedirect(downloadUrl);
123
+ }
124
+
125
+ download(url, false);
126
+ });
127
+ }
128
+
129
+ function extractTarGz(archivePath, targetBinaryName, outputPath) {
130
+ const binDir = path.dirname(outputPath);
131
+ // Use tar command (available on macOS and Linux)
132
+ execSync(`tar -xzf "${archivePath}" -C "${binDir}"`, { stdio: "pipe" });
133
+ const extractedPath = path.join(binDir, targetBinaryName);
134
+ if (existsSync(extractedPath)) {
135
+ copyFileSync(extractedPath, outputPath);
136
+ unlinkSync(extractedPath);
137
+ }
138
+ unlinkSync(archivePath);
139
+ }
140
+
141
+ function extractZip(archivePath, targetBinaryName, outputPath) {
142
+ const binDir = path.dirname(outputPath);
143
+ execSync(`unzip -o "${archivePath}" -d "${binDir}"`, { stdio: "pipe" });
144
+ const extractedPath = path.join(binDir, targetBinaryName);
145
+ if (existsSync(extractedPath)) {
146
+ copyFileSync(extractedPath, outputPath);
147
+ unlinkSync(extractedPath);
148
+ }
149
+ unlinkSync(archivePath);
150
+ }
151
+
152
+ async function main() {
153
+ const { pkg: pkgName, target } = getPlatformInfo();
154
+ const outputPath = getOutputPath();
155
+ const binDir = path.dirname(outputPath);
156
+ mkdirSync(binDir, { recursive: true });
157
+
158
+ // Step 1: Try to resolve from optional dependency
159
+ const resolvedPath = tryResolveFromOptionalDep(pkgName);
160
+ if (resolvedPath) {
161
+ console.log(`Found ziex binary from ${pkgName}`);
162
+ copyFileSync(resolvedPath, outputPath);
163
+ chmodSync(outputPath, 0o755);
164
+
165
+ // Create ziex alias (symlink or copy)
166
+ createAliases(outputPath);
167
+ return;
168
+ }
169
+
170
+ // Step 2: Download from GitHub releases
171
+ console.log(`Platform package ${pkgName} not found, downloading from GitHub...`);
172
+ try {
173
+ const version = getVersion();
174
+ const archivePath = await downloadFromGitHub(target, version);
175
+ const binaryName = getBinaryName(target);
176
+ const isWindows = process.platform === "win32";
177
+
178
+ if (isWindows) {
179
+ extractZip(archivePath, binaryName, outputPath);
180
+ } else {
181
+ extractTarGz(archivePath, binaryName, outputPath);
182
+ }
183
+
184
+ chmodSync(outputPath, 0o755);
185
+ createAliases(outputPath);
186
+ console.log("ziex binary installed successfully!");
187
+ } catch (err) {
188
+ console.error(`Failed to install ziex binary: ${err.message}`);
189
+ console.error("You can install it manually from: https://ziex.dev/install");
190
+ process.exit(1);
191
+ }
192
+ }
193
+
194
+ function createAliases(zxPath) {
195
+ const binDir = path.dirname(zxPath);
196
+ const isWindows = process.platform === "win32";
197
+ const ziexPath = path.join(binDir, isWindows ? "ziex.exe" : "ziex");
198
+
199
+ // The main binary is `zx`, create `ziex` as a copy/symlink
200
+ try {
201
+ if (existsSync(ziexPath) && ziexPath !== zxPath) unlinkSync(ziexPath);
202
+ if (ziexPath !== zxPath) {
203
+ try {
204
+ const fs = require("fs");
205
+ fs.symlinkSync(path.basename(zxPath), ziexPath);
206
+ } catch {
207
+ copyFileSync(zxPath, ziexPath);
208
+ }
209
+ }
210
+ } catch {
211
+ // Non-critical
212
+ }
213
+ }
214
+
215
+ main().catch((err) => {
216
+ console.error(err.message);
217
+ process.exit(1);
218
+ });
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "ziex",
3
- "version": "0.1.0-dev.864",
3
+ "version": "0.1.0-dev.866",
4
4
  "description": "ZX is a framework for building web applications with Zig.",
5
5
  "main": "index.js",
6
6
  "type": "module",
7
+ "bin": {
8
+ "ziex": "bin/ziex",
9
+ "zx": "bin/ziex"
10
+ },
7
11
  "exports": {
8
12
  ".": "./index.js",
9
13
  "./react": "./react/index.js",
@@ -32,6 +36,9 @@
32
36
  ],
33
37
  "author": "Nurul Huda (Apon) <me@nurulhudaapon.com>",
34
38
  "license": "MIT",
39
+ "scripts": {
40
+ "postinstall": "node install.cjs"
41
+ },
35
42
  "peerDependenciesMeta": {
36
43
  "react": {
37
44
  "optional": true
@@ -40,6 +47,14 @@
40
47
  "optional": true
41
48
  }
42
49
  },
50
+ "optionalDependencies": {
51
+ "@ziex/cli-darwin-arm64": "0.1.0-dev.805",
52
+ "@ziex/cli-darwin-x64": "0.1.0-dev.805",
53
+ "@ziex/cli-linux-x64": "0.1.0-dev.805",
54
+ "@ziex/cli-linux-arm64": "0.1.0-dev.805",
55
+ "@ziex/cli-win32-x64": "0.1.0-dev.805",
56
+ "@ziex/cli-win32-arm64": "0.1.0-dev.805"
57
+ },
43
58
  "module": "index.js",
44
59
  "types": "index.d.ts"
45
60
  }