This commit is contained in:
Code 2025-01-25 14:37:23 +01:00
parent 69d74a278d
commit 43889d28e9
49 changed files with 3099 additions and 32 deletions

4
packages/cache/.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/node_modules
/coverage
*.log
.DS_Store

4
packages/cache/.npmignore vendored Normal file
View File

@ -0,0 +1,4 @@
./docs
./scripts
./tests
./incoming

25
packages/cache/.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,25 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch Program - Tests:File",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/main.js",
"preLaunchTask": "tsc: build - tsconfig.json",
"outFiles": [
"${workspaceFolder}//**/*.js"
],
"args": [
"test",
"file"
]
}
]
}

9
packages/cache/LICENSE vendored Normal file
View File

@ -0,0 +1,9 @@
Copyright (c) <year> <owner> All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

15
packages/cache/README.md vendored Normal file
View File

@ -0,0 +1,15 @@
# OSR - Cache
- [-] Cross - OS - Storage
- [x] Namespaces
- [ ] API
- [ ] list
- [ ] purge
- [ ] pack / unpack (encrypted)
- [ ] move / cp - ns
## References
- [cacache - API](https://github.com/npm/cacache)
- [https://github.com/npm/ssri#integrity-stream](https://github.com/npm/ssri#integrity-stream)

3
packages/cache/dist/_cli.d.ts vendored Normal file
View File

@ -0,0 +1,3 @@
import { IOptions } from './options.js';
export declare const defaults: () => void;
export declare const sanitize: (argv: any) => IOptions | boolean;

39
packages/cache/dist/_cli.js vendored Normal file
View File

@ -0,0 +1,39 @@
import * as path from 'node:path';
import { sync as exists } from '@polymech/fs/exists';
import { logger } from './index.js';
// tweaks and handlers
export const defaults = () => {
// default command
const DefaultCommand = 'info';
if (process.argv.length === 2) {
process.argv.push(DefaultCommand);
}
// currently no default handler, display only :
process.on('unhandledRejection', (reason) => {
console.error('Unhandled rejection, reason: ', reason);
});
};
export const sanitize = (argv) => {
let ret = {
all: argv.all,
src: argv.src,
types: argv.types,
dst: argv.dst,
depth: argv.dept
};
if (argv.cwd) {
ret.cwd = path.resolve(argv.cwd);
if (!exists((ret.cwd))) {
logger.error(`Invalid working directory ${argv.cwd}`);
}
}
else {
ret.cwd = process.cwd();
}
ret = {
...ret,
...{ variables: {} }
};
return ret;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NsaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9fY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFBO0FBRWpDLE9BQU8sRUFBRSxJQUFJLElBQUksTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUE7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVuQyxzQkFBc0I7QUFDdEIsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEdBQUcsRUFBRTtJQUN6QixrQkFBa0I7SUFDbEIsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDO0lBQzlCLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELCtDQUErQztJQUMvQyxPQUFPLENBQUMsRUFBRSxDQUFDLG9CQUFvQixFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUU7UUFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLElBQVMsRUFBc0IsRUFBRTtJQUV0RCxJQUFJLEdBQUcsR0FBUTtRQUNYLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztRQUNiLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztRQUNiLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztRQUNqQixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7UUFDYixLQUFLLEVBQUMsSUFBSSxDQUFDLElBQUk7S0FDbEIsQ0FBQTtJQUVELElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ1gsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyQixNQUFNLENBQUMsS0FBSyxDQUFDLDZCQUE2QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUMxRCxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDSixHQUFHLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsR0FBRyxHQUFHO1FBQ0YsR0FBRyxHQUFHO1FBQ04sR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUU7S0FDdkIsQ0FBQTtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2YsQ0FBQyxDQUFDIn0=

View File

@ -0,0 +1,2 @@
import * as CLI from 'yargs';
export declare const register: (cli: CLI.Argv) => any;

32
packages/cache/dist/commands/info.js vendored Normal file
View File

@ -0,0 +1,32 @@
import * as path from 'path';
import { substitute } from '@polymech/core/strings';
import { CONFIG_DEFAULT, DEFAULT_ROOTS } from '@polymech/commons';
import { logger } from '../index.js';
import { defaults } from '../_cli.js';
const defaultOptions = (yargs) => {
return yargs.option('debug', {
default: 'false',
describe: 'debug messages'
}).option('env_key', {
default: 'OSR-CONFIG',
describe: 'Environment key to the config path'
});
};
let options = (yargs) => defaultOptions(yargs);
export const register = (cli) => {
return cli.command('user', 'User commands, call with <verb>', options, async (argv) => {
defaults();
if (argv.help) {
return;
}
const args = argv;
const config = CONFIG_DEFAULT(args.env_key);
const opts = {
verb: argv.verb,
src: path.resolve(substitute(args.src, DEFAULT_ROOTS)),
dst: path.resolve(args.dst)
};
logger.debug(`Reading OSR Config with key "${argv.env_key}"`, opts);
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5mby5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy9pbmZvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUVuRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRWpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFDcEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUVyQyxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsT0FBTyxFQUFFLE9BQU87UUFDaEIsUUFBUSxFQUFFLGdCQUFnQjtLQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtRQUNqQixPQUFPLEVBQUUsWUFBWTtRQUNyQixRQUFRLEVBQUUsb0NBQW9DO0tBQ2pELENBQUMsQ0FBQTtBQUNOLENBQUMsQ0FBQTtBQUNELElBQUksT0FBTyxHQUFHLENBQUMsS0FBZSxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDeEQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYSxFQUFFLEVBQUU7SUFDdEMsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxpQ0FBaUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLElBQW1CLEVBQUUsRUFBRTtRQUNqRyxRQUFRLEVBQUUsQ0FBQTtRQUNWLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQUMsT0FBTTtRQUFDLENBQUM7UUFDekIsTUFBTSxJQUFJLEdBQVEsSUFBSSxDQUFBO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDM0MsTUFBTSxJQUFJLEdBQUc7WUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN0RCxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1NBQzlCLENBQUE7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUE7SUFFdkUsQ0FBQyxDQUFDLENBQUE7QUFDTixDQUFDLENBQUEifQ==

View File

@ -0,0 +1,2 @@
import * as CLI from 'yargs';
export declare const register: (cli: CLI.Argv) => any;

50
packages/cache/dist/commands/test.js vendored Normal file
View File

@ -0,0 +1,50 @@
import * as path from 'path';
import { sync as read } from '@polymech/fs/read';
import { substitute } from '@polymech/core/strings';
import { DEFAULT_ROOTS } from '@polymech/commons';
import { logger } from '../index.js';
import { defaults } from '../_cli.js';
import { get_cached, set_cached } from '../lib/index.js';
const defaultOptions = (yargs) => {
return yargs.option('debug', {
default: 'false',
describe: 'debug messages'
}).option('verb', {
description: 'test verb : file|folder'
}).option('src', {
description: 'raw source file',
default: './tests/src.json'
}).option('dst', {
description: 'dst output path, supports XLS|CSV|HTML',
default: './tests/dst.json'
}).option('env_key', {
default: 'OSR-CONFIG',
describe: 'Environment key to the config path'
});
};
let options = (yargs) => defaultOptions(yargs);
export const register = (cli) => {
return cli.command('test <verb>', 'Test commands', options, async (argv) => {
defaults();
if (argv.help) {
return;
}
const args = argv;
const opts = {
verb: argv.verb,
src: path.resolve(substitute(args.src, DEFAULT_ROOTS)),
dst: path.resolve(substitute(args.dst, DEFAULT_ROOTS))
};
if (!opts.verb) {
logger.error('No verb specified');
return;
}
if (opts.verb === 'file') {
const src = read(opts.src, 'json');
const hashed = await get_cached(opts.src, { a: 1 }, 'tests');
const shashed = await set_cached(opts.src, { a: 1 }, 'tests', src);
}
logger.debug(`Reading OSR Config with key "${argv.env_key}"`, opts);
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy90ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLE1BQU0sbUJBQW1CLENBQUE7QUFDaEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFDckMsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUV4RCxNQUFNLGNBQWMsR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFO0lBQ3ZDLE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUU7UUFDekIsT0FBTyxFQUFFLE9BQU87UUFDaEIsUUFBUSxFQUFFLGdCQUFnQjtLQUM3QixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtRQUNkLFdBQVcsRUFBRSx5QkFBeUI7S0FDekMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLE9BQU8sRUFBRSxrQkFBa0I7S0FDOUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDYixXQUFXLEVBQUUsd0NBQXdDO1FBQ3JELE9BQU8sRUFBRSxrQkFBa0I7S0FDOUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUU7UUFDakIsT0FBTyxFQUFFLFlBQVk7UUFDckIsUUFBUSxFQUFFLG9DQUFvQztLQUNqRCxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUM7QUFFRixJQUFJLE9BQU8sR0FBRyxDQUFDLEtBQWUsRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBR3pELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQWEsRUFBRSxFQUFFO0lBQ3RDLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBbUIsRUFBRSxFQUFFO1FBRXRGLFFBQVEsRUFBRSxDQUFDO1FBQ1gsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUMxQixNQUFNLElBQUksR0FBUSxJQUFJLENBQUM7UUFFdkIsTUFBTSxJQUFJLEdBQUc7WUFDVCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN0RCxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN6RCxDQUFDO1FBRUYsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNiLE1BQU0sQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUNsQyxPQUFPO1FBQ1gsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUV2QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNuQyxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1lBQzVELE1BQU0sT0FBTyxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQ3RFLENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLGdDQUFnQyxJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMifQ==

1
packages/cache/dist/constants.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export declare const MODULE_NAME = "OSR-CACHE";

2
packages/cache/dist/constants.js vendored Normal file
View File

@ -0,0 +1,2 @@
export const MODULE_NAME = `OSR-CACHE`;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDIn0=

4
packages/cache/dist/index.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
export * from './lib/index.js';
export { sanitize } from './_cli.js';
export { MODULE_NAME } from './constants.js';
export declare const logger: any;

7
packages/cache/dist/index.js vendored Normal file
View File

@ -0,0 +1,7 @@
import { MODULE_NAME } from './constants.js';
export * from './lib/index.js';
import { createLogger } from '@polymech/log';
export { sanitize } from './_cli.js';
export { MODULE_NAME } from './constants.js';
export const logger = createLogger(MODULE_NAME);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzVDLGNBQWMsZ0JBQWdCLENBQUE7QUFDOUIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFBO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUM1QyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQVEsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFBIn0=

11
packages/cache/dist/lib/index.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
export declare const cache_path: (_namespace: string) => string;
export declare const fileAsBuffer: (path: string) => Buffer;
export declare const file_hash: (path: string, opts?: any, namespace?: string) => any;
export declare const object_hash: (opts?: any, namespace?: string) => any;
export declare const file_name_hash: (path: string, opts?: any, namespace?: string) => any;
export declare const set_cached: (path: string, opts: any, namespace: string, data: any, metadata?: any) => Promise<any>;
export declare const set_cached_object: (opts: any, namespace: string, data: any, metadata?: any) => Promise<any>;
export declare const get_cache_key: (path: string, opts?: any, namespace?: string) => Promise<any>;
export declare const get_cached: (path: string, opts?: any, namespace?: string) => Promise<any>;
export declare const get_cached_object: (opts?: any, namespace?: string) => Promise<any>;
export declare const get_path_cached: (path: string, opts?: any, namespace?: string) => Promise<any>;

150
packages/cache/dist/lib/index.js vendored Normal file

File diff suppressed because one or more lines are too long

2
packages/cache/dist/main.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
#!/usr/bin/env node
export {};

17
packages/cache/dist/main.js vendored Normal file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env node
import { defaults } from './_cli.js';
defaults();
import * as cli from 'yargs';
import { register as registerInfo } from './commands/info.js';
registerInfo(cli);
import { register as registerTest } from './commands/test.js';
registerTest(cli);
const argv = cli.argv;
if (argv.help) {
cli.showHelp();
process.exit();
}
else if (argv.v || argv.version) {
process.exit();
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9tYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQUMsUUFBUSxFQUFFLENBQUE7QUFDaEQsT0FBTyxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUE7QUFFNUIsT0FBTyxFQUFFLFFBQVEsSUFBSSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUNoRixPQUFPLEVBQUUsUUFBUSxJQUFJLFlBQVksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBRWhGLE1BQU0sSUFBSSxHQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFFM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDWixHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDZixPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbkIsQ0FBQztLQUFNLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ25CLENBQUMifQ==

5
packages/cache/dist/options.d.ts vendored Normal file
View File

@ -0,0 +1,5 @@
export * from './lib/index.js';
export interface IOptions {
}
export declare const clone: (obj: any) => any;
export declare const parse: (options: IOptions, argv: any) => IOptions;

15
packages/cache/dist/options.js vendored Normal file
View File

@ -0,0 +1,15 @@
export * from './lib/index.js';
export const clone = (obj) => {
if (null == obj || "object" != typeof obj)
return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr))
copy[attr] = obj[attr];
}
return copy;
};
export const parse = (options, argv) => {
return options;
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsZ0JBQWdCLENBQUE7QUFNOUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUU7SUFFekIsSUFBSSxJQUFJLElBQUksR0FBRyxJQUFJLFFBQVEsSUFBSSxPQUFPLEdBQUc7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUN0RCxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDN0IsS0FBSyxJQUFJLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDaEIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBaUIsRUFBRSxJQUFTLEVBQVksRUFBRTtJQUU1RCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUEifQ==

1
packages/cache/dist/types.d.ts vendored Normal file
View File

@ -0,0 +1 @@
export {};

2
packages/cache/dist/types.js vendored Normal file
View File

@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9

2258
packages/cache/package-lock.json generated vendored Normal file

File diff suppressed because it is too large Load Diff

46
packages/cache/package.json vendored Normal file
View File

@ -0,0 +1,46 @@
{
"name": "@polymech/osr-cache",
"description": "",
"version": "0.4.8",
"typings": "dist/index.d.ts",
"type": "module",
"publishConfig": {
"access": "public"
},
"bin": {
"osr-cache": "main.js"
},
"dependencies": {
"@polymech/commons": "link:..\\commons",
"@polymech/core": "link:..\\core",
"@polymech/fs": "link:..\\fs",
"@polymech/log": "link:..\\log",
"@types/node": "^22.10.2",
"cacache": "^18.0.3",
"md5": "^2.3.0",
"ssri": "^10.0.1",
"yargs": "^17.7.2"
},
"scripts": {
"test": "tsc; mocha --full-trace mocha \"spec/**/*.spec.js\"",
"test-with-coverage": "istanbul cover node_modules/.bin/_mocha -- 'spec/**/*.spec.js'",
"lint": "tslint --project=./tsconfig.json",
"build": "tsc -p .",
"dev": "tsc -p . --declaration -w",
"typings": "tsc --declaration",
"docs": "npx typedoc src/index.ts",
"dev-test-watch": "mocha-typescript-watch"
},
"homepage": "https://git.osr-plastic.org/osr-plastic/osr-cache",
"repository": {
"type": "git",
"url": "https://git.osr-plastic.org/osr-plastic/osr-cache"
},
"engines": {
"node": ">= 14.0.0"
},
"license": "BSD-3-Clause",
"keywords": [
"typescript"
]
}

3
packages/cache/scripts/link-dev.sh vendored Normal file
View File

@ -0,0 +1,3 @@
npm i ../core/
npm i ../fs/
npm i ../osr-cli-commons/

0
packages/cache/src/.gitignore vendored Normal file
View File

45
packages/cache/src/_cli.ts vendored Normal file
View File

@ -0,0 +1,45 @@
import * as path from 'node:path'
import { IOptions } from './options.js'
import { sync as exists } from '@polymech/fs/exists'
import { logger } from './index.js'
// tweaks and handlers
export const defaults = () => {
// default command
const DefaultCommand = 'info';
if (process.argv.length === 2) {
process.argv.push(DefaultCommand);
}
// currently no default handler, display only :
process.on('unhandledRejection', (reason: string) => {
console.error('Unhandled rejection, reason: ', reason);
});
};
export const sanitize = (argv: any): IOptions | boolean => {
let ret: any = {
all: argv.all,
src: argv.src,
types: argv.types,
dst: argv.dst,
depth:argv.dept
}
if (argv.cwd) {
ret.cwd = path.resolve(argv.cwd);
if (!exists((ret.cwd))) {
logger.error(`Invalid working directory ${argv.cwd}`);
}
} else {
ret.cwd = process.cwd();
}
ret = {
...ret,
...{ variables: {} }
}
return ret;
};

34
packages/cache/src/commands/info.ts vendored Normal file
View File

@ -0,0 +1,34 @@
import * as CLI from 'yargs'
import * as path from 'path'
import { substitute } from '@polymech/core/strings'
import { CONFIG_DEFAULT, DEFAULT_ROOTS } from '@polymech/commons'
import { logger } from '../index.js'
import { defaults } from '../_cli.js'
const defaultOptions = (yargs: CLI.Argv) => {
return yargs.option('debug', {
default: 'false',
describe: 'debug messages'
}).option('env_key', {
default: 'OSR-CONFIG',
describe: 'Environment key to the config path'
})
}
let options = (yargs: CLI.Argv) => defaultOptions(yargs)
export const register = (cli: CLI.Argv) => {
return cli.command('user', 'User commands, call with <verb>', options, async (argv: CLI.Arguments) => {
defaults()
if (argv.help) { return }
const args: any = argv
const config = CONFIG_DEFAULT(args.env_key)
const opts = {
verb: argv.verb,
src: path.resolve(substitute(args.src, DEFAULT_ROOTS)),
dst: path.resolve(args.dst)
}
logger.debug(`Reading OSR Config with key "${argv.env_key}"`, opts)
})
}

57
packages/cache/src/commands/test.ts vendored Normal file
View File

@ -0,0 +1,57 @@
import * as CLI from 'yargs'
import * as path from 'path'
import { sync as read } from '@polymech/fs/read'
import { substitute } from '@polymech/core/strings'
import { DEFAULT_ROOTS } from '@polymech/commons'
import { logger } from '../index.js'
import { defaults } from '../_cli.js'
import { get_cached, set_cached } from '../lib/index.js'
const defaultOptions = (yargs: CLI.Argv) => {
return yargs.option('debug', {
default: 'false',
describe: 'debug messages'
}).option('verb', {
description: 'test verb : file|folder'
}).option('src', {
description: 'raw source file',
default: './tests/src.json'
}).option('dst', {
description: 'dst output path, supports XLS|CSV|HTML',
default: './tests/dst.json'
}).option('env_key', {
default: 'OSR-CONFIG',
describe: 'Environment key to the config path'
});
};
let options = (yargs: CLI.Argv) => defaultOptions(yargs);
export const register = (cli: CLI.Argv) => {
return cli.command('test <verb>', 'Test commands', options, async (argv: CLI.Arguments) => {
defaults();
if (argv.help) { return; }
const args: any = argv;
const opts = {
verb: argv.verb,
src: path.resolve(substitute(args.src, DEFAULT_ROOTS)),
dst: path.resolve(substitute(args.dst, DEFAULT_ROOTS))
};
if (!opts.verb) {
logger.error('No verb specified');
return;
}
if (opts.verb === 'file') {
const src = read(opts.src, 'json');
const hashed = await get_cached(opts.src, { a: 1 }, 'tests')
const shashed = await set_cached(opts.src, { a: 1 }, 'tests', src)
}
logger.debug(`Reading OSR Config with key "${argv.env_key}"`, opts);
});
};

1
packages/cache/src/constants.ts vendored Normal file
View File

@ -0,0 +1 @@
export const MODULE_NAME = `OSR-CACHE`;

6
packages/cache/src/index.ts vendored Normal file
View File

@ -0,0 +1,6 @@
import { MODULE_NAME } from './constants.js'
export * from './lib/index.js'
import { createLogger } from '@polymech/log'
export { sanitize } from './_cli.js'
export { MODULE_NAME } from './constants.js'
export const logger: any = createLogger(MODULE_NAME)

158
packages/cache/src/lib/index.ts vendored Normal file
View File

@ -0,0 +1,158 @@
import { resolve, join } from 'path'
import * as ssri from 'ssri'
import { get as cache_get, put as cache_put } from 'cacache'
import { sync as exists } from '@polymech/fs/exists'
import { sync as mkdir } from '@polymech/fs/dir'
import { isString, isObject, isArray } from '@polymech/core/primitives'
import { OSR_CACHE } from '@polymech/commons'
import { sync as read } from '@polymech/fs/read'
import { logger } from '../index.js'
export const cache_path = (_namespace: string) => `${resolve(join(OSR_CACHE(), _namespace))}`
export const fileAsBuffer = (path: string) => read(path, 'buffer') as Buffer
export const file_hash = (path: string, opts: any = {}, namespace: string = "nons") => {
const hash = { ...opts, ns: namespace }
delete hash['debug']
delete hash['verbose']
const buffer = fileAsBuffer(path) as Buffer
const ibuffer = Buffer.concat([buffer, Buffer.from(JSON.stringify(hash))])
const ret = ssri.fromData(ibuffer).toString()
return ret
}
export const object_hash = (opts: any = {}, namespace: string = "nons") => {
const hash = { ...opts, ns: namespace }
const ibuffer = Buffer.concat([Buffer.from(JSON.stringify(hash))])
const ret = ssri.fromData(ibuffer).toString()
return ret
}
export const file_name_hash = (path: string, opts: any = {}, namespace: string = "nons") => {
const ibuffer = Buffer.concat([Buffer.from(path), Buffer.from(JSON.stringify({ ...opts, ns: namespace }))])
const ret = ssri.fromData(ibuffer).toString()
return ret
}
export const set_cached = async (path: string, opts: any = {}, namespace: string = "nons", data: any, metadata: any = {}) => {
const c_integrity = file_hash(path, opts, namespace)
const c_dir = cache_path(namespace)
if (!exists(c_dir)) {
mkdir(c_dir)
}
if (!Buffer.isBuffer(data)) {
if (!isString(data) && (isArray(data) || isObject(data))) {
data = JSON.stringify(data, null, 2)
}
}
return await cache_put(c_dir, c_integrity, data, {
metadata: {
path: path,
hash: c_integrity,
...metadata
}
})
}
export const set_cached_object = async (opts: any = {}, namespace: string = "nons", data: any, metadata: any = {}) => {
const c_integrity = object_hash(opts, namespace)
const c_dir = cache_path(namespace)
if (!exists(c_dir)) {
mkdir(c_dir)
}
if (!Buffer.isBuffer(data)) {
if (!isString(data) && (isArray(data) || isObject(data))) {
try {
data = JSON.stringify(data, null, 2)
} catch (e) {
logger.error(`osr-cache :: error serializing object: ${e}`, opts)
return false
}
}
}
return await cache_put(c_dir, c_integrity, data, {
metadata: {
hash: c_integrity,
...metadata
}
})
}
export const get_cache_key = async (path: string, opts: any = {}, namespace: string = "nons") => {
const c_integrity = file_hash(path, opts, namespace)
const c_dir = cache_path(namespace)
try {
const cached = await cache_get.info(c_dir, c_integrity)
if (cached) {
return cached
}
} catch (e) {
logger.error(e)
}
}
export const get_cached = async (path: string, opts: any = {}, namespace: string = "nons") => {
const c_integrity = file_hash(path, opts, namespace)
const c_dir = cache_path(namespace)
if (!exists(c_dir)) {
mkdir(c_dir)
}
let data: any
try {
const cached = await cache_get.info(c_dir, c_integrity)
if (cached) {
data = ((await cache_get(c_dir, c_integrity)).data as Buffer).toString()
}
} catch (e) {
logger.error(e)
}
return data
}
export const get_cached_object = async (opts: any = {}, namespace: string = "nons") => {
const c_integrity = object_hash(opts, namespace)
const c_dir = cache_path(namespace)
if (!exists(c_dir)) {
mkdir(c_dir)
}
let data: any
try {
const cached = await cache_get.info(c_dir, c_integrity)
if (cached) {
data = ((await cache_get(c_dir, c_integrity)).data as Buffer).toString()
}
} catch (e) {
logger.error(e)
}
if (data && isString(data)) {
try {
data = JSON.parse(data)
} catch (e) {
logger.error(`Error parsing cached object: ${e}`, opts)
}
}
return data
}
export const get_path_cached = async (path: string, opts: any = {}, namespace: string = "nons") => {
const c_integrity = file_hash(path, opts, namespace)
const c_dir = cache_path(namespace)
if (!exists(c_dir)) {
mkdir(c_dir)
}
let data: any
try {
const cached = await cache_get.info(c_dir, c_integrity)
if (cached) {
return cached.path
}
} catch (e) {
logger.error(e)
}
return data
}

15
packages/cache/src/main.ts vendored Normal file
View File

@ -0,0 +1,15 @@
#!/usr/bin/env node
import { defaults } from './_cli.js'; defaults()
import * as cli from 'yargs'
import { register as registerInfo } from './commands/info.js'; registerInfo(cli)
import { register as registerTest } from './commands/test.js'; registerTest(cli)
const argv: any = cli.argv;
if (argv.help) {
cli.showHelp();
process.exit();
} else if (argv.v || argv.version) {
process.exit();
}

20
packages/cache/src/options.ts vendored Normal file
View File

@ -0,0 +1,20 @@
export * from './lib/index.js'
export interface IOptions {
}
export const clone = (obj) => {
if (null == obj || "object" != typeof obj) return obj;
var copy = obj.constructor();
for (var attr in obj) {
if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
}
return copy;
}
export const parse = (options: IOptions, argv: any): IOptions => {
return options;
}

0
packages/cache/tests/dst.json vendored Normal file
View File

5
packages/cache/tests/src.json vendored Normal file
View File

@ -0,0 +1,5 @@
{
"number": 4,
"string": "foo",
"boolean": true
}

23
packages/cache/tsconfig.json vendored Normal file
View File

@ -0,0 +1,23 @@
{
"extends": "../typescript-config/base.json",
"include": [
"src/**/*.ts"
],
"files": [
"src/index.ts"
],
"compilerOptions": {
"strictNullChecks": false,
"allowJs": true,
"baseUrl": ".",
"declarationDir": "./dist",
"outDir": "./dist",
"inlineSourceMap": true,
"preserveConstEnums": true,
"paths": {
"@/*": [
"src/*"
]
}
},
}

12
packages/cache/tsup.config.ts vendored Normal file
View File

@ -0,0 +1,12 @@
import { defineConfig } from "tsup";
export default defineConfig((options) => ({
entryPoints: [
"src/*.ts"
],
format: ["cjs", "esm"],
dts: true,
sourcemap: true,
...options,
bundle: false
}));

View File

@ -1,4 +1,3 @@
export declare const GLOB_GROUP_PATTERN: RegExp;
export declare const UNC_REGEX: RegExp;
export declare const WIN32_PATH_REGEX: RegExp;
export declare const isFile: (src: string) => boolean;

View File

@ -1,22 +1,9 @@
import * as fs from 'fs';
// https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#namespaces
// https://github.com/isaacs/node-glob/blob/main/src/pattern.ts
export const GLOB_GROUP_PATTERN = /[!*+?@]\(.*\)/;
export const UNC_REGEX = /^[\\\/]{2,}[^\\\/]+[\\\/]+[^\\\/]+/;
export const WIN32_PATH_REGEX = /^([a-z]:)?[\\\/]/i;
import { is_windows } from './os.js';
/*
const parseGlob = require('parse-glob')
export const getExtensions = (glob: string) => {
const match = glob.match(GLOB_GROUP_PATTERN);
if (match) {
return glob.substring((match.index || 0) + 2, glob.lastIndexOf(')')).split('|')
} else {
return [parseGlob(glob).path.ext]
}
}
*/
export const isFile = (src) => {
let srcIsFile = false;
try {
@ -46,4 +33,4 @@ const is_absolute_win32 = (fp) => {
return !is_relative_win32(fp);
};
export const is_absolute = (fp) => is_windows() ? is_absolute_win32(fp) : is_absolute_posix(fp);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFFeEIsa0ZBQWtGO0FBQ2xGLCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxlQUFlLENBQUE7QUFDakQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLG9DQUFvQyxDQUFBO0FBQzdELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLG1CQUFtQixDQUFBO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUE7QUFFcEM7Ozs7Ozs7Ozs7O0VBV0U7QUFFRixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtJQUNsQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsSUFBSTtRQUNBLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0tBQ3pDO0lBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztJQUNmLE9BQU8sU0FBUyxDQUFBO0FBQ3BCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO0lBQ3BDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJO1FBQ0EsV0FBVyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7S0FDaEQ7SUFBQyxPQUFPLENBQUMsRUFBRSxHQUFHO0lBQ2YsT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFBO0FBQ3RELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQzlFLE9BQU8sSUFBSSxDQUFBO0tBQ2Q7SUFDRCxvQ0FBb0M7SUFDcEMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNqQyxDQUFDLENBQUE7QUFDRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUEifQ==
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUE7QUFFeEIsa0ZBQWtGO0FBQ2xGLCtEQUErRDtBQUUvRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsb0NBQW9DLENBQUE7QUFDN0QsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUE7QUFFbkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQTtBQUdwQyxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtJQUNsQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDdEIsSUFBSTtRQUNBLFNBQVMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFBO0tBQ3pDO0lBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztJQUNmLE9BQU8sU0FBUyxDQUFBO0FBQ3BCLENBQUMsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO0lBQ3BDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJO1FBQ0EsV0FBVyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7S0FDaEQ7SUFBQyxPQUFPLENBQUMsRUFBRSxHQUFHO0lBQ2YsT0FBTyxXQUFXLENBQUM7QUFDdkIsQ0FBQyxDQUFBO0FBRUQsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ25GLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFBO0FBQ3RELE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUM3QixJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQzlFLE9BQU8sSUFBSSxDQUFBO0tBQ2Q7SUFDRCxvQ0FBb0M7SUFDcEMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUM7S0FDZjtJQUNELE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtBQUNqQyxDQUFDLENBQUE7QUFDRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUEifQ==

View File

@ -261,3 +261,4 @@ export interface IDiscourseUser {
post_count: number;
}
export * from './types_kbot.js';
export * from './types_common.js';

View File

@ -1,2 +1,3 @@
export * from './types_kbot.js';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeVdJLGNBQWMsaUJBQWlCLENBQUEifQ==
export * from './types_common.js';
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeVdJLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyxtQkFBbUIsQ0FBQSJ9

View File

@ -2,24 +2,12 @@ import * as fs from 'fs'
// https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#namespaces
// https://github.com/isaacs/node-glob/blob/main/src/pattern.ts
export const GLOB_GROUP_PATTERN = /[!*+?@]\(.*\)/
export const UNC_REGEX = /^[\\\/]{2,}[^\\\/]+[\\\/]+[^\\\/]+/
export const WIN32_PATH_REGEX = /^([a-z]:)?[\\\/]/i
import { is_windows } from './os.js'
/*
const parseGlob = require('parse-glob')
export const getExtensions = (glob: string) => {
const match = glob.match(GLOB_GROUP_PATTERN);
if (match) {
return glob.substring((match.index || 0) + 2, glob.lastIndexOf(')')).split('|')
} else {
return [parseGlob(glob).path.ext]
}
}
*/
export const isFile = (src: string) => {
let srcIsFile = false;

View File

@ -360,5 +360,6 @@ export interface IDiscourseUser {
}
export * from './types_kbot.js'
export * from './types_common.js'

View File

@ -18,6 +18,10 @@
"./exists": {
"import": "./dist/exists.js",
"require": "./dist/exists.cjs"
},
"./dir": {
"import": "./dist/dir.js",
"require": "./dist/dir.cjs"
}
},
"dependencies": {

File diff suppressed because one or more lines are too long

View File

@ -15,6 +15,7 @@
"@polymech/core": "link:..\\core",
"@polymech/fs": "link:..\\fs",
"@polymech/log": "link:..\\log",
"@polymech/osr-cache": "link:..\\cache",
"@types/html-minifier-terser": "^7.0.2",
"@types/node": "^20.14.9",
"axios": "^1.7.9",

View File

@ -1,7 +1,7 @@
import * as path from 'path'
import { JSONPath } from 'jsonpath-plus'
import { createHash } from 'crypto'
import { get_cached, set_cached } from '@polymech/osr-cache/lib'
import { get_cached, set_cached } from '@polymech/osr-cache'
import { OSR_CACHE } from '@polymech/commons'
import { CONFIG_DEFAULT } from '@polymech/commons'
import { resolve } from '@polymech/commons'