3 Commits

Author SHA1 Message Date
Morten Olsen
b5d8cf3a51 feat: support multiple contexts 2024-01-12 15:31:44 +01:00
Morten Olsen
5154fbb4a5 ci: add NPM publish 2024-01-12 15:07:26 +01:00
Morten Olsen
59d6faaafc feat: switched from worker API to fs based 2024-01-12 14:35:16 +01:00
39 changed files with 283 additions and 69 deletions

View File

@@ -91,33 +91,33 @@ jobs:
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
# release-npm: release-npm:
# if: github.ref == 'refs/heads/main' if: github.ref == 'refs/heads/main'
# runs-on: ubuntu-latest runs-on: ubuntu-latest
# needs: [build, update-release-draft] needs: [build, update-release-draft]
# permissions: permissions:
# contents: read contents: read
# packages: write packages: write
# steps: steps:
# - uses: actions/checkout@v3 - uses: actions/checkout@v3
# with: with:
# fetch-depth: 0 fetch-depth: 0
# - run: corepack enable - run: corepack enable
# - uses: actions/setup-node@v3 - uses: actions/setup-node@v3
# with: with:
# cache: '${{ env.NODE_CACHE }}' cache: '${{ env.NODE_CACHE }}'
# node-version: '${{ env.NODE_VERSION }}' node-version: '${{ env.NODE_VERSION }}'
# scope: '${{ env.NODE_SCOPE }}' scope: '${{ env.NODE_SCOPE }}'
# - uses: actions/download-artifact@v3 - uses: actions/download-artifact@v3
# with: with:
# name: lib name: lib
# path: ./ path: ./
# - run: | - run: |
# pnpm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} pnpm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN}
# pnpm install pnpm install
# git config user.name "Github Actions Bot" git config user.name "Github Actions Bot"
# git config user.email "<>" git config user.email "<>"
# node scripts/set-version.ts $(git describe --tag --abbrev=0) node scripts/set-version.mjs $(git describe --tag --abbrev=0)
# pnpm publish -r --publish-branch main --access public --no-git-checks pnpm publish -r --publish-branch main --access public --no-git-checks
# env: env:
# NPM_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@@ -15,14 +15,19 @@ npm install -g @morten-olsen/mini-loader-cli
Now, let's write a basic script that outputs a single artifact named “hello”. Create a new file with the following JavaScript code: Now, let's write a basic script that outputs a single artifact named “hello”. Create a new file with the following JavaScript code:
```javascript ```javascript
import { artifacts } from "@morten-olsen/mini-loader"; import { artifacts } from '@morten-olsen/mini-loader';
artifacts.create('hello', 'world'); const run = async () => {
artifacts.create('hello', 'world');
};
run();
``` ```
Save this file as `script.mjs`. Save this file as `script.js`.
#### A Note on Dependencies #### A Note on Dependencies
In this script, we're using the `@morten-olsen/mini-loader` package, which might not be installed in your local environment. No worries though, as mini loader can automatically download necessary packages when preparing the script. Alternatively, for a more structured approach (especially if you're using TypeScript), you can initialize a Node.js project and install the dependencies for complete access to typings. In this script, we're using the `@morten-olsen/mini-loader` package, which might not be installed in your local environment. No worries though, as mini loader can automatically download necessary packages when preparing the script. Alternatively, for a more structured approach (especially if you're using TypeScript), you can initialize a Node.js project and install the dependencies for complete access to typings.
### Step 3: Run the Script Locally ### Step 3: Run the Script Locally
@@ -30,7 +35,7 @@ In this script, we're using the `@morten-olsen/mini-loader` package, which might
To validate that your script is functioning correctly, execute it locally using the following command: To validate that your script is functioning correctly, execute it locally using the following command:
```bash ```bash
mini-loader local run script.mjs -ai mini-loader local run script.js -ai
``` ```
The `-ai` flag instructs the CLI to automatically download any referenced packages when bundling the script. The `-ai` flag instructs the CLI to automatically download any referenced packages when bundling the script.
@@ -41,4 +46,4 @@ After running the command, you should see an output confirming that a new artifa
Congratulations on setting up and running your first script with mini loader! You're now ready to take the next step. Congratulations on setting up and running your first script with mini loader! You're now ready to take the next step.
[Next: Setting Up the Server](./setup-server.md) [Next: Setting Up the Server](./setup-server.md)

