@camera.ui/cli 0.0.1

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 (59) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/CONTRIBUTING.md +1 -0
  3. package/LICENSE.md +22 -0
  4. package/README.md +1 -0
  5. package/dist/commands/build.d.ts +1 -0
  6. package/dist/commands/build.js +158 -0
  7. package/dist/commands/build.js.map +1 -0
  8. package/dist/commands/create.d.ts +1 -0
  9. package/dist/commands/create.js +130 -0
  10. package/dist/commands/create.js.map +1 -0
  11. package/dist/commands/publish.d.ts +2 -0
  12. package/dist/commands/publish.js +128 -0
  13. package/dist/commands/publish.js.map +1 -0
  14. package/dist/index.d.ts +2 -0
  15. package/dist/index.js +33 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/types.d.ts +23 -0
  18. package/dist/types.js +2 -0
  19. package/dist/types.js.map +1 -0
  20. package/dist/utils/banners.d.ts +2 -0
  21. package/dist/utils/banners.js +19 -0
  22. package/dist/utils/banners.js.map +1 -0
  23. package/dist/utils/logger.d.ts +24 -0
  24. package/dist/utils/logger.js +91 -0
  25. package/dist/utils/logger.js.map +1 -0
  26. package/dist/utils/parser.d.ts +6 -0
  27. package/dist/utils/parser.js +151 -0
  28. package/dist/utils/parser.js.map +1 -0
  29. package/dist/utils/pjson.d.ts +2 -0
  30. package/dist/utils/pjson.js +10 -0
  31. package/dist/utils/pjson.js.map +1 -0
  32. package/dist/utils/pluginName.d.ts +6 -0
  33. package/dist/utils/pluginName.js +21 -0
  34. package/dist/utils/pluginName.js.map +1 -0
  35. package/dist/utils/sortDependencies.d.ts +1 -0
  36. package/dist/utils/sortDependencies.js +20 -0
  37. package/dist/utils/sortDependencies.js.map +1 -0
  38. package/dist/utils/templates.d.ts +7 -0
  39. package/dist/utils/templates.js +162 -0
  40. package/dist/utils/templates.js.map +1 -0
  41. package/dist/utils/utils.d.ts +10 -0
  42. package/dist/utils/utils.js +71 -0
  43. package/dist/utils/utils.js.map +1 -0
  44. package/package.json +74 -0
  45. package/templates/base/CHANGELOG.md +8 -0
  46. package/templates/base/CONTRIBUTING.md +1 -0
  47. package/templates/base/LICENSE.md +22 -0
  48. package/templates/base/README.md +1 -0
  49. package/templates/base/SECURITY.md +16 -0
  50. package/templates/base/config.schema.json +0 -0
  51. package/templates/base/package.eslint.json +4 -0
  52. package/templates/base/package.json +23 -0
  53. package/templates/base/package.prettier.json +3 -0
  54. package/templates/python/requirements.dev.txt +1 -0
  55. package/templates/python/requirements.txt +1 -0
  56. package/templates/python/src/main.py +56 -0
  57. package/templates/typescript/package.eslint.json +4 -0
  58. package/templates/typescript/package.json +6 -0
  59. package/templates/typescript/src/index.ts +45 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,8 @@
