Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
cc85004
add deno.json for jsr publishing
bjesuiter Apr 3, 2025
bf2e5af
add "run" task to deno json
bjesuiter Apr 3, 2025
5eb58f2
add "exports" field in deno json
bjesuiter Apr 3, 2025
1776374
fix tasks section in deno.json
bjesuiter Apr 3, 2025
67d5239
add config import to deno.json
bjesuiter Apr 3, 2025
7e1eec7
add working example script
bjesuiter Apr 3, 2025
ef8ee09
add verification script for example
bjesuiter Apr 3, 2025
cef4794
use jsr std/encoding instead of older deno.land/x import
bjesuiter Apr 3, 2025
8ce57c6
reformat exportTextFn for better readability
bjesuiter Apr 3, 2025
6d53e75
overwrite example asset file
bjesuiter Apr 3, 2025
8f20d17
use new jsr based decodeBase64 in export_text file
bjesuiter Apr 3, 2025
9aab879
convert internal functions from lambda to real "function"
bjesuiter Apr 3, 2025
b06a538
use jsr:@std/encoding@~1.0.8 and direct imports in asset_builder inst…
bjesuiter Apr 3, 2025
49ba5dd
use parseArgs fn from jsr
bjesuiter Apr 3, 2025
0588c9c
modernize asset_builder.ts
bjesuiter Apr 3, 2025
dc4e857
add publishing commands
bjesuiter Apr 3, 2025
8347036
update license
bjesuiter Apr 3, 2025
9642894
set version to 1.0.4
bjesuiter Apr 3, 2025
3b11283
exclude the example folder from jsr publish
bjesuiter Apr 3, 2025
646fcd7
delete legacy deps.ts
bjesuiter Apr 3, 2025
a86f0ab
ignore ./asset_config.json.sample for publishing
bjesuiter Apr 3, 2025
f72e43f
rename file form confusing type.d.ts file to types.ts file
bjesuiter Apr 3, 2025
b99f614
add github actions publishing flow
bjesuiter Apr 3, 2025
2106837
trigger on new tags
bjesuiter Apr 3, 2025
da467db
add example script to test running this from jsr
bjesuiter Apr 3, 2025
8e8c624
improve readme and release version 1.0.5
bjesuiter Apr 3, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .github/workflows/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# .github/workflows/publish.yml

name: Publish

on:
push:
tags:
- '*'

jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # The OIDC ID token is used for authentication with JSR.
steps:
- uses: actions/checkout@v4
- run: npx jsr publish
1 change: 1 addition & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
MIT License

Copyright (c) 2024 Benjamin Jesuiter (for changes made to the original code, see github commit history)
Copyright (c) 2021 Octo

Permission is hereby granted, free of charge, to any person obtaining a copy
Expand Down
50 changes: 28 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,26 +1,29 @@
# asset_builder
Asset files (eg, text, image) bundle tool for Deno.
# Deno asset-builder for deno compile

# Install
Bundles asset files (eg, text, image) for deno compile into base64 encoded strings in a typescript file.
This TS file can be used with `deno compile` to load these assets at runtime.

```sh
deno install --allow-read https://deno.land/x/asset_builder/asset_builder.ts
# Usage - directly run from jsr

```sh
# Import config file from default ./assets_config.json.
asset_builder >> asset.ts
deno run --allow-read jsr:@codemonument/asset-builder >> asset.ts

# Set Import config file.
asset_builder --import-file my_assets_config.json >> asset.ts
deno run --allow-read jsr:@codemonument/asset-builder --import-file my_assets_config.json >> asset.ts
```

# Usage
# Usage - install as a global binary

```sh
# Import config file from default ./assets_config.json.
deno run --allow-read https://deno.land/x/asset_builder/asset_builder.ts >> asset.ts
# change the name for this binary by passing a different -n argument
deno install --global --allow-read -n asset-builder jsr:@codemonument/asset-builder

