@lexjs/web 2.0.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.
Files changed (63) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +800 -0
  3. package/dist/actions/core-actions.js +6 -0
  4. package/dist/actions/npm-actions.js +38 -0
  5. package/dist/actions/permission-actions.js +21 -0
  6. package/dist/api/browser/browser.js +111 -0
  7. package/dist/api/browser/browser.types.js +1 -0
  8. package/dist/api/matchers/matchers.js +9 -0
  9. package/dist/api/site/site.js +248 -0
  10. package/dist/api/site/site.types.js +1 -0
  11. package/dist/api/utils/extract-protocol.js +10 -0
  12. package/dist/api/utils/remove-protocol.js +8 -0
  13. package/dist/api/utils/return-type-guard.js +7 -0
  14. package/dist/api/utils/slash.js +21 -0
  15. package/dist/command/args/config-args.js +9 -0
  16. package/dist/command/args/data-args.js +110 -0
  17. package/dist/command/args/invalid-args.js +11 -0
  18. package/dist/command/args/query-args.js +121 -0
  19. package/dist/command/args/validate-args.js +126 -0
  20. package/dist/command/options.js +58 -0
  21. package/dist/config/config-file.js +66 -0
  22. package/dist/config/config-flags.js +42 -0
  23. package/dist/config/file-editor.js +26 -0
  24. package/dist/config/handle-config.js +12 -0
  25. package/dist/constants.js +15 -0
  26. package/dist/create-app/main.js +121 -0
  27. package/dist/create-app/paths.js +24 -0
  28. package/dist/create-app/schema/base.json +21 -0
  29. package/dist/create-app/schema/browsers.json +60 -0
  30. package/dist/create-app/schema/sites.json +71 -0
  31. package/dist/create-app/script-contents.js +18 -0
  32. package/dist/create-app/tree.js +25 -0
  33. package/dist/data/app-data.js +12 -0
  34. package/dist/data/config-data.js +35 -0
  35. package/dist/data/defaults.js +22 -0
  36. package/dist/data/initial-sites.js +36 -0
  37. package/dist/data/sort-config-data.js +17 -0
  38. package/dist/helpers/find-browser.js +9 -0
  39. package/dist/helpers/find-config-item.js +23 -0
  40. package/dist/helpers/find-nested.js +24 -0
  41. package/dist/helpers/find-profile.js +11 -0
  42. package/dist/helpers/find-site.js +15 -0
  43. package/dist/helpers/get-browser-name.js +9 -0
  44. package/dist/helpers/get-query-profiles.js +34 -0
  45. package/dist/main.js +19 -0
  46. package/dist/query/get-profiles-config.js +10 -0
  47. package/dist/query/get-query-browsers.js +33 -0
  48. package/dist/query/get-query-sites.js +49 -0
  49. package/dist/query/get-urls.js +85 -0
  50. package/dist/query/open-urls.js +30 -0
  51. package/dist/query/print-query.js +24 -0
  52. package/dist/query/query.js +19 -0
  53. package/dist/types/arg.types.js +1 -0
  54. package/dist/types/config.types.js +1 -0
  55. package/dist/types/primitive.type.js +1 -0
  56. package/dist/types/query.types.js +1 -0
  57. package/dist/types/utility.types.js +1 -0
  58. package/dist/utils/get-package-info.js +10 -0
  59. package/dist/utils/logger.js +15 -0
  60. package/dist/utils/parse-data.js +15 -0
  61. package/dist/utils/transform-text.js +7 -0
  62. package/dist/utils/yaml-files.js +6 -0
  63. package/package.json +88 -0