View File

@@ -1,6 +1,7 @@
{ {
"name": "@morten-olsen/mini-loader-repo", "name": "@morten-olsen/mini-loader-repo",
"private": "true", "private": "true",
"license": "GPL-3.0",
"packageManager": "pnpm@8.10.4", "packageManager": "pnpm@8.10.4",
"version": "1.0.0", "version": "1.0.0",
"scripts": { "scripts": {
@@ -11,7 +12,6 @@
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC",
"devDependencies": { "devDependencies": {
"@react-native-community/eslint-config": "^3.2.0", "@react-native-community/eslint-config": "^3.2.0",
"eslint": "^8.53.0", "eslint": "^8.53.0",
@@ -23,5 +23,10 @@
"@pnpm/find-workspace-packages": "^6.0.9", "@pnpm/find-workspace-packages": "^6.0.9",
"@types/node": "^20.10.8", "@types/node": "^20.10.8",
"ts-node": "^10.9.2" "ts-node": "^10.9.2"
},
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
} }
} }

1
packages/cli/README.md Normal file
View File

@@ -0,0 +1 @@
[Go to documentation](https://github.com/morten-olsen/mini-loader)

View File

@@ -3,6 +3,7 @@
"version": "1.0.0", "version": "1.0.0",
"main": "./dist/esm/index.js", "main": "./dist/esm/index.js",
"types": "./dist/esm/index.d.ts", "types": "./dist/esm/index.d.ts",
"license": "GPL-3.0",
"bin": { "bin": {
"mini-loader": "./bin/index.mjs" "mini-loader": "./bin/index.mjs"
}, },
@@ -41,5 +42,10 @@
"@morten-olsen/mini-loader-server": "workspace:^", "@morten-olsen/mini-loader-server": "workspace:^",
"@types/inquirer": "^9.0.7", "@types/inquirer": "^9.0.7",
"typescript": "^5.3.3" "typescript": "^5.3.3"
},
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
} }
} }

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const list = new Command('list'); const list = new Command('list');
@@ -21,7 +22,8 @@ list
.option('-a, --limit <limit>', 'Limit', '1000') .option('-a, --limit <limit>', 'Limit', '1000')
.action(async () => { .action(async () => {
const { runId, loadId, offset, limit } = list.opts(); const { runId, loadId, offset, limit } = list.opts();
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -4,6 +4,7 @@ import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { dirname, resolve } from 'path'; import { dirname, resolve } from 'path';
import { mkdir, writeFile } from 'fs/promises'; import { mkdir, writeFile } from 'fs/promises';
import { Config } from '../../config/config.js';
const pull = new Command('pull'); const pull = new Command('pull');
@@ -12,7 +13,8 @@ pull
.argument('<artifact-id>', 'Artifact ID') .argument('<artifact-id>', 'Artifact ID')
.argument('<file>', 'File to save') .argument('<file>', 'File to save')
.action(async (id, file) => { .action(async (id, file) => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const target = resolve(file); const target = resolve(file);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);

View File

@@ -3,6 +3,7 @@ import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import inquirer from 'inquirer'; import inquirer from 'inquirer';
import { Config } from '../../config/config.js';
const remove = new Command('remove'); const remove = new Command('remove');
@@ -22,7 +23,8 @@ remove
.option('-a, --limit <limit>', 'Limit', '1000') .option('-a, --limit <limit>', 'Limit', '1000')
.action(async () => { .action(async () => {
const { runId, loadId, offset, limit } = remove.opts(); const { runId, loadId, offset, limit } = remove.opts();
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -2,12 +2,14 @@ import { Command } from 'commander';
import inquerer from 'inquirer'; import inquerer from 'inquirer';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Config } from '../../config/config.js';
const login = new Command('login'); const login = new Command('login');
login.description('Login to your account'); login.description('Login to your account');
login.action(async () => { login.action(async () => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const { host, token } = await inquerer.prompt([ const { host, token } = await inquerer.prompt([
{ {
type: 'input', type: 'input',

View File

@@ -0,0 +1,10 @@
import { Command } from 'commander';
import { Config } from '../../config/config.js';
const current = new Command('current');
current.action(async () => {
const config = new Config();
console.log(config.context);
});
export { current };

View File

@@ -0,0 +1,11 @@
import { Command } from 'commander';
import { Context } from '../../context/context.js';
const list = new Command('list');
list.alias('ls').description('List contexts');
list.action(async () => {
const contexts = await Context.list();
console.table(contexts);
});
export { list };

View File

@@ -0,0 +1,12 @@
import { Command } from 'commander';
import { list } from './contexts.list.js';
import { use } from './contexts.use.js';
import { current } from './contexts.current.js';
const contexts = new Command('contexts');
contexts.description('Manage contexts');
contexts.addCommand(list);
contexts.addCommand(use);
contexts.addCommand(current);
export { contexts };

View File

@@ -0,0 +1,11 @@
import { Command } from 'commander';
import { Config } from '../../config/config.js';
const use = new Command('use');
use.argument('<name>').action(async (name) => {
const config = new Config();
await config.setContext(name);
});
export { use };

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const list = new Command('list'); const list = new Command('list');
@@ -9,7 +10,8 @@ list
.alias('ls') .alias('ls')
.description('List loads') .description('List loads')
.action(async () => { .action(async () => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -4,6 +4,7 @@ import { createClient } from '../../client/client.js';
import { bundle } from '../../bundler/bundler.js'; import { bundle } from '../../bundler/bundler.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const push = new Command('push'); const push = new Command('push');
@@ -15,7 +16,8 @@ push
.option('-ai, --auto-install', 'Auto install dependencies', false) .option('-ai, --auto-install', 'Auto install dependencies', false)
.action(async (script) => { .action(async (script) => {
const opts = push.opts(); const opts = push.opts();
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const location = resolve(script); const location = resolve(script);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const list = new Command('list'); const list = new Command('list');
@@ -23,7 +24,8 @@ list
.option('-s, --sort <order>', 'Sort', 'desc') .option('-s, --sort <order>', 'Sort', 'desc')
.action(async () => { .action(async () => {
const { runId, loadId, severities, offset, limit, order } = list.opts(); const { runId, loadId, severities, offset, limit, order } = list.opts();
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });
@@ -37,7 +39,7 @@ list
order, order,
}); });
}); });
console.table(logs.reverse()); console.table(logs);
}); });
export { list }; export { list };

View File

@@ -3,6 +3,7 @@ import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import inquirer from 'inquirer'; import inquirer from 'inquirer';
import { Config } from '../../config/config.js';
const remove = new Command('remove'); const remove = new Command('remove');
@@ -24,7 +25,8 @@ remove
.option('-s, --sort <order>', 'Sort', 'desc') .option('-s, --sort <order>', 'Sort', 'desc')
.action(async () => { .action(async () => {
const { runId, loadId, severities, offset, limit, order } = remove.opts(); const { runId, loadId, severities, offset, limit, order } = remove.opts();
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const create = new Command('create'); const create = new Command('create');
@@ -9,7 +10,8 @@ create
.description('Create a new run') .description('Create a new run')
.argument('load-id', 'Load ID') .argument('load-id', 'Load ID')
.action(async (loadId) => { .action(async (loadId) => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const list = new Command('list'); const list = new Command('list');
@@ -10,7 +11,8 @@ list
.description('Find a run') .description('Find a run')
.argument('[load-id]', 'Load ID') .argument('[load-id]', 'Load ID')
.action(async (loadId) => { .action(async (loadId) => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const list = new Command('list'); const list = new Command('list');
@@ -19,7 +20,8 @@ list
.option('-a, --limit <limit>', 'Limit', '1000') .option('-a, --limit <limit>', 'Limit', '1000')
.action(async () => { .action(async () => {
const { offset, limit } = list.opts(); const { offset, limit } = list.opts();
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const remove = new Command('remove'); const remove = new Command('remove');
@@ -9,7 +10,8 @@ remove
.alias('rm') .alias('rm')
.argument('<id>') .argument('<id>')
.action(async (id) => { .action(async (id) => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -2,6 +2,7 @@ import { Command } from 'commander';
import { createClient } from '../../client/client.js'; import { createClient } from '../../client/client.js';
import { step } from '../../utils/step.js'; import { step } from '../../utils/step.js';
import { Context } from '../../context/context.js'; import { Context } from '../../context/context.js';
import { Config } from '../../config/config.js';
const set = new Command('set'); const set = new Command('set');
@@ -9,7 +10,8 @@ set
.argument('<id>') .argument('<id>')
.argument('[value]') .argument('[value]')
.action(async (id, value) => { .action(async (id, value) => {
const context = new Context(); const config = new Config();
const context = new Context(config.context);
const client = await step('Connecting to server', async () => { const client = await step('Connecting to server', async () => {
return createClient(context); return createClient(context);
}); });

View File

@@ -0,0 +1,44 @@
import envPaths from 'env-paths';
import { existsSync, readFileSync, writeFileSync } from 'fs';
import { mkdir } from 'fs/promises';
import { join, dirname } from 'path';
type ConfigValues = {
context?: string;
};
class Config {
#location: string;
#config?: ConfigValues;
constructor() {
const paths = envPaths('mini-loader');
this.#location = join(paths.config, 'config.json');
if (existsSync(this.#location)) {
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
}
}
public get context() {
return this.#config?.context || 'default';
}
public setContext = (context: string) => {
this.#config = {
...(this.#config || {}),
context,
};
this.save();
};
public save = async () => {
if (!this.#config) {
return;
}
const json = JSON.stringify(this.#config);
mkdir(dirname(this.#location), { recursive: true });
writeFileSync(this.#location, json);
};
}
export { Config };

View File

@@ -1,7 +1,7 @@
import envPaths from 'env-paths'; import envPaths from 'env-paths';
import { existsSync, readFileSync, writeFileSync } from 'fs'; import { existsSync, readFileSync, writeFileSync } from 'fs';
import { mkdir } from 'fs/promises'; import { mkdir, readdir } from 'fs/promises';
import { dirname } from 'path'; import { dirname, join } from 'path';
type ContextValues = { type ContextValues = {
host: string; host: string;
@@ -12,9 +12,9 @@ class Context {
#location: string; #location: string;
#config?: ContextValues; #config?: ContextValues;
constructor() { constructor(name: string) {
const paths = envPaths('dws'); const paths = envPaths('mini-loader');
this.#location = paths.config; this.#location = join(paths.config, 'contexts', name);
if (existsSync(this.#location)) { if (existsSync(this.#location)) {
this.#config = JSON.parse(readFileSync(this.#location, 'utf-8')); this.#config = JSON.parse(readFileSync(this.#location, 'utf-8'));
} }
@@ -45,6 +45,15 @@ class Context {
mkdir(dirname(this.#location), { recursive: true }); mkdir(dirname(this.#location), { recursive: true });
writeFileSync(this.#location, json); writeFileSync(this.#location, json);
}; };
public static list = async () => {
const paths = envPaths('mini-loader');
const location = join(paths.config, 'contexts');
if (!existsSync(location)) {
return [];
}
return await readdir(location);
};
} }
export { Context }; export { Context };

View File

@@ -6,6 +6,7 @@ import { artifacts } from './commands/artifacts/artifacts.js';
import { secrets } from './commands/secrets/secrets.js'; import { secrets } from './commands/secrets/secrets.js';
import { local } from './commands/local/local.js'; import { local } from './commands/local/local.js';
import { auth } from './commands/auth/auth.js'; import { auth } from './commands/auth/auth.js';
import { contexts } from './commands/contexts/contexts.js';
program.addCommand(loads); program.addCommand(loads);
program.addCommand(runs); program.addCommand(runs);
@@ -14,5 +15,6 @@ program.addCommand(artifacts);
program.addCommand(secrets); program.addCommand(secrets);
program.addCommand(local); program.addCommand(local);
program.addCommand(auth); program.addCommand(auth);
program.addCommand(contexts);
await program.parseAsync(); await program.parseAsync();

View File

@@ -1,6 +1,7 @@
{ {
"name": "@morten-olsen/mini-loader-configs", "name": "@morten-olsen/mini-loader-configs",
"version": "1.0.0", "version": "1.0.0",
"private": true,
"description": "", "description": "",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
@@ -8,5 +9,10 @@
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
"license": "ISC" "license": "GPL-3.0",
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
}
} }

View File

@@ -1,6 +1,8 @@
{ {
"name": "@morten-olsen/mini-loader-examples", "name": "@morten-olsen/mini-loader-examples",
"version": "1.0.0", "version": "1.0.0",
"license": "GPL-3.0",
"private": true,
"main": "./dist/esm/index.js", "main": "./dist/esm/index.js",
"types": "./dist/esm/index.d.ts", "types": "./dist/esm/index.d.ts",
"scripts": { "scripts": {
@@ -21,5 +23,10 @@
"@morten-olsen/mini-loader": "workspace:^", "@morten-olsen/mini-loader": "workspace:^",
"@types/node": "^20.10.8", "@types/node": "^20.10.8",
"typescript": "^5.3.3" "typescript": "^5.3.3"
},
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
} }
} }

View File

@@ -1,5 +1,8 @@
import { artifacts, logger } from '@morten-olsen/mini-loader'; import { artifacts, logger } from '@morten-olsen/mini-loader';
await logger.info('Hello world'); const run = async () => {
await logger.info('Hello world');
await artifacts.create('foo', 'bar');
};
await artifacts.create('foo', 'bar'); run();

View File

@@ -0,0 +1 @@
[Go to documentation](https://github.com/morten-olsen/mini-loader)

View File

@@ -1,6 +1,7 @@
{ {
"name": "@morten-olsen/mini-loader", "name": "@morten-olsen/mini-loader",
"version": "1.0.0", "version": "1.0.0",
"license": "GPL-3.0",
"main": "./dist/esm/index.js", "main": "./dist/esm/index.js",
"types": "./dist/esm/index.d.ts", "types": "./dist/esm/index.d.ts",
"scripts": { "scripts": {
@@ -19,5 +20,10 @@
"@morten-olsen/mini-loader-configs": "workspace:^", "@morten-olsen/mini-loader-configs": "workspace:^",
"@types/node": "^20.10.8", "@types/node": "^20.10.8",
"typescript": "^5.3.3" "typescript": "^5.3.3"
},
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
} }
} }

View File

@@ -12,11 +12,9 @@ const connect = () =>
}); });
}); });
const connectionRequest = connect();
const send = async (data: any) => const send = async (data: any) =>
new Promise<void>(async (resolve, reject) => { new Promise<void>(async (resolve, reject) => {
const connection = await connectionRequest; const connection = await connect();
const cleaned = JSON.parse(JSON.stringify(data)); const cleaned = JSON.parse(JSON.stringify(data));
connection.write(JSON.stringify(cleaned), 'utf-8', (err) => { connection.write(JSON.stringify(cleaned), 'utf-8', (err) => {
if (err) { if (err) {

View File

@@ -0,0 +1 @@
[Go to documentation](https://github.com/morten-olsen/mini-loader)

View File

@@ -1,6 +1,7 @@
{ {
"name": "@morten-olsen/mini-loader-runner", "name": "@morten-olsen/mini-loader-runner",
"version": "1.0.0", "version": "1.0.0",
"license": "GPL-3.0",
"main": "./dist/esm/index.js", "main": "./dist/esm/index.js",
"types": "./dist/esm/index.d.ts", "types": "./dist/esm/index.d.ts",
"scripts": { "scripts": {
@@ -24,5 +25,10 @@
"dependencies": { "dependencies": {
"eventemitter3": "^5.0.1", "eventemitter3": "^5.0.1",
"nanoid": "^5.0.4" "nanoid": "^5.0.4"
},
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
} }
} }

View File

@@ -5,7 +5,7 @@ import { Event } from '@morten-olsen/mini-loader';
import { join } from 'path'; import { join } from 'path';
import { createServer } from 'http'; import { createServer } from 'http';
import { nanoid } from 'nanoid'; import { nanoid } from 'nanoid';
import { chmod, mkdir, unlink, writeFile } from 'fs/promises'; import { chmod, mkdir, rm, writeFile } from 'fs/promises';
type RunEvents = { type RunEvents = {
message: (event: Event) => void; message: (event: Event) => void;
@@ -39,9 +39,13 @@ const run = async ({ script, input, secrets }: RunOptions) => {
emitter.emit('message', message); emitter.emit('message', message);
}); });
}); });
server.listen(hostSocket);
const worker = new Worker(script, { const worker = new Worker(script, {
eval: true, eval: true,
stdin: false,
stdout: false,
stderr: false,
env: { env: {
HOST_SOCKET: hostSocket, HOST_SOCKET: hostSocket,
SECRETS: JSON.stringify(secrets), SECRETS: JSON.stringify(secrets),
@@ -52,18 +56,34 @@ const run = async ({ script, input, secrets }: RunOptions) => {
}, },
}); });
const promise = new Promise<void>((resolve, reject) => { worker.stdout?.on('data', (data) => {
worker.on('message', (message: Event) => { emitter.emit('message', {
emitter.emit('message', message); type: 'log',
payload: {
severity: 'info',
message: data.toString(),
},
}); });
});
worker.stderr?.on('data', (data) => {
emitter.emit('message', {
type: 'log',
payload: {
severity: 'error',
message: data.toString(),
},
});
});
const promise = new Promise<void>((resolve, reject) => {
worker.on('exit', async () => { worker.on('exit', async () => {
server.close(); server.close();
await unlink(hostSocket); await rm(dataDir, { recursive: true, force: true });
resolve(); resolve();
}); });
worker.on('error', async (error) => { worker.on('error', async (error) => {
server.close(); server.close();
await unlink(hostSocket);
reject(error); reject(error);
}); });
}); });

View File

@@ -0,0 +1 @@
[Go to documentation](https://github.com/morten-olsen/mini-loader)

View File

@@ -1,6 +1,7 @@
{ {
"name": "@morten-olsen/mini-loader-server", "name": "@morten-olsen/mini-loader-server",
"version": "1.0.0", "version": "1.0.0",
"license": "GPL-3.0",
"main": "./dist/esm/index.js", "main": "./dist/esm/index.js",
"types": "./dist/esm/index.d.ts", "types": "./dist/esm/index.d.ts",
"bin": { "bin": {
@@ -38,5 +39,10 @@
"sqlite3": "^5.1.7", "sqlite3": "^5.1.7",
"superjson": "^2.2.1", "superjson": "^2.2.1",
"zod": "^3.22.4" "zod": "^3.22.4"
},
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
} }
} }

View File

@@ -27,5 +27,9 @@ program.addCommand(createToken);
await program.parseAsync(process.argv); await program.parseAsync(process.argv);
process.on('unhandledRejection', (reason, p) => {
console.log('Unhandled Rejection at: Promise', p, 'reason:', reason);
});
export type { Runtime } from './runtime/runtime.js'; export type { Runtime } from './runtime/runtime.js';
export type { RootRouter } from './router/router.js'; export type { RootRouter } from './router/router.js';

View File

@@ -1,7 +1,9 @@
import { findWorkspacePackages } from '@pnpm/find-workspace-packages'; import { findWorkspacePackages } from '@pnpm/find-workspace-packages';
import { writeFile } from 'fs/promises'; import { readFile, writeFile } from 'fs/promises';
import { join } from 'path'; import { join } from 'path';
const sharedData = JSON.parse(await readFile(join(process.cwd(), 'scripts/shared-data.json')));
const version = process.argv[2]; const version = process.argv[2];
if (!version) { if (!version) {
throw new Error('Version is required'); throw new Error('Version is required');
@@ -11,6 +13,9 @@ const packages = await findWorkspacePackages(process.cwd());
for (const { manifest, dir } of packages) { for (const { manifest, dir } of packages) {
console.log(dir, version); console.log(dir, version);
for (let [key, value] of Object.entries(sharedData || {})) {
manifest[key] = value;
}
manifest.version = version; manifest.version = version;
await writeFile(join(dir, 'package.json'), JSON.stringify(manifest, null, 2)); await writeFile(join(dir, 'package.json'), JSON.stringify(manifest, null, 2));
} }

8
scripts/shared-data.json Normal file
View File

@@ -0,0 +1,8 @@
{
"license": "GPL-3.0",
"homepage": "https://github.com/morten-olsen/mini-loader",
"repository": {
"type": "git",
"url": "https://github.com/morten-olsen/mini-loader"
}
}