# Set Import config file.
deno run --allow-read https://deno.land/x/asset_builder/asset_builder.ts --import-file my_assets_config.json >> asset.ts
# Use default config (./assets_config.json)
asset-builder >> asset.ts

# Use a custom config file
asset-builder --import-file my_assets_config.json >> asset.ts
```

# Configuration
Expand All @@ -30,26 +33,29 @@ Write as follows.

```json
{
"files":[
{
"importPath": "./sample.txt",
"calledName": "sample-text"
}
]
"files": [
{
"importPath": "./sample.txt",
"calledName": "sample-text"
}
]
}
```

# Example of using bundled files

The file created by asset_builder is used as follows.

```ts
import asset from './asset.ts'
```ts
import asset from './asset.ts';

for (const [key, value] of Object.entries(asset.files)) {
console.log(`key: ${key}, extension: ${value.extension}, content: ${new TextDecoder().decode(value.content) }`);
console.log(
`key: ${key}, extension: ${value.extension}, content: ${new TextDecoder().decode(
value.content
)}`
);
}
// key: test-text, extension: txt, content: Hello World!!
// key: test-text2, extension: txt, content: Hello World!!
```

72 changes: 37 additions & 35 deletions asset_builder.ts
Original file line number Diff line number Diff line change
@@ -1,47 +1,49 @@
import { parse, encode, ImportTargetFile, ImportedFile, exportBundledObject } from "./deps.ts"
import {parseArgs} from '@std/cli/parse-args';
import {encodeBase64} from 'jsr:@std/encoding@~1.0.8';
import {exportBundledObject} from './src/export_text.ts';
import type {ImportedFile, ImportTargetFile} from './src/types.ts';

const parsedArgs = parse(Deno.args);
const parsedArgs = parseArgs(Deno.args);

const importFileName =
typeof parsedArgs["import-file"] === "string"
? parsedArgs["import-file"]
: "assets_config.json";
const assetsConfigFileName =
typeof parsedArgs['import-file'] === 'string' ? parsedArgs['import-file'] : 'assets_config.json';

let bundleList = "";
let assetsConfigString = '';

try {
const readFile = Deno.readTextFileSync(importFileName);
bundleList = readFile;
assetsConfigString = Deno.readTextFileSync(assetsConfigFileName);
} catch (error) {
if (error.name === "NotFound") {
console.error(
`Import Config file [${importFileName}] is not Found!!\nplease confirm.`
);
Deno.exit();
}
throw error;
if (error instanceof Deno.errors.NotFound) {
console.error(
`Assets Config file [${assetsConfigFileName}] is not Found!!\nPlease confirm path.`
);
Deno.exit();
}
throw error;
}

const bundleListArr: [ImportTargetFile] = JSON.parse(bundleList).files;

let bundledObject: { [key: string]: ImportedFile } = {};