@@ -0,0 +1,30 @@
1
+ import open from 'open';
2
+ import { queryArgs } from '../command/args/query-args.js';
3
+ import { getQueryProfiles } from '../helpers/get-query-profiles.js';
4
+ import { getQueryBrowsers } from './get-query-browsers.js';
5
+ const { dryrun, incognito } = queryArgs;
6
+ export function openUrls(urls) {
7
+ const browsers = getQueryBrowsers();
8
+ if (browsers.length === 0) {
9
+ if (!dryrun) {
10
+ Promise.all(urls.map((link) => {
11
+ open(link);
12
+ }));
13
+ }
14
+ return [];
15
+ }
16
+ const queries = browsers.map(([browser]) => ({
17
+ browser,
18
+ profiles: getQueryProfiles(browser).map(([profile]) => profile),
19
+ }));
20
+ if (!dryrun) {
21
+ Promise.all(browsers.map(([browserName, browser]) => {
22
+ const browserProfiles = getQueryProfiles(browserName);
23
+ browser.open(urls, {
24
+ profile: browserProfiles.map(([, profile]) => profile.directory),
25
+ incognito,
26
+ });
27
+ }));
28
+ }
29
+ return queries;
30
+ }
@@ -0,0 +1,24 @@
1
+ import chalk from 'chalk';
2
+ import { queryArgs } from '../command/args/query-args.js';
3
+ import { logger } from '../utils/logger.js';
4
+ import { capitalize } from '../utils/transform-text.js';
5
+ const { incognito, dryrun } = queryArgs;
6
+ export function printQuery(urls, browserQueries) {
7
+ if (dryrun) {
8
+ logger.warning('[no-execute]');
9
+ }
10
+ browserQueries.forEach((browserQuery) => {
11
+ const { browser, profiles } = browserQuery;
12
+ let browserInfo = logger.level.info(capitalize(browser));
13
+ if (profiles.length > 0) {
14
+ browserInfo += ` (${chalk.gray(profiles.join(', '))})`;
15
+ }
16
+ if (incognito) {
17
+ browserInfo += chalk.gray(' [private tab]');
18
+ }
19
+ logger(browserInfo);
20
+ });
21
+ urls.forEach((url) => {
22
+ logger(`> ${logger.level.success(url)}`);
23
+ });
24
+ }
@@ -0,0 +1,19 @@
1
+ import { validateArgs } from '../command/args/validate-args.js';
2
+ import { logger } from '../utils/logger.js';
3
+ import { getQuerySites } from './get-query-sites.js';
4
+ import { getUrls } from './get-urls.js';
5
+ import { openUrls } from './open-urls.js';
6
+ import { printQuery } from './print-query.js';
7
+ export function query() {
8
+ const errors = validateArgs();
9
+ if (errors.length > 0) {
10
+ errors.forEach((message) => {
11
+ logger(message);
12
+ });
13
+ return;
14
+ }
15
+ const sites = getQuerySites();
16
+ const urls = sites.map(([, site]) => getUrls(site)).flat();
17
+ const browserQueries = openUrls(urls);
18
+ printQuery(urls, browserQueries);
19
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as url from 'node:url';
4
+ import { parseData } from './parse-data.js';
5
+ export function getPackageInfo() {
6
+ const __dirname = url.fileURLToPath(new URL('.', import.meta.url));
7
+ const root = path.join(__dirname, '../../');
8
+ const json = fs.readFileSync(path.resolve(`${root}/package.json`), 'utf-8');
9
+ return parseData(json) ?? {};
10
+ }
@@ -0,0 +1,15 @@
1
+ /* eslint-disable no-console */
2
+ import chalk from 'chalk';
3
+ export const level = {
4
+ info: chalk.cyan,
5
+ success: chalk.green,
6
+ warning: chalk.yellow,
7
+ error: chalk.red,
8
+ };
9
+ const logger = console.log;
10
+ logger.level = level;
11
+ logger.info = (...args) => logger(level.info(...args));
12
+ logger.success = (...args) => logger(level.success(...args));
13
+ logger.warning = (...args) => logger(level.warning(...args));
14
+ logger.error = (...args) => logger(level.error(...args));
15
+ export { logger };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Returns parsed data of Result type
3
+ * or null if data string is empty or cannot be parsed
4
+ */
5
+ export function parseData(data) {
6
+ if (data == null || data === '') {
7
+ return null;
8
+ }
9
+ try {
10
+ return JSON.parse(data);
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ }
@@ -0,0 +1,7 @@
1
+ export function title(text) {
2
+ return `${text[0].toUpperCase()}${text.substring(1).toLowerCase()}`;
3
+ }
4
+ export function capitalize(text, delimiter = ' ') {
5
+ const tokens = text.split(delimiter);
6
+ return tokens.map((token) => title(token)).join(delimiter);
7
+ }
@@ -0,0 +1,6 @@
1
+ export function yamlFiles(fileName) {
2
+ const cond = fileName.endsWith('.yml');
3
+ const ext = cond ? /.yml$/ : /.yaml$/;
4
+ const replacer = cond ? '.yaml' : '.yml';
5
+ return [fileName, fileName.replace(ext, replacer)];
6
+ }
package/package.json ADDED
@@ -0,0 +1,88 @@
1
+ {
2
+ "name": "@lexjs/web",
3
+ "version": "2.0.0",
4
+ "description": "CLI for making browser web searches from the shell",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public",
8
+ "provenance": true
9
+ },
10
+ "scripts": {
11
+ "prepack": "npm run build",
12
+ "prebuild": "npm run ci && rimraf ./dist",
13
+ "build": "npm run compile && npm run import-alias",
14
+ "ci": "npm run check:style && npm run check:build",
15
+ "check:build": "npm run compile -- --noEmit",
16
+ "check:style": "npm run check:format && npm run check:lint",
17
+ "check:format": "prettier --check \"*.{js,cjs,mjs,ts,cts,mts}\" \"src/**/*.ts\"",
18
+ "check:lint": "eslint \"src/**/*.{js,ts}\"",
19
+ "compile": "tsc -p tsconfig.json",
20
+ "import-alias": "tsc-alias -p tsconfig.json",
21
+ "style": "npm run format && npm run lint",
22
+ "format": "prettier --write \"*.{js,cjs,mjs,ts,cts,mts}\" \"src/**/*.ts\"",
23
+ "lint": "npm run check:lint -- --fix",
24
+ "prepare": "husky"
25
+ },
26
+ "author": "Lex Borisoff <lex@borisoff.dev>",
27
+ "license": "ISC",
28
+ "repository": {
29
+ "type": "git",
30
+ "url": "git+https://github.com/LexBorisoff/web-search.git"
31
+ },
32
+ "homepage": "https://github.com/LexBorisoff/web-search/tree/main#readme",
33
+ "bugs": {
34
+ "url": "https://github.com/LexBorisoff/web-search/issues"
35
+ },
36
+ "bin": {
37
+ "create-lexjs-web": "dist/create-app/main.js"
38
+ },
39
+ "keywords": [
40
+ "cli",
41
+ "search",
42
+ "websearch",
43
+ "web-search",
44
+ "search-web",
45
+ "site-search",
46
+ "search-engine",
47
+ "browser-query",
48
+ "web-query",
49
+ "browser",
50
+ "google",
51
+ "chrome",
52
+ "firefox",
53
+ "edge",
54
+ "brave",
55
+ "sites"
56
+ ],
57
+ "files": [
58
+ "dist"
59
+ ],
60
+ "engines": {
61
+ "node": ">=16.10.0"
62
+ },
63
+ "dependencies": {
64
+ "@lexjs/filetree": "^3.0.0",
65
+ "@lexjs/prompts": "^1.2.1",
66
+ "chalk": "^5.3.0",
67
+ "dotenv": "^16.4.5",
68
+ "execa": "^9.6.1",
69
+ "js-yaml": "^5.2.1",
70
+ "open": "^10.2.0",
71
+ "type-fest": "^4.15.0",
72
+ "yargs": "^17.6.2"
73
+ },
74
+ "devDependencies": {
75
+ "@commitlint/cli": "^19.6.1",
76
+ "@commitlint/config-conventional": "^19.6.0",
77
+ "@lexjs/eslint": "^2.0.0",
78
+ "@types/node": "^24.13.3",
79
+ "@types/yargs": "^17.0.24",
80
+ "conventional-changelog-conventionalcommits": "^8.0.0",
81
+ "globals": "^15.14.0",
82
+ "husky": "^9.1.7",
83
+ "rimraf": "^6.0.1",
84
+ "semantic-release": "^25.0.3",
85
+ "tsc-alias": "^1.8.10",
86
+ "typescript": "^6.0.3"
87
+ }
88
+ }