1
+ All notable changes to this project will be documented in this file.
2
+
3
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
4
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
5
+
6
+ ## [X.X.X] - ???
7
+
8
+ - Initial Release
@@ -0,0 +1 @@
1
+ # Contributing
package/LICENSE.md ADDED
@@ -0,0 +1,22 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2023-2024 seydx <dev@seydx.com>
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1 @@
1
+ # @camera.ui/cli
@@ -0,0 +1 @@
1
+ export declare function buildProject(): Promise<void>;
@@ -0,0 +1,158 @@
1
+ import AdmZip from 'adm-zip';
2
+ import { cp, mkdir, readdir, readFile, rm, stat, writeFile } from 'node:fs/promises';
3
+ import { resolve } from 'node:path';
4
+ import { rollup } from 'rollup';
5
+ import { logger } from '../utils/logger.js';
6
+ import { parseConfig } from '../utils/parser.js';
7
+ import { copyPath, detectLanguage, ensureDir, findFile } from '../utils/utils.js';
8
+ const REQUIRED_FILES = [
9
+ {
10
+ target: 'README.md',
11
+ pattern: /^readme\.md$/i,
12
+ },
13
+ {
14
+ target: 'LICENSE.md',
15
+ pattern: /^license(\.md)?$/i,
16
+ },
17
+ {
18
+ target: 'CHANGELOG.md',
19
+ pattern: /^changelog\.md$/i,
20
+ },
21
+ {
22
+ target: 'config.schema.json',
23
+ pattern: /^(config\.)?schema\.json$/i,
24
+ },
25
+ {
26
+ target: 'logo.png',
27
+ pattern: /^logo\.png$/i,
28
+ },
29
+ {
30
+ target: 'requirements.txt',
31
+ pattern: /^requirements\.txt$/i,
32
+ optional: true,
33
+ },
34
+ ];
35
+ async function copyStandardFiles(rootDir, outDir) {
36
+ logger.info('Copying standard files...');
37
+ for (const file of REQUIRED_FILES) {
38
+ const foundFile = await findFile(rootDir, file);
39
+ if (foundFile) {
40
+ await copyPath(rootDir, foundFile, outDir, file.target);
41
+ }
42
+ else if (!file.optional) {
43
+ logger.missingFile(file.target);
44
+ }
45
+ }
46
+ }
47
+ async function copyAdditionalFiles(rootDir, paths, outDir) {
48
+ logger.info('Copying additional files...');
49
+ for (const path of paths) {
50
+ await copyPath(rootDir, path, outDir);
51
+ }
52
+ }
53
+ async function processPackageJson(rootDir, outDir, external) {
54
+ try {
55
+ logger.info('Processing package.json...');
56
+ const packageJsonPath = resolve(rootDir, 'package.json');
57
+ const packageJsonContent = await readFile(packageJsonPath, 'utf-8');
58
+ const packageJson = JSON.parse(packageJsonContent);
59
+ delete packageJson.devDependencies;
60
+ // delete packageJson.scripts;
61
+ if (packageJson.dependencies) {
62
+ const newDependencies = {};
63
+ for (const [dep, version] of Object.entries(packageJson.dependencies)) {
64
+ if (external.some((ext) => {
65
+ if (typeof ext === 'string') {
66
+ return dep === ext || dep.startsWith(`${ext}/`);
67
+ }
68
+ return ext.test(dep);
69
+ })) {
70
+ newDependencies[dep] = version;
71
+ }
72
+ }
73
+ if (Object.keys(newDependencies).length > 0) {
74
+ packageJson.dependencies = newDependencies;
75
+ }
76
+ else {
77
+ delete packageJson.dependencies;
78
+ }
79
+ }
80
+ if (!packageJson['camera.ui']) {
81
+ packageJson['camera.ui'] = {};
82
+ }
83
+ packageJson['camera.ui'].bundled = true;
84
+ const targetPath = resolve(outDir, 'package.json');
85
+ await writeFile(targetPath, JSON.stringify(packageJson, null, 2));
86
+ logger.success('Package.json processed');
87
+ }
88
+ catch (error) {
89
+ logger.error('Failed to process package.json');
90
+ throw error;
91
+ }
92
+ }
93
+ async function createBundleZip(bundleDir) {
94
+ try {
95
+ logger.info('Creating bundle archive...');
96
+ const tempDir = resolve(bundleDir, '.temp');
97
+ await mkdir(tempDir, { recursive: true });
98
+ const files = await readdir(bundleDir);
99
+ for (const file of files) {
100
+ if (file !== 'package.json' && file !== '.temp') {
101
+ await cp(resolve(bundleDir, file), resolve(tempDir, file), { recursive: true, force: true });
102
+ }
103
+ }
104
+ const zip = new AdmZip();
105
+ zip.addLocalFolder(tempDir);
106
+ zip.writeZip(resolve(bundleDir, 'bundle.zip'));
107
+ for (const file of files) {
108
+ if (file !== 'package.json' && file !== 'bundle.zip' && file !== '.temp') {
109
+ await rm(resolve(bundleDir, file), { recursive: true, force: true });
110
+ }
111
+ }
112
+ await rm(tempDir, { recursive: true, force: true });
113
+ const stats = await stat(resolve(bundleDir, 'bundle.zip'));
114
+ const sizeInMB = (stats.size / (1024 * 1024)).toFixed(2);
115
+ logger.success(`Created bundle.zip (${sizeInMB} MB)`);
116
+ }
117
+ catch (error) {
118
+ logger.error('Failed to create bundle archive');
119
+ throw error;
120
+ }
121
+ }
122
+ export async function buildProject() {
123
+ logger.startBuild();
124
+ const { rollupOptions, userConfig } = await parseConfig();
125
+ const outDir = resolve(rollupOptions.output.dir, '..');
126
+ const rootDir = userConfig.rootDir ? resolve(process.cwd(), userConfig.rootDir) : process.cwd();
127
+ const pluginLanguage = userConfig.language ?? (await detectLanguage(rootDir));
128
+ await rm(outDir, { recursive: true, force: true });
129
+ try {
130
+ if (pluginLanguage === 'python') {
131
+ await ensureDir(outDir);
132
+ await copyPath(rootDir, 'src', outDir);
133
+ }
134
+ else {
135
+ logger.startBundle();
136
+ const bundle = await rollup(rollupOptions);
137
+ logger.bundleCreated();
138
+ logger.startWrite();
139
+ const output = await bundle.write(rollupOptions.output);
140
+ logger.writeSuccess();
141
+ logger.outputFiles(output.output.map((o) => o.fileName));
142
+ await bundle.close();
143
+ }
144
+ await copyStandardFiles(rootDir, outDir);
145
+ if (userConfig.additionalFiles?.length) {
146
+ await copyAdditionalFiles(rootDir, userConfig.additionalFiles, outDir);
147
+ }
148
+ const external = Array.isArray(userConfig.external) ? userConfig.external : [];
149
+ await processPackageJson(rootDir, outDir, external);
150
+ await createBundleZip(outDir);
151
+ logger.buildSuccess(outDir);
152
+ }
153
+ catch (error) {
154
+ logger.buildError(error);
155
+ process.exit(1);
156
+ }
157
+ }
158
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function createProject(projectName: string): Promise<void>;
@@ -0,0 +1,130 @@
1
+ import chalk from 'chalk';
2
+ import { existsSync } from 'node:fs';
3
+ import { rm, writeFile } from 'node:fs/promises';
4
+ import { resolve } from 'node:path';
5
+ import prompts from 'prompts';
6
+ import { logger } from '../utils/logger.js';
7
+ import { isQualifiedPluginIdentifier, PLUGIN_IDENTIFIER, transformDisplaName } from '../utils/pluginName.js';
8
+ import { createBaseFiles, createCodeQualityConfig, createPackageJson, createPythonRequirements, createSourceFiles, createTsConfig } from '../utils/templates.js';
9
+ import { ensureDir } from '../utils/utils.js';
10
+ export async function createProject(projectName) {
11
+ if (!projectName) {
12
+ logger.error('Project name is required');
13
+ process.exit(1);
14
+ }
15
+ if (!isQualifiedPluginIdentifier(projectName)) {
16
+ projectName = 'camera-ui-' + projectName.replace(PLUGIN_IDENTIFIER, '').toLowerCase();
17
+ }
18
+ const targetDir = resolve(process.cwd(), projectName);
19
+ try {
20
+ const exists = existsSync(targetDir);
21
+ if (exists) {
22
+ const { action } = await prompts({
23
+ type: 'select',
24
+ name: 'action',
25
+ message: `Target directory "${projectName}" already exists. Pick an action:`,
26
+ choices: [
27
+ { title: 'Overwrite', value: 'overwrite' },
28
+ { title: 'Cancel', value: 'cancel' },
29
+ ],
30
+ });
31
+ if (action === 'cancel' || !action) {
32
+ logger.info('Operation cancelled');
33
+ process.exit(1);
34
+ }
35
+ if (action === 'overwrite') {
36
+ logger.info(`Removing existing directory: ${projectName}`);
37
+ await rm(targetDir, { recursive: true, force: true });
38
+ }
39
+ }
40
+ }
41
+ catch (err) {
42
+ logger.error(`Error checking directory: ${err.message}`);
43
+ process.exit(1);
44
+ }
45
+ const answers = await prompts([
46
+ {
47
+ type: 'text',
48
+ name: 'displayName',
49
+ message: 'Display name:',
50
+ initial: transformDisplaName(projectName),
51
+ },
52
+ {
53
+ type: 'select',
54
+ name: 'language',
55
+ message: 'Select programming language:',
56
+ choices: [
57
+ { title: 'JavaScript', value: 'javascript' },
58
+ { title: 'TypeScript', value: 'typescript' },
59
+ { title: 'Python', value: 'python' },
60
+ ],
61
+ },
62
+ {
63
+ type: (prev) => (prev === 'python' ? 'select' : null),
64
+ name: 'pythonVersion',
65
+ message: 'Select Python version:',
66
+ choices: [
67
+ { title: '3.9', value: '3.9' },
68
+ { title: '3.10', value: '3.10' },
69
+ { title: '3.11', value: '3.11' },
70
+ { title: '3.12', value: '3.12' },
71
+ ],
72
+ onRender(kleur) {
73
+ this.message = kleur.cyan('Select Python version:');
74
+ },
75
+ },
76
+ {
77
+ type: 'toggle',
78
+ name: 'quality',
79
+ message: (prev, values) => `Add ${values.language === 'python' ? 'ruff' : 'ESLint & Prettier'} for code quality?`,
80
+ initial: true,
81
+ },
82
+ {
83
+ type: 'select',
84
+ name: 'pluginType',
85
+ message: 'Select plugin type:',
86
+ choices: [
87
+ { title: 'Hub', value: 'hub' },
88
+ { title: 'Motion Detection', value: 'motionDetection' },
89
+ { title: 'Object Detection', value: 'objectDetection' },
90
+ { title: 'Audio Detection', value: 'audioDetection' },
91
+ { title: 'PTZ', value: 'ptz' },
92
+ ],
93
+ },
94
+ ], { onCancel: () => process.exit(1) });
95
+ if (!answers.language) {
96
+ logger.info('Operation cancelled');
97
+ process.exit(1);
98
+ }
99
+ try {
100
+ await ensureDir(targetDir);
101
+ logger.success(`Created project directory: ${projectName}`);
102
+ await createBaseFiles(targetDir, projectName, answers);
103
+ logger.success('Created base files');
104
+ const packageJson = createPackageJson(projectName, answers);
105
+ await writeFile(resolve(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));
106
+ logger.success('Created package.json');
107
+ if (answers.language === 'python') {
108
+ await createPythonRequirements(targetDir);
109
+ logger.success('Created requirements.txt');
110
+ }
111
+ if (answers.language === 'typescript') {
112
+ await createTsConfig(targetDir);
113
+ logger.success('Created tsconfig.json');
114
+ }
115
+ if (answers.quality) {
116
+ await createCodeQualityConfig(targetDir, answers);
117
+ logger.success('Created code quality configuration');
118
+ }
119
+ await createSourceFiles(targetDir, answers);
120
+ logger.buildSuccess(targetDir);
121
+ console.log('\nNext steps:');
122
+ console.log(chalk.cyan(` cd ${projectName}`));
123
+ console.log(chalk.cyan(' npm install'));
124
+ }
125
+ catch (err) {
126
+ logger.buildError(err);
127
+ process.exit(1);
128
+ }
129
+ }
130
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { PublishOptions } from '../types.js';
2
+ export declare function publishProject(options: PublishOptions): Promise<void>;
@@ -0,0 +1,128 @@
1
+ import { exec, spawn } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { writeFile } from 'node:fs/promises';
4
+ import { resolve } from 'node:path';
5
+ import { promisify } from 'node:util';
6
+ import prompts from 'prompts';
7
+ import semver from 'semver';
8
+ import { logger } from '../utils/logger.js';
9
+ const execAsync = promisify(exec);
10
+ function validateBundle() {
11
+ try {
12
+ const bundlePath = resolve(process.cwd(), 'bundle');
13
+ const packagePath = resolve(bundlePath, 'package.json');
14
+ const bundleZipPath = resolve(bundlePath, 'bundle.zip');
15
+ try {
16
+ const packageJson = JSON.parse(readFileSync(packagePath, 'utf-8'));
17
+ if (!packageJson['camera.ui']?.bundled) {
18
+ logger.error('Bundle not found. Please run "cui bundle" first.');
19
+ return false;
20
+ }
21
+ }
22
+ catch {
23
+ logger.error('package.json not found. Please run "cui bundle" first.');
24
+ return false;
25
+ }
26
+ try {
27
+ readFileSync(bundleZipPath);
28
+ }
29
+ catch {
30
+ logger.error('bundle.zip not found. Please run "cui bundle" first.');
31
+ return false;
32
+ }
33
+ return true;
34
+ }
35
+ catch (error) {
36
+ logger.error(`Validation failed: ${error.message}`);
37
+ return false;
38
+ }
39
+ }
40
+ async function validateVersion(name, version) {
41
+ if (!semver.valid(version)) {
42
+ logger.error('Invalid version format. Please use semver (e.g. 1.0.0)');
43
+ return false;
44
+ }
45
+ try {
46
+ const { stdout } = await execAsync(`npm view ${name} versions --json`);
47
+ const versions = JSON.parse(stdout);
48
+ if (versions.includes(version)) {
49
+ logger.error(`Version ${version} already exists`);
50
+ return false;
51
+ }
52
+ return true;
53
+ }
54
+ catch {
55
+ return true;
56
+ }
57
+ }
58
+ async function spawnPromise(command, args, cwd) {
59
+ return new Promise((resolve, reject) => {
60
+ const child = spawn(command, args, {
61
+ cwd,
62
+ stdio: 'inherit',
63
+ shell: true,
64
+ });
65
+ child.on('exit', (code) => {
66
+ if (code === 0) {
67
+ resolve();
68
+ }
69
+ else {
70
+ reject(new Error(`Process exited with code ${code}`));
71
+ }
72
+ });
73
+ child.on('error', (error) => {
74
+ reject(error);
75
+ });
76
+ });
77
+ }
78
+ export async function publishProject(options) {
79
+ if (!options.alpha && !options.beta && !options.latest) {
80
+ logger.error('Please specify a version to publish: --alpha, --beta, --latest');
81
+ process.exit(1);
82
+ }
83
+ if (!validateBundle()) {
84
+ process.exit(1);
85
+ }
86
+ const pJsonPath = resolve(process.cwd(), 'bundle', 'package.json');
87
+ const pJson = JSON.parse(readFileSync(pJsonPath, 'utf-8'));
88
+ const { name, version } = pJson;
89
+ const tag = options.alpha ? 'alpha' : options.beta ? 'beta' : options.latest ? 'latest' : 'latest';
90
+ const { targetVersion } = await prompts({
91
+ type: 'text',
92
+ name: 'targetVersion',
93
+ message: 'Version:',
94
+ initial: version,
95
+ validate: async (value) => (await validateVersion(name, value)) || 'Invalid version',
96
+ }, { onCancel: () => process.exit(1) });
97
+ const { action } = await prompts({
98
+ type: 'select',
99
+ name: 'action',
100
+ message: `Publishing ${name}@${targetVersion} (${tag}). Pick an action:`,
101
+ choices: [
102
+ { title: 'Publish', value: 'publish' },
103
+ { title: 'Cancel', value: 'cancel' },
104
+ ],
105
+ }, { onCancel: () => process.exit(1) });
106
+ if (action === 'cancel' || !action) {
107
+ logger.info('Operation cancelled');
108
+ process.exit(1);
109
+ }
110
+ if (action === 'publish') {
111
+ try {
112
+ logger.info('Updating package version...');
113
+ pJson.version = targetVersion;
114
+ await writeFile(pJsonPath, JSON.stringify(pJson, null, 2));
115
+ logger.info('Publishing to npm...');
116
+ process.env.SAFE_PUBLISH = 'true';
117
+ const args = ['publish', '--tag', tag, '--dry-run'];
118
+ await spawnPromise('npm', args, resolve(process.cwd(), 'bundle'));
119
+ logger.success(`Successfully published ${name}@${targetVersion}`);
120
+ }
121
+ catch (error) {
122
+ logger.error('Failed to publish package');
123
+ logger.error(error.message);
124
+ process.exit(1);
125
+ }
126
+ }
127
+ }
128
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { buildProject } from './commands/build.js';
4
+ import { createProject } from './commands/create.js';
5
+ import { publishProject } from './commands/publish.js';
6
+ import { initBanner } from './utils/banners.js';
7
+ import pJson from './utils/pjson.js';
8
+ const program = new Command();
9
+ initBanner();
10
+ program.name('cui').version(pJson.version);
11
+ program
12
+ .command('bundle')
13
+ .description('Bundle the project')
14
+ .action(async () => {
15
+ await buildProject();
16
+ });
17
+ program
18
+ .command('create <project-name>')
19
+ .description('Create a new camera.ui plugin project')
20
+ .action(async (name) => {
21
+ await createProject(name);
22
+ });
23
+ program
24
+ .command('publish')
25
+ .description('Publish the project to NPM')
26
+ .option('-a, --alpha', 'Publish an alpha version')
27
+ .option('-b, --beta', 'Publish a beta version')
28
+ .option('-l, --latest', 'Publish a latest version')
29
+ .action(async (options) => {
30
+ await publishProject(options);
31
+ });
32
+ program.parse(process.argv);
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,MAAM,kBAAkB,CAAC;AAErC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,UAAU,EAAE,CAAC;AAEb,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAE3C,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,oBAAoB,CAAC;KACjC,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,YAAY,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,4BAA4B,CAAC;KACzC,MAAM,CAAC,aAAa,EAAE,0BAA0B,CAAC;KACjD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;KAC9C,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC;KAClD,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;IACxB,MAAM,cAAc,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { CameraExtension, PythonVersion } from '@camera.ui/types';
2
+ import type { RollupOptions } from 'rollup';
3
+ export type PluginLanguage = 'python' | 'typescript' | 'javascript';
4
+ export interface CameraUiBuildOptions {
5
+ rootDir?: string;
6
+ input?: RollupOptions['input'];
7
+ mode?: 'development' | 'production';
8
+ additionalFiles?: string[];
9
+ external?: (string | RegExp)[];
10
+ language?: PluginLanguage;
11
+ }
12
+ export interface CreateOptions {
13
+ displayName: string;
14
+ language: PluginLanguage;
15
+ pythonVersion?: PythonVersion;
16
+ quality: boolean;
17
+ pluginType: CameraExtension;
18
+ }
19
+ export interface PublishOptions {
20
+ alpha?: boolean;
21
+ beta?: boolean;
22
+ latest?: boolean;
23
+ }
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export declare function initBanner(): void;
2
+ export declare function getBanner(): string;
@@ -0,0 +1,19 @@
1
+ import gradient from 'gradient-string';
2
+ const defaultBanner = 'camera.ui - CLI to create and manage camera.ui plugins';
3
+ const gradientBanner = gradient([
4
+ { color: '#df2a4c', pos: 0 },
5
+ { color: '#df2a4c', pos: 0.1 },
6
+ { color: '#e890a4', pos: 1 },
7
+ ])(defaultBanner);
8
+ function useGradient() {
9
+ return process.stdout.isTTY && process.stdout.getColorDepth() > 8;
10
+ }
11
+ export function initBanner() {
12
+ console.log();
13
+ console.log(useGradient() ? gradientBanner : defaultBanner);
14
+ console.log();
15
+ }
16
+ export function getBanner() {
17
+ return useGradient() ? gradientBanner : defaultBanner;
18
+ }
19
+ //# sourceMappingURL=banners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banners.js","sourceRoot":"","sources":["../../src/utils/banners.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AAEvC,MAAM,aAAa,GAAG,wDAAwD,CAAC;AAE/E,MAAM,cAAc,GAAG,QAAQ,CAAC;IAC9B,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE;IAC5B,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE;IAC9B,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,EAAE;CAC7B,CAAC,CAAC,aAAa,CAAC,CAAC;AAElB,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;AACxD,CAAC"}
@@ -0,0 +1,24 @@
1
+ declare class Logger {
2
+ private spinner;
3
+ private isSpinning;
4
+ info(message: string): void;
5
+ success(message: string): void;
6
+ warn(message: string): void;
7
+ error(message: string): void;
8
+ debug(message: string): void;
9
+ startBuild(): void;
10
+ configLoaded(): void;
11
+ startBundle(): void;
12
+ bundleCreated(): void;
13
+ startWrite(): void;
14
+ writeSuccess(): void;
15
+ fileOperation(type: 'file' | 'dir', path: string, success: boolean): void;
16
+ missingFile(file: string): void;
17
+ outputFiles(files: string[]): void;
18
+ buildSuccess(outDir: string): void;
19
+ buildError(error: Error): void;
20
+ private stopSpinner;
21
+ private startSpinner;
22
+ }
23
+ export declare const logger: Logger;
24
+ export {};