bundleListArr.forEach((file) => {
try {
const content = encode(Deno.readFileSync(file.importPath));
const extension = file.importPath.split(".").slice(-1)[0];
bundledObject[`${file.calledName}`] = { content, extension };
} catch (error) {
if (error.name === "NotFound") {
console.error(
`Import file [${file.importPath}] is not Found!!\nplease confirm.`
);
Deno.exit();
}
throw error;
}
// The list of asset files to be bundled
const assetFilesList: [ImportTargetFile] = JSON.parse(assetsConfigString).files;

// The output object of bundled files
const bundledObject: {[key: string]: ImportedFile} = {};

assetFilesList.forEach(file => {
try {
const content = encodeBase64(Deno.readFileSync(file.importPath));
const extension = file.importPath.split('.').slice(-1)[0];
bundledObject[`${file.calledName}`] = {content, extension};
} catch (error) {
if (error instanceof Deno.errors.NotFound) {
console.error(
`Asset file [${file.importPath}] is not Found - Cannot bundle!!\nPlease confirm.`
);
Deno.exit();
}
throw error;
}
});

const exportText = exportBundledObject(bundledObject)
const exportText = exportBundledObject(bundledObject);

console.log(exportText);
23 changes: 23 additions & 0 deletions deno.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"name": "@codemonument/asset-builder",
"description": "Compiles assets into a assets.ts file for deno.compile - forked from https://deno.land/x/asset_builder",
"version": "1.0.5",
"exports": {
".": "./asset_builder.ts"
},
"exclude": [
"./example",
"./asset_config.json.sample"
],
"tasks": {
"example": "deno run --allow-read ./asset_builder.ts --import-file ./example/asset_config.json > ./example/asset.ts",
"verify-example": "deno run --allow-read ./example/verify.ts",
"dry": "deno publish --dry-run",
"deploy": "deno publish",
"example-jsr": "deno run --allow-read jsr:@codemonument/asset-builder --import-file example/asset_config.json > example/asset.ts"
},
"imports": {
"@std/cli": "jsr:@std/cli@^1.0.15",
"@std/encoding": "jsr:@std/encoding@^1.0.8"
}
}
27 changes: 27 additions & 0 deletions deno.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 0 additions & 4 deletions deps.ts

This file was deleted.

27 changes: 14 additions & 13 deletions example/asset.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
import { decode } from "https://deno.land/std@0.97.0/encoding/base64.ts";

const bundledObject = {
files:{
"test-text":{
content:decode("SGVsbG8gV29ybGQhIQ=="),
extension: "txt"
},
"test-text2":{
content:decode("SGVsbG8gV29ybGQhIQ=="),
extension: "txt"
import { decodeBase64 } from "jsr:@std/encoding@~1.0.8";

const bundledObject = {
files:{
"test-text":{
content:decodeBase64("SGVsbG8gV29ybGQhIQ=="),
extension: "txt"
},
"test-text2":{
content:decodeBase64("SGVsbG8gV29ybGQhIQ=="),
extension: "txt"
}
}
}
}
}
export default bundledObject;

export default bundledObject
File renamed without changes.
54 changes: 26 additions & 28 deletions src/export_text.ts
Original file line number Diff line number Diff line change
@@ -1,32 +1,30 @@
import { ImportedFile } from "./type.d.ts";
import type {ImportedFile} from './types.ts';

const exportText = (exportText: string) =>
`import { decode } from "https://deno.land/std@0.97.0/encoding/base64.ts";
function exportTextFn(exportText: string): string {
return `
import { decodeBase64 } from "jsr:@std/encoding@~1.0.8";

const bundledObject = {
files:{
${exportText}
}
}
export default bundledObject;
`;
}

const bundledObject = {
files:{
${exportText}
}
}
function exportObjectText(bundledObject: {[key: string]: ImportedFile}): string {
return Object.keys(bundledObject)
.map(
(key, index) =>
`${index > 0 ? ' ' : ''} "${key}":{\r\n content:decodeBase64("${
bundledObject[key].content
}"),\r\n extension: "${bundledObject[key].extension}"\r\n }`
)
.join(',\r\n');
}

export default bundledObject`;

const exportObjectText = (
bundledObject: { [key: string]: ImportedFile },
) => {
return Object.keys(bundledObject)
.map(
(key, index) =>
`${index>0 ? ' ':''} "${key}":{\r\n content:decode("${
bundledObject[key].content
}"),\r\n extension: "${bundledObject[key].extension}"\r\n }`,
)
.join(",\r\n");
};

export const exportBundledObject = (
bundledObject: { [key: string]: ImportedFile },
) => {
const tmp = exportObjectText(bundledObject);
return exportText(tmp);
export const exportBundledObject = (bundledObject: {[key: string]: ImportedFile}) => {
const tmp = exportObjectText(bundledObject);
return exportTextFn(tmp);
};
File renamed without changes.