@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
@@ -0,0 +1,91 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ class Logger {
4
+ spinner = ora();
5
+ isSpinning = false;
6
+ info(message) {
7
+ this.stopSpinner();
8
+ ora().info(chalk.blue(message));
9
+ }
10
+ success(message) {
11
+ this.stopSpinner();
12
+ ora().succeed(chalk.green(message));
13
+ }
14
+ warn(message) {
15
+ this.stopSpinner();
16
+ ora().warn(chalk.yellow(message));
17
+ }
18
+ error(message) {
19
+ this.stopSpinner();
20
+ ora().fail(chalk.red(message));
21
+ }
22
+ debug(message) {
23
+ this.stopSpinner();
24
+ console.log(chalk.gray(message));
25
+ }
26
+ startBuild() {
27
+ this.info('Starting build process...');
28
+ }
29
+ configLoaded() {
30
+ this.stopSpinner();
31
+ }
32
+ startBundle() {
33
+ this.startSpinner('Creating bundle...');
34
+ }
35
+ bundleCreated() {
36
+ this.success('Bundle created successfully');
37
+ }
38
+ startWrite() {
39
+ this.startSpinner('Writing files...');
40
+ }
41
+ writeSuccess() {
42
+ this.success('Files written successfully');
43
+ }
44
+ fileOperation(type, path, success) {
45
+ if (success) {
46
+ const icon = type === 'file' ? '📄' : '📁';
47
+ console.log(` ${icon} ${chalk.dim(`Copied ${type}: ${path}`)}`);
48
+ }
49
+ else {
50
+ console.log(` ${chalk.red('❌')} ${chalk.dim(`Failed to copy ${path}`)}`);
51
+ }
52
+ }
53
+ missingFile(file) {
54
+ console.log(` ${chalk.yellow('⚠️')} ${chalk.dim(`Missing file: ${file}`)}`);
55
+ }
56
+ outputFiles(files) {
57
+ console.log(chalk.dim('\nGenerated files:'));
58
+ files.forEach((file) => {
59
+ console.log(` ${chalk.cyan('•')} ${file}`);
60
+ });
61
+ }
62
+ buildSuccess(outDir) {
63
+ console.log('\n' + chalk.green('✨ Build completed successfully!'));
64
+ console.log(chalk.dim(`Output directory: ${outDir}\n`));
65
+ }
66
+ buildError(error) {
67
+ this.error('Build failed');
68
+ console.error(chalk.dim('\nError details:'));
69
+ console.error(chalk.red(error.message));
70
+ if ('frame' in error) {
71
+ console.error('\n' + chalk.yellow('Error location:'));
72
+ console.error(chalk.dim(error.frame));
73
+ }
74
+ }
75
+ stopSpinner() {
76
+ if (this.isSpinning) {
77
+ this.spinner.stop();
78
+ this.isSpinning = false;
79
+ }
80
+ }
81
+ startSpinner(message) {
82
+ this.stopSpinner();
83
+ this.spinner = ora({
84
+ text: message,
85
+ color: 'blue',
86
+ }).start();
87
+ this.isSpinning = true;
88
+ }
89
+ }
90
+ export const logger = new Logger();
91
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { RollupOptions } from 'rollup';
2
+ import type { CameraUiBuildOptions } from '../types.js';
3
+ export declare function parseConfig(): Promise<{
4
+ rollupOptions: RollupOptions;
5
+ userConfig: CameraUiBuildOptions;
6
+ }>;
@@ -0,0 +1,151 @@
1
+ import commonjs from '@rollup/plugin-commonjs';
2
+ import json from '@rollup/plugin-json';
3
+ import { nodeResolve } from '@rollup/plugin-node-resolve';
4
+ import terser from '@rollup/plugin-terser';
5
+ import typescript from '@rollup/plugin-typescript';
6
+ import { pathExists } from 'fs-extra/esm';
7
+ import { readFile, rm } from 'node:fs/promises';
8
+ import { builtinModules } from 'node:module';
9
+ import { isAbsolute, resolve } from 'node:path';
10
+ import * as tsImport from 'ts-import';
11
+ import { logger } from './logger.js';
12
+ import { detectLanguage } from './utils.js';
13
+ async function detectJsProjectType(rootDir) {
14
+ try {
15
+ const pluginLanguage = await detectLanguage(rootDir);
16
+ if (pluginLanguage === 'python') {
17
+ throw new Error(`Invalid project type: ${pluginLanguage}`);
18
+ }
19
+ const packageJson = JSON.parse(await readFile(resolve(rootDir, 'package.json'), 'utf-8'));
20
+ const hasTypeScript = await fileExists(resolve(rootDir, 'tsconfig.json'));
21
+ const isESM = packageJson.type === 'module';
22
+ const projectType = hasTypeScript ? (isESM ? 'typescript-esm' : 'typescript-cjs') : isESM ? 'javascript-esm' : 'javascript-cjs';
23
+ return projectType;
24
+ }
25
+ catch {
26
+ return 'javascript-cjs';
27
+ }
28
+ }
29
+ async function fileExists(path) {
30
+ try {
31
+ await readFile(path);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ }
38
+ async function loadConfig() {
39
+ const tsConfigPath = resolve(process.cwd(), 'cameraui.config.ts');
40
+ const jsConfigPath = resolve(process.cwd(), 'cameraui.config.js');
41
+ try {
42
+ if (await pathExists(tsConfigPath)) {
43
+ const asyncResult = await tsImport.load(tsConfigPath, { useCache: false });
44
+ const cacheDir = resolve(process.cwd(), '.cache');
45
+ await rm(cacheDir, { force: true, recursive: true });
46
+ const config = asyncResult.default || asyncResult;
47
+ return config;
48
+ }
49
+ if (await pathExists(jsConfigPath)) {
50
+ const config = await import(jsConfigPath);
51
+ return config.default || {};
52
+ }
53
+ return {};
54
+ }
55
+ catch (error) {
56
+ logger.buildError(error);
57
+ return {};
58
+ }
59
+ }
60
+ export async function parseConfig() {
61
+ const userConfig = await loadConfig();
62
+ const cliRootDir = process.cwd();
63
+ const targetRootDir = userConfig.rootDir ? (isAbsolute(userConfig.rootDir) ? userConfig.rootDir : resolve(cliRootDir, userConfig.rootDir)) : cliRootDir;
64
+ const projectType = await detectJsProjectType(targetRootDir);
65
+ let input;
66
+ if (Array.isArray(userConfig.input)) {
67
+ input = userConfig.input.map((input) => {
68
+ return resolve(targetRootDir, input);
69
+ });
70
+ }
71
+ else if (typeof userConfig.input === 'object') {
72
+ input = Object.fromEntries(Object.entries(userConfig.input).map(([key, value]) => {
73
+ return [key, resolve(targetRootDir, value)];
74
+ }));
75
+ }
76
+ else if (typeof userConfig.input === 'string') {
77
+ input = resolve(targetRootDir, userConfig.input);
78
+ }
79
+ else {
80
+ input = resolve(targetRootDir, 'src/index.ts');
81
+ }
82
+ const outputDir = resolve(targetRootDir, 'bundle', 'dist');
83
+ const plugins = [
84
+ nodeResolve({
85
+ preferBuiltins: true,
86
+ extensions: ['.ts', '.js', '.json'],
87
+ rootDir: targetRootDir,
88
+ browser: false,
89
+ exportConditions: ['node'],
90
+ }),
91
+ commonjs({
92
+ transformMixedEsModules: true,
93
+ }),
94
+ json({
95
+ preferConst: true,
96
+ compact: true,
97
+ }),
98
+ ];
99
+ if (projectType.startsWith('typescript')) {
100
+ const tsconfigPath = resolve(targetRootDir, 'tsconfig.json');
101
+ plugins.push(typescript({
102
+ tsconfig: tsconfigPath,
103
+ rootDir: targetRootDir,
104
+ outDir: outputDir,
105
+ declaration: false,
106
+ }));
107
+ }
108
+ if (userConfig.mode !== 'development') {
109
+ plugins.push(terser());
110
+ }
111
+ const nodeModules = [];
112
+ builtinModules.forEach((m) => {
113
+ nodeModules.push(m);
114
+ nodeModules.push(`node:${m}`);
115
+ });
116
+ const output = {
117
+ dir: outputDir,
118
+ format: 'esm',
119
+ sourcemap: true,
120
+ entryFileNames: '[name].js',
121
+ };
122
+ const rollupOptions = {
123
+ input,
124
+ output,
125
+ external: (id) => {
126
+ const isExternal = userConfig.external?.some((external) => {
127
+ if (typeof external === 'string') {
128
+ return id === external || id.split('/').some((segment) => segment === external);
129
+ }
130
+ else if (external instanceof RegExp) {
131
+ return external.test(id);
132
+ }
133
+ return false;
134
+ });
135
+ if (isExternal) {
136
+ return true;
137
+ }
138
+ else if (nodeModules.includes(id)) {
139
+ return true;
140
+ }
141
+ else {
142
+ return false;
143
+ }
144
+ },
145
+ plugins,
146
+ preserveSymlinks: true,
147
+ logLevel: userConfig.mode === 'development' ? 'debug' : 'silent',
148
+ };
149
+ return { rollupOptions, userConfig };
150
+ }
151
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ declare const pJson: any;
2
+ export default pJson;
@@ -0,0 +1,10 @@
1
+ import { createRequire } from 'node:module';
2
+ import { dirname, join, resolve } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const __filename = fileURLToPath(import.meta.url);
5
+ const __dirname = dirname(__filename);
6
+ const require = createRequire(import.meta.url);
7
+ const pJsonPath = resolve(join(__dirname, '../../package.json'));
8
+ const pJson = require(pJsonPath);
9
+ export default pJson;
10
+ //# sourceMappingURL=pjson.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pjson.js","sourceRoot":"","sources":["../../src/utils/pjson.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC,CAAC;AACjE,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;AAEjC,eAAe,KAAK,CAAC"}
@@ -0,0 +1,6 @@
1
+ export declare const PLUGIN_IDENTIFIER: RegExp;
2
+ export declare const PLUGIN_IDENTIFIER_PATTERN: RegExp;
3
+ export declare function isQualifiedPluginIdentifier(pluginName: string): boolean;
4
+ export declare function extractPluginScope(pluginName: string): string | undefined;
5
+ export declare function extractPluginName(pluginName: string): string;
6
+ export declare function transformDisplaName(pluginName: string): string;
@@ -0,0 +1,21 @@
1
+ export const PLUGIN_IDENTIFIER = /^((@[\w-.]*)\/)?(camera-ui-)/;
2
+ export const PLUGIN_IDENTIFIER_PATTERN = /^((@[\w-.]*)\/)?(camera-ui-[\w-]*)$/;
3
+ export function isQualifiedPluginIdentifier(pluginName) {
4
+ const normalizedName = pluginName.replace(/\\/g, '/');
5
+ return PLUGIN_IDENTIFIER_PATTERN.test(normalizedName);
6
+ }
7
+ export function extractPluginScope(pluginName) {
8
+ return PLUGIN_IDENTIFIER_PATTERN.exec(pluginName)[2];
9
+ }
10
+ export function extractPluginName(pluginName) {
11
+ return PLUGIN_IDENTIFIER_PATTERN.exec(pluginName)[3];
12
+ }
13
+ export function transformDisplaName(pluginName) {
14
+ const extractedPkgName = extractPluginName(pluginName).replace('camera-ui-', '').replaceAll('-', ' ');
15
+ return extractedPkgName
16
+ .toLowerCase()
17
+ .split(' ')
18
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
19
+ .join(' ');
20
+ }
21
+ //# sourceMappingURL=pluginName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pluginName.js","sourceRoot":"","sources":["../../src/utils/pluginName.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;AAEhE,MAAM,CAAC,MAAM,yBAAyB,GAAG,qCAAqC,CAAC;AAE/E,MAAM,UAAU,2BAA2B,CAAC,UAAkB;IAC5D,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,yBAAyB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAkB;IACnD,OAAO,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAE,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAE,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEtG,OAAO,gBAAgB;SACpB,WAAW,EAAE;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1 @@
1
+ export default function sortDependencies(packageJson: Record<string, any>): Record<string, any>;
@@ -0,0 +1,20 @@
1
+ // https://github.com/vuejs/create-vue/blob/dd60a395d8a9c1600135bcdb142bfe37571d520a/utils/sortDependencies.ts#L1C1-L22C2
2
+ export default function sortDependencies(packageJson) {
3
+ const sorted = {};
4
+ const depTypes = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
5
+ for (const depType of depTypes) {
6
+ if (packageJson[depType]) {
7
+ sorted[depType] = {};
8
+ Object.keys(packageJson[depType])
9
+ .sort()
10
+ .forEach((name) => {
11
+ sorted[depType][name] = packageJson[depType][name];
12
+ });
13
+ }
14
+ }
15
+ return {
16
+ ...packageJson,
17
+ ...sorted,
18
+ };
19
+ }
20
+ //# sourceMappingURL=sortDependencies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sortDependencies.js","sourceRoot":"","sources":["../../src/utils/sortDependencies.ts"],"names":[],"mappings":"AAAA,yHAAyH;AACzH,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,WAAgC;IACvE,MAAM,MAAM,GAAwB,EAAE,CAAC;IAEvC,MAAM,QAAQ,GAAG,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CAAC;IAEjG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YAErB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;iBAC9B,IAAI,EAAE;iBACN,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;gBAChB,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC,CAAC,CAAC;QACP,CAAC;IACH,CAAC;IAED,OAAO;QACL,GAAG,WAAW;QACd,GAAG,MAAM;KACV,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { CreateOptions } from '../types.js';
2
+ export declare function createBaseFiles(targetDir: string, projectName: string, options: CreateOptions): Promise<void>;
3
+ export declare function createPackageJson(projectName: string, options: CreateOptions): any;
4
+ export declare function createPythonRequirements(targetDir: string): Promise<void>;
5
+ export declare function createTsConfig(targetDir: string): Promise<void>;
6
+ export declare function createCodeQualityConfig(targetDir: string, options: CreateOptions): Promise<void>;
7
+ export declare function createSourceFiles(targetDir: string, options: CreateOptions): Promise<void>;
@@ -0,0 +1,162 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { writeFile } from 'node:fs/promises';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import sortDependencies from './sortDependencies.js';
6
+ import { copyPath } from './utils.js';
7
+ const __filename = fileURLToPath(import.meta.url);
8
+ const __dirname = dirname(__filename);
9
+ export async function createBaseFiles(targetDir, projectName, options) {
10
+ const baseFiles = [
11
+ '.gitignore',
12
+ '.npmignore',
13
+ '.editorconfig',
14
+ 'README.md',
15
+ 'LICENSE.md',
16
+ 'CONTRIBUTING.md',
17
+ 'CHANGELOG.md',
18
+ 'SECURITY.md',
19
+ 'config.schema.json',
20
+ 'updates.config.js',
21
+ ];
22
+ const javascriptFiles = ['cameraui.config.js'];
23
+ const typescriptFiles = ['cameraui.config.ts'];
24
+ const pythonFiles = [];
25
+ for (const file of baseFiles) {
26
+ await copyPath(__dirname, `../../templates/base/${file}`, targetDir, file);
27
+ }
28
+ if (options.language === 'javascript') {
29
+ for (const file of javascriptFiles) {
30
+ await copyPath(__dirname, `../../templates/base/${file}`, targetDir, file);
31
+ }
32
+ }
33
+ if (options.language === 'python') {
34
+ for (const file of pythonFiles) {
35
+ await copyPath(__dirname, `../../templates/python/${file}`, targetDir, file);
36
+ }
37
+ }
38
+ if (options.language === 'typescript') {
39
+ for (const file of typescriptFiles) {
40
+ await copyPath(__dirname, `../../templates/typescript/${file}`, targetDir, file);
41
+ }
42
+ }
43
+ const readmePath = resolve(targetDir, 'README.md');
44
+ const readmeContent = readFileSync(readmePath, 'utf-8').replace(/{{projectName}}/g, projectName);
45
+ await writeFile(readmePath, readmeContent);
46
+ }
47
+ export function createPackageJson(projectName, options) {
48
+ const pJsonPath = resolve(join(__dirname, '../../templates/base/package.json'));
49
+ const pJson = JSON.parse(readFileSync(pJsonPath, 'utf-8'));
50
+ // general
51
+ pJson.displayName = options.displayName;
52
+ pJson.name = projectName;
53
+ pJson.main = options.language === 'python' ? './bundle/main.py' : './bundle/index.js';
54
+ // scripts
55
+ pJson.scripts = {
56
+ bundle: 'cui bundle',
57
+ 'install-updates': 'npm i --save',
58
+ update: 'updates --update ./',
59
+ prepublishOnly: 'node -e "if(!process.env.SAFE_PUBLISH){console.error(\'Error: Use npm run publish:alpha, publish:beta oder publish:latest to publish\');process.exit(1)}"',
60
+ 'publish:alpha': 'cui publish --alpha',
61
+ 'publish:beta': 'cui publish --beta',
62
+ 'publish:latest': 'cui publish --latest',
63
+ };
64
+ if (options.quality) {
65
+ pJson.scripts.format = options.language === 'python' ? 'ruff format' : 'prettier --write "src/" --ignore-unknown --no-error-on-unmatched-pattern';
66
+ pJson.scripts.lint = options.language === 'python' ? 'ruff check --fix' : 'eslint --fix --ext .js,.ts .';
67
+ pJson.scripts.bundle = 'npm run format && npm run lint';
68
+ }
69
+ if (options.language === 'typescript') {
70
+ pJson.scripts.build = 'rimraf dist && tsc';
71
+ pJson.scripts.bundle += ' && npm run build';
72
+ }
73
+ pJson.scripts.bundle += ' && cui bundle';
74
+ // devDependencies
75
+ if (options.language === 'typescript') {
76
+ const tsPJsonPath = resolve(join(__dirname, '../../templates/typescript/package.json'));
77
+ const tsPJson = JSON.parse(readFileSync(tsPJsonPath, 'utf-8'));
78
+ pJson.devDependencies = {
79
+ ...pJson.devDependencies,
80
+ ...tsPJson,
81
+ };
82
+ }
83
+ if (options.quality && options.language !== 'python') {
84
+ const formatterPJsonPath = resolve(join(__dirname, '../../templates/base/package.prettier.json'));
85
+ const formatterPJson = JSON.parse(readFileSync(formatterPJsonPath, 'utf-8'));
86
+ const baseLinterPjsonPath = resolve(join(__dirname, '../../templates/base/package.eslint.json'));
87
+ const baseLinterPjson = JSON.parse(readFileSync(baseLinterPjsonPath, 'utf-8'));
88
+ pJson.devDependencies = {
89
+ ...pJson.devDependencies,
90
+ ...baseLinterPjson,
91
+ ...formatterPJson,
92
+ };
93
+ if (options.language === 'typescript') {
94
+ const linterPJsonPath = resolve(join(__dirname, '../../templates/typescript/package.eslint.json'));
95
+ const linterPJson = JSON.parse(readFileSync(linterPJsonPath, 'utf-8'));
96
+ pJson.devDependencies = {
97
+ ...pJson.devDependencies,
98
+ ...linterPJson,
99
+ };
100
+ }
101
+ }
102
+ // contract
103
+ pJson['camera.ui'] = {
104
+ pythonVersion: options.pythonVersion,
105
+ extension: options.pluginType,
106
+ dependencies: [],
107
+ options: options.pluginType === 'motionDetection'
108
+ ? {
109
+ extendedMotionDetection: true,
110
+ }
111
+ : undefined,
112
+ };
113
+ return sortDependencies(pJson);
114
+ }
115
+ export async function createPythonRequirements(targetDir) {
116
+ const files = ['requirements.txt', 'requirements.dev.txt'];
117
+ for (const file of files) {
118
+ await copyPath(__dirname, `../../templates/python/${file}`, targetDir, file);
119
+ }
120
+ }
121
+ export async function createTsConfig(targetDir) {
122
+ await copyPath(__dirname, '../../templates/typescript/tsconfig.json', targetDir, 'tsconfig.json');
123
+ }
124
+ export async function createCodeQualityConfig(targetDir, options) {
125
+ const baseFiles = [];
126
+ const pythonFiles = [];
127
+ const typescriptFiles = [];
128
+ if (options.language === 'python') {
129
+ pythonFiles.push('ruff.toml');
130
+ }
131
+ else {
132
+ baseFiles.push('.prettierrc.json');
133
+ baseFiles.push('.prettierignore');
134
+ if (options.language === 'javascript') {
135
+ baseFiles.push('eslint.config.js');
136
+ }
137
+ else if (options.language === 'typescript') {
138
+ typescriptFiles.push('eslint.config.js');
139
+ }
140
+ }
141
+ for (const file of baseFiles) {
142
+ await copyPath(__dirname, `../../templates/base/${file}`, targetDir, file);
143
+ }
144
+ for (const file of pythonFiles) {
145
+ await copyPath(__dirname, `../../templates/python/${file}`, targetDir, file);
146
+ }
147
+ for (const file of typescriptFiles) {
148
+ await copyPath(__dirname, `../../templates/typescript/${file}`, targetDir, file);
149
+ }
150
+ }
151
+ export async function createSourceFiles(targetDir, options) {
152
+ if (options.language === 'python') {
153
+ await copyPath(__dirname, '../../templates/python/src', targetDir, 'src');
154
+ }
155
+ if (options.language === 'typescript') {
156
+ await copyPath(__dirname, '../../templates/typescript/src', targetDir, 'src');
157
+ }
158
+ if (options.language === 'javascript') {
159
+ await copyPath(__dirname, '../../templates/base/src', targetDir, 'src');
160
+ }
161
+ }
162
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/utils/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { PluginLanguage } from '../types.js';
2
+ export interface RequiredFile {
3
+ target: string;
4
+ pattern: RegExp;
5
+ optional?: boolean;
6
+ }
7
+ export declare function ensureDir(dir: string): Promise<void>;
8
+ export declare function findFile(targetDir: string, file: RequiredFile): Promise<string | null>;
9
+ export declare function detectLanguage(rootDir: string): Promise<PluginLanguage>;
10
+ export declare function copyPath(rootDir: string, source: string, dest: string, targetFilename?: string): Promise<void>;
@@ -0,0 +1,71 @@
1
+ import { copyFile, cp, mkdir, readdir, stat } from 'node:fs/promises';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { logger } from '../utils/logger.js';
4
+ export async function ensureDir(dir) {
5
+ try {
6
+ await mkdir(dir, { recursive: true });
7
+ }
8
+ catch (error) {
9
+ if (error.code !== 'EEXIST') {
10
+ throw error;
11
+ }
12
+ }
13
+ }
14
+ export async function findFile(targetDir, file) {
15
+ try {
16
+ const files = await readdir(targetDir);
17
+ return files.find((f) => file.pattern.test(f)) ?? null;
18
+ }
19
+ catch {
20
+ logger.warn(`Unable to read directory ${targetDir}`);
21
+ return null;
22
+ }
23
+ }
24
+ export async function detectLanguage(rootDir) {
25
+ try {
26
+ const srcDir = resolve(rootDir, 'src');
27
+ const hasPythonFiles = await findFile(srcDir, {
28
+ target: 'main.py',
29
+ pattern: /^main\.py$/i,
30
+ });
31
+ const hasRequirements = await findFile(rootDir, {
32
+ target: 'requirements.txt',
33
+ pattern: /^requirements\.txt$/i,
34
+ });
35
+ if (hasPythonFiles || hasRequirements) {
36
+ return 'python';
37
+ }
38
+ const hasTypeScript = await findFile(rootDir, {
39
+ target: 'tsconfig.json',
40
+ pattern: /^tsconfig\.json$/i,
41
+ });
42
+ return hasTypeScript ? 'typescript' : 'javascript';
43
+ }
44
+ catch {
45
+ return 'javascript';
46
+ }
47
+ }
48
+ export async function copyPath(rootDir, source, dest, targetFilename) {
49
+ try {
50
+ const sourcePath = resolve(rootDir, source);
51
+ const destPath = resolve(dest, targetFilename ?? source);
52
+ await ensureDir(dirname(destPath));
53
+ const stats = await stat(sourcePath);
54
+ if (stats.isDirectory()) {
55
+ await cp(sourcePath, destPath, {
56
+ recursive: true,
57
+ force: true,
58
+ preserveTimestamps: true,
59
+ });
60
+ logger.fileOperation('dir', source, true);
61
+ }
62
+ else {
63
+ await copyFile(sourcePath, destPath);
64
+ logger.fileOperation('file', source, true);
65
+ }
66
+ }
67
+ catch {
68
+ logger.fileOperation('file', source, false);
69
+ }
70
+ }
71
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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"}