@elysiumjs/hephaestus 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ $ bun run clean && bun run build:js && bun run build:ts
2
+ $ rimraf dist
3
+ $ bun build ./src/index.ts --outdir ./dist --target bun -e zod -e @elysiumjs/core --root ./src --minify
4
+ Bundled 15 modules in 13ms
5
+
6
+ index.js 8.27 KB (entry point)
7
+
8
+ $ tsc
package/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # @elysiumjs/hephaestus
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Initial release.
8
+ - Compilation and bundling utilities.
9
+ - Asset embedding support.
10
+ - Docker generation command.
11
+ - Cross-platform binary building.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # @elysiumjs/hephaestus
2
+
3
+ To install dependencies:
4
+
5
+ ```bash
6
+ bun install
7
+ ```
8
+
9
+ To run:
10
+
11
+ ```bash
12
+ bun run index.ts
13
+ ```
14
+
15
+ This project was created using `bun init` in bun v1.2.16. [Bun](https://bun.sh) is a fast all-in-one JavaScript runtime.
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ // @bun
2
+ var h=function(e,i,L,I){var c=arguments.length,n=c<3?i:I===null?I=Object.getOwnPropertyDescriptor(i,L):I,S;if(typeof Reflect==="object"&&typeof Reflect.decorate==="function")n=Reflect.decorate(e,i,L,I);else for(var T=e.length-1;T>=0;T--)if(S=e[T])n=(c<3?S(n):c>3?S(i,L,n):S(i,L))||n;return c>3&&n&&Object.defineProperty(i,L,n),n};var O=(e,i)=>{if(typeof Reflect==="object"&&typeof Reflect.metadata==="function")return Reflect.metadata(e,i)};import"@elysiumjs/core";import{Command as y,CommandArgumentType as q}from"@elysiumjs/core";import{join as F}from"path";var D={"linux-x64":"bun-linux-x64","linux-x64-baseline":"bun-linux-x64-baseline","linux-arm64":"bun-linux-arm64","darwin-x64":"bun-darwin-x64","darwin-arm64":"bun-darwin-arm64","windows-x64":"bun-windows-x64"};function R(e){return D[e]}function w(){let{platform:e,arch:i}=process;if(e==="linux"&&i==="x64")return"linux-x64";if(e==="linux"&&i==="arm64")return"linux-arm64";if(e==="darwin"&&i==="x64")return"darwin-x64";if(e==="darwin"&&i==="arm64")return"darwin-arm64";if(e==="win32"&&i==="x64")return"windows-x64";return"linux-x64"}function W(e,i){return i.startsWith("windows")?`${e}.exe`:e}class g{config;constructor(e){this.config=e}async build(e){let i=Date.now(),L=e??w(),I=W(this.config.output.name,L),c=F(this.config.output.dir,I),n=["bun","build",this.config.entry,"--compile","--outfile",c];if(this.config.build.minify)n.push("--minify");if(this.config.build.sourcemap)n.push("--sourcemap");if(e&&e!==w())n.push("--target",R(e));let S=Bun.spawn(n,{stdout:"pipe",stderr:"pipe"});if(await S.exited!==0){let B=await new Response(S.stderr).text();throw Error(`Build failed for ${L}: ${B}`)}let V=Bun.file(c).size;return{platform:L,outputPath:c,size:V,duration:Date.now()-i}}async buildAll(){let e=this.config.platforms;if(e.length===0)return[await this.build()];let i=[];for(let L of e)i.push(await this.build(L));return i}}import{join as J}from"path";import{z as s}from"zod";var r=s.enum(["linux-x64","linux-x64-baseline","linux-arm64","darwin-x64","darwin-arm64","windows-x64"]),N=s.object({entry:s.string().default("./src/index.ts"),output:s.object({name:s.string(),dir:s.string().default("./dist")}),platforms:s.array(r).default([]),build:s.object({minify:s.boolean().default(!0),sourcemap:s.boolean().default(!0),bytecode:s.boolean().default(!0),split:s.boolean().default(!1)}).default({}),assets:s.object({embed:s.array(s.string()).default([]),exclude:s.array(s.string()).default([])}).default({}),env:s.object({generateExample:s.boolean().default(!0)}).default({}),docker:s.object({enabled:s.boolean().default(!1),buildImage:s.string().default("oven/bun:1-alpine"),runtimeImage:s.string().default("alpine:3.19"),expose:s.array(s.number()).default([]),healthcheck:s.object({path:s.string().default("/health"),interval:s.string().default("30s")}).optional()}).optional(),release:s.object({include:s.array(s.string()).default([]),compress:s.enum(["zip","tar.gz"]).default("tar.gz")}).optional()});var v=["hephaestus.config.ts","hephaestus.config.js","hephaestus.config.json"];async function A(e=process.cwd()){for(let i of v){let L=J(e,i),I=Bun.file(L);if(await I.exists()){if(i.endsWith(".json")){let n=await I.json();return N.parse(n)}let c=await import(L);return N.parse(c.default??c)}}throw Error(`No Hephaestus config found. Create one of: ${v.join(", ")}`)}class Y extends y{constructor(){super(...arguments);this.allPlatforms=!1}static command="hephaestus:build";static description="Build the project into a standalone binary.";static dev=!0;async run(){try{let e=await A(),i=new g(e);if(this.allPlatforms){let L=this.spinner("Building for all platforms"),I=await i.buildAll();L.complete("Build completed"),this.newLine(),this.title("Build Results:");for(let c of I)this.info(`${c.platform}: ${c.outputPath} (${this.formatSize(c.size)}, ${c.duration}ms)`)}else{let L=this.platform,I=L?` for ${L}`:"",c=this.spinner(`Building${I}`),n=await i.build(L);c.complete("Build completed"),this.newLine(),this.success(`Built ${n.platform}: ${n.outputPath} (${this.formatSize(n.size)}, ${n.duration}ms)`)}}catch(e){this.trace(e,"Build failed"),process.exit(1)}}formatSize(e){if(e<1024)return`${e}B`;if(e<1048576)return`${(e/1024).toFixed(1)}KB`;return`${(e/1048576).toFixed(1)}MB`}}h([y.arg({name:"platform",required:!1,description:"Target platform for the build",type:q.ENUM,enum:["linux-x64","linux-x64-baseline","linux-arm64","darwin-x64","darwin-arm64","windows-x64"]}),O("design:type",typeof PlatformTarget==="undefined"?Object:PlatformTarget)],Y.prototype,"platform",void 0),h([y.arg({name:"all-platforms",required:!1,description:"Build for all configured platforms",type:q.BOOLEAN,default:!1}),O("design:type",Boolean)],Y.prototype,"allPlatforms",void 0),Y=h([y.register()],Y);import{join as X}from"path";import{Command as K}from"@elysiumjs/core";import{relative as Q}from"path";class p{config;constructor(e){this.config=e}async embed(){let e=await this.buildManifest();return this.generateLoader(e)}async buildManifest(){let e={},i=this.config.assets.embed;for(let L of i){let I=new Bun.Glob(L);for await(let c of I.scan({cwd:process.cwd(),absolute:!0})){if(this.isExcluded(c))continue;let n=await Bun.file(c).arrayBuffer(),S=Q(process.cwd(),c);e[S]={content:Buffer.from(n).toString("base64"),mimeType:this.getMimeType(c)}}}return e}isExcluded(e){return this.config.assets.exclude.some((i)=>{return new Bun.Glob(i).match(e)})}generateLoader(e){return`// Auto-generated by Hephaestus
3
+ const __assets__ = ${JSON.stringify(e,null,2)};
4
+
5
+ export function getAsset(path: string): Buffer | null {
6
+ const asset = __assets__[path];
7
+ if (!asset) return null;
8
+ return Buffer.from(asset.content, 'base64');
9
+ }
10
+
11
+ export function getAssetString(path: string): string | null {
12
+ const buffer = getAsset(path);
13
+ return buffer?.toString('utf-8') ?? null;
14
+ }
15
+
16
+ export function listAssets(): string[] {
17
+ return Object.keys(__assets__);
18
+ }
19
+ `}getMimeType(e){let i=e.split(".").pop()?.toLowerCase();return{html:"text/html",css:"text/css",js:"application/javascript",json:"application/json",png:"image/png",jpg:"image/jpeg",svg:"image/svg+xml"}[i??""]??"application/octet-stream"}}class x extends K{static command="hephaestus:embed";static description="Generate asset loader module from configured patterns.";static dev=!0;async run(){try{let e=this.spinner("Scanning and embedding assets"),i=await A(),I=await new p(i).embed(),c=X(i.output.dir,"__assets__.ts");await Bun.write(c,I),e.complete("Assets embedded successfully"),this.newLine(),this.success(`Asset loader generated: ${c}`)}catch(e){this.trace(e,"Asset embedding failed"),process.exit(1)}}}x=h([K.register()],x);import{Command as E,CommandArgumentType as G}from"@elysiumjs/core";import{mkdirSync as Z,writeFileSync as $}from"fs";import{join as M}from"path";class t{config;constructor(e){this.config=e}generate(e){Z(e,{recursive:!0});let i=this.renderDockerfile();$(M(e,"Dockerfile"),i)}renderDockerfile(){let e=this.config.docker?.buildImage??"oven/bun:1-alpine",i=this.config.docker?.runtimeImage??"alpine:3.19",L=this.config.output.name,I=this.config.docker?.expose??[],c=this.config.docker?.healthcheck;return`# Generated by Hephaestus
20
+ FROM ${e} AS builder
21
+ WORKDIR /app
22
+ COPY . .
23
+ RUN bun install --frozen-lockfile --production
24
+ RUN bun run build
25
+
26
+ FROM ${i}
27
+ WORKDIR /app
28
+ COPY --from=builder /app/dist/${L} /app/${L}
29
+ ${I.map((n)=>`EXPOSE ${n}`).join(`
30
+ `)}
31
+ ${c?`HEALTHCHECK --interval=${c.interval} CMD wget -qO- http://localhost:${I[0]??3000}${c.path} || exit 1`:""}
32
+ ENTRYPOINT ["./${L}"]
33
+ `}}class U extends E{constructor(){super(...arguments);this.output="."}static command="hephaestus:docker";static description="Generate a Dockerfile for the compiled binary.";static dev=!0;async run(){try{let e=await A();new t(e).generate(this.output),this.success(`Dockerfile generated in ${this.output}`)}catch(e){this.trace(e,"Dockerfile generation failed"),process.exit(1)}}}h([E.arg({name:"output",required:!1,description:"Output directory for the Dockerfile",type:G.STRING,default:"."}),O("design:type",String)],U.prototype,"output",void 0),U=h([E.register()],U);export{A as loadConfig,W as getOutputName,w as detectCurrentPlatform,R as bunTarget,r as PlatformTargetSchema,N as HephaestusConfigSchema,t as DockerGenerator,g as BinaryBuilder,p as AssetEmbedder};
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@elysiumjs/hephaestus",
3
+ "version": "0.2.0",
4
+ "license": "Apache-2.0",
5
+ "description": "Compilation and bundling utilities for Elysium.js apps.",
6
+ "private": false,
7
+ "author": "Workbud Technologies Inc.",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "https://github.com/workbud/elysium"
11
+ },
12
+ "keywords": [
13
+ "elysium",
14
+ "framework",
15
+ "web",
16
+ "api",
17
+ "typescript",
18
+ "builder",
19
+ "compilation",
20
+ "bun"
21
+ ],
22
+ "homepage": "https://github.com/workbud/elysium",
23
+ "module": "index.ts",
24
+ "type": "module",
25
+ "main": "dist/index.js",
26
+ "types": "dist/index.d.ts",
27
+ "scripts": {
28
+ "format": "prettier --write \"./src/**/*.ts\"",
29
+ "clean": "rimraf dist",
30
+ "build:js": "bun build ./src/index.ts --outdir ./dist --target bun -e zod -e @elysiumjs/core --root ./src --minify",
31
+ "build:ts": "tsc",
32
+ "build": "bun run clean && bun run build:js && bun run build:ts",
33
+ "test": "bun test",
34
+ "test:coverage": "bun test --coverage",
35
+ "typecheck": "tsc --noEmit",
36
+ "prepublishOnly": "bun run build"
37
+ },
38
+ "dependencies": {
39
+ "zod": "^3.23.0"
40
+ },
41
+ "devDependencies": {
42
+ "@elysiumjs/core": "workspace:*"
43
+ },
44
+ "peerDependencies": {
45
+ "@elysiumjs/core": "workspace:^"
46
+ }
47
+ }