@camera.ui/cli 0.0.49 → 0.0.50
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.
- package/LICENSE.md +1 -1
- package/README.md +10 -1
- package/dist/commands/artifacts.d.ts +9 -0
- package/dist/commands/artifacts.js +107 -0
- package/dist/commands/artifacts.js.map +1 -0
- package/dist/commands/bundle.d.ts +19 -1
- package/dist/commands/bundle.js +368 -56
- package/dist/commands/bundle.js.map +1 -1
- package/dist/commands/create.js +140 -93
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/publish.js +77 -36
- package/dist/commands/publish.js.map +1 -1
- package/dist/index.js +11 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +21 -5
- package/dist/utils/banners.d.ts +3 -1
- package/dist/utils/banners.js +15 -11
- package/dist/utils/banners.js.map +1 -1
- package/dist/utils/logger.d.ts +12 -24
- package/dist/utils/logger.js +57 -83
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/parser.d.ts +11 -4
- package/dist/utils/parser.js +27 -185
- package/dist/utils/parser.js.map +1 -1
- package/dist/utils/templates.d.ts +13 -1
- package/dist/utils/templates.js +148 -68
- package/dist/utils/templates.js.map +1 -1
- package/dist/utils/utils.js +13 -11
- package/dist/utils/utils.js.map +1 -1
- package/dist/utils/versions.js +1 -2
- package/dist/utils/versions.js.map +1 -1
- package/package.json +29 -43
- package/templates/base/README.md +2 -2
- package/templates/base/SECURITY.md +1 -1
- package/templates/base/package.json +2 -3
- package/templates/base/updates.config.js +1 -1
- package/templates/go/go.mod +5 -0
- package/templates/go/postinstall.js +35 -0
- package/templates/go/src/main.go +51 -0
- package/templates/python/requirements.txt +1 -1
- package/templates/python/ruff.toml +2 -2
- package/templates/python/src/main.py +299 -28
- package/templates/typescript/contract.ts +36 -0
- package/templates/typescript/eslint.config.js +13 -3
- package/templates/typescript/package.eslint.json +2 -2
- package/templates/typescript/package.json +4 -4
- package/templates/typescript/src/index.ts +96 -27
- package/templates/typescript/src/sensor.ts +207 -0
- package/CHANGELOG.md +0 -8
- package/CONTRIBUTING.md +0 -1
- package/scripts/chmod.js +0 -17
- package/templates/base/cameraui.config.js +0 -10
- package/templates/base/eslint.config.js +0 -64
- package/templates/base/src/index.js +0 -41
package/dist/commands/create.js
CHANGED
|
@@ -1,15 +1,47 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { SensorType } from '@camera.ui/sdk';
|
|
2
|
+
import { confirm, isCancel, multiselect, select, text } from '@clack/prompts';
|
|
2
3
|
import { existsSync } from 'node:fs';
|
|
3
4
|
import { rm, writeFile } from 'node:fs/promises';
|
|
4
5
|
import { resolve } from 'node:path';
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
6
|
+
import pc from 'picocolors';
|
|
7
|
+
import { showCancel, showIntro, showOutro } from '../utils/banners.js';
|
|
8
|
+
import * as log from '../utils/logger.js';
|
|
7
9
|
import { isQualifiedPluginIdentifier, PLUGIN_IDENTIFIER, transformDisplaName } from '../utils/pluginName.js';
|
|
8
|
-
import { createBaseFiles, createCodeQualityConfig, createMyPyConfig, createPackageJson, createPythonRequirements, createSourceFiles, createTsConfig, } from '../utils/templates.js';
|
|
10
|
+
import { createBaseFiles, createCodeQualityConfig, createContractFile, createGoFiles, createMyPyConfig, createPackageJson, createPythonRequirements, createSourceFiles, createTsConfig, } from '../utils/templates.js';
|
|
9
11
|
import { ensureDir } from '../utils/utils.js';
|
|
12
|
+
/**
|
|
13
|
+
* Sensor options for the CLI prompts.
|
|
14
|
+
*
|
|
15
|
+
* Note: This list should stay in sync with the SDK's SensorType enum.
|
|
16
|
+
* When adding new sensor types to the SDK, update this list accordingly.
|
|
17
|
+
*/
|
|
18
|
+
const SENSOR_OPTIONS = [
|
|
19
|
+
{ value: SensorType.Motion, label: 'Motion Detection' },
|
|
20
|
+
{ value: SensorType.Object, label: 'Object Detection' },
|
|
21
|
+
{ value: SensorType.Audio, label: 'Audio Detection' },
|
|
22
|
+
{ value: SensorType.Face, label: 'Face Detection' },
|
|
23
|
+
{ value: SensorType.LicensePlate, label: 'License Plate' },
|
|
24
|
+
{ value: SensorType.Contact, label: 'Contact Sensor' },
|
|
25
|
+
{ value: SensorType.Classifier, label: 'Classifier' },
|
|
26
|
+
{ value: SensorType.Light, label: 'Light Control' },
|
|
27
|
+
{ value: SensorType.Siren, label: 'Siren Control' },
|
|
28
|
+
{ value: SensorType.Switch, label: 'Switch Control' },
|
|
29
|
+
{ value: SensorType.PTZ, label: 'PTZ Control' },
|
|
30
|
+
{ value: SensorType.SecuritySystem, label: 'Security System' },
|
|
31
|
+
{ value: SensorType.Doorbell, label: 'Doorbell' },
|
|
32
|
+
{ value: SensorType.Battery, label: 'Battery' },
|
|
33
|
+
];
|
|
34
|
+
function handleCancel(value) {
|
|
35
|
+
if (isCancel(value)) {
|
|
36
|
+
showCancel('Operation cancelled');
|
|
37
|
+
process.exit(0);
|
|
38
|
+
}
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
10
41
|
export async function createProject(projectName) {
|
|
42
|
+
showIntro();
|
|
11
43
|
if (!projectName) {
|
|
12
|
-
|
|
44
|
+
log.error('Project name is required');
|
|
13
45
|
process.exit(1);
|
|
14
46
|
}
|
|
15
47
|
if (!isQualifiedPluginIdentifier(projectName)) {
|
|
@@ -19,116 +51,131 @@ export async function createProject(projectName) {
|
|
|
19
51
|
try {
|
|
20
52
|
const exists = existsSync(targetDir);
|
|
21
53
|
if (exists) {
|
|
22
|
-
const
|
|
23
|
-
type: 'select',
|
|
24
|
-
name: 'action',
|
|
54
|
+
const action = handleCancel(await select({
|
|
25
55
|
message: `Target directory "${projectName}" already exists. Pick an action:`,
|
|
26
|
-
|
|
27
|
-
{
|
|
28
|
-
{
|
|
56
|
+
options: [
|
|
57
|
+
{ value: 'overwrite', label: 'Overwrite' },
|
|
58
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
29
59
|
],
|
|
30
|
-
});
|
|
31
|
-
if (action === 'cancel'
|
|
32
|
-
|
|
33
|
-
process.exit(
|
|
34
|
-
}
|
|
35
|
-
if (action === 'overwrite') {
|
|
36
|
-
logger.info(`Removing existing directory: ${projectName}`);
|
|
37
|
-
await rm(targetDir, { recursive: true, force: true });
|
|
60
|
+
}));
|
|
61
|
+
if (action === 'cancel') {
|
|
62
|
+
showCancel('Operation cancelled');
|
|
63
|
+
process.exit(0);
|
|
38
64
|
}
|
|
65
|
+
log.info(`Removing existing directory: ${projectName}`);
|
|
66
|
+
await rm(targetDir, { recursive: true, force: true });
|
|
39
67
|
}
|
|
40
68
|
}
|
|
41
69
|
catch (err) {
|
|
42
|
-
|
|
70
|
+
log.error(`Error checking directory: ${err.message}`);
|
|
43
71
|
process.exit(1);
|
|
44
72
|
}
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
type: (prev) => (prev === 'python' ? 'select' : null),
|
|
64
|
-
name: 'pythonVersion',
|
|
73
|
+
const displayName = handleCancel(await text({
|
|
74
|
+
message: 'Display name:',
|
|
75
|
+
placeholder: transformDisplaName(projectName),
|
|
76
|
+
defaultValue: transformDisplaName(projectName),
|
|
77
|
+
}));
|
|
78
|
+
const language = handleCancel(await select({
|
|
79
|
+
message: 'Select programming language:',
|
|
80
|
+
options: [
|
|
81
|
+
{ value: 'typescript', label: 'TypeScript', hint: 'recommended' },
|
|
82
|
+
{ value: 'python', label: 'Python' },
|
|
83
|
+
{ value: 'go', label: 'Go' },
|
|
84
|
+
],
|
|
85
|
+
}));
|
|
86
|
+
let pythonVersion;
|
|
87
|
+
if (language === 'python') {
|
|
88
|
+
pythonVersion = handleCancel(await select({
|
|
65
89
|
message: 'Select Python version:',
|
|
66
|
-
|
|
67
|
-
{
|
|
68
|
-
{
|
|
69
|
-
{ title: '3.12', value: '3.12' },
|
|
70
|
-
],
|
|
71
|
-
onRender(kleur) {
|
|
72
|
-
this.message = kleur.cyan('Select Python version:');
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
type: 'toggle',
|
|
77
|
-
name: 'quality',
|
|
78
|
-
message: (prev, values) => `Add ${values.language === 'python' ? 'ruff' : 'ESLint & Prettier'} for code quality?`,
|
|
79
|
-
initial: true,
|
|
80
|
-
},
|
|
81
|
-
{
|
|
82
|
-
type: 'multiselect',
|
|
83
|
-
name: 'pluginType',
|
|
84
|
-
message: 'Select plugin type(s):',
|
|
85
|
-
choices: [
|
|
86
|
-
{ title: 'Hub', value: 'hub' },
|
|
87
|
-
{ title: 'Motion Detection', value: 'motionDetection' },
|
|
88
|
-
{ title: 'Object Detection', value: 'objectDetection' },
|
|
89
|
-
{ title: 'Audio Detection', value: 'audioDetection' },
|
|
90
|
-
{ title: 'PTZ', value: 'ptz' },
|
|
90
|
+
options: [
|
|
91
|
+
{ value: '3.11', label: '3.11' },
|
|
92
|
+
{ value: '3.12', label: '3.12' },
|
|
91
93
|
],
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
const quality = language === 'go'
|
|
97
|
+
? true
|
|
98
|
+
: handleCancel(await confirm({
|
|
99
|
+
message: `Add ${language === 'python' ? 'ruff' : 'ESLint & Prettier'} for code quality?`,
|
|
100
|
+
initialValue: true,
|
|
101
|
+
}));
|
|
102
|
+
// Plugin role determines which sensor type questions to ask
|
|
103
|
+
const role = handleCancel(await select({
|
|
104
|
+
message: "What is your plugin's role?",
|
|
105
|
+
options: [
|
|
106
|
+
{ value: 'provider', label: 'Provider', hint: 'creates and controls sensors' },
|
|
107
|
+
{ value: 'consumer', label: 'Consumer/Hub', hint: 'receives sensor data from other plugins' },
|
|
108
|
+
{ value: 'both', label: 'Both', hint: 'provides sensors and consumes from others' },
|
|
109
|
+
],
|
|
110
|
+
}));
|
|
111
|
+
let provides = [];
|
|
112
|
+
let consumes = [];
|
|
113
|
+
if (role === 'provider' || role === 'both') {
|
|
114
|
+
provides = handleCancel(await multiselect({
|
|
115
|
+
message: `Which sensor types will your plugin PROVIDE? ${pc.dim('(space to select)')}`,
|
|
116
|
+
options: SENSOR_OPTIONS,
|
|
117
|
+
required: false,
|
|
118
|
+
}));
|
|
97
119
|
}
|
|
120
|
+
if (role === 'consumer' || role === 'both') {
|
|
121
|
+
consumes = handleCancel(await multiselect({
|
|
122
|
+
message: `Which sensor types will your plugin CONSUME? ${pc.dim('(space to select)')}`,
|
|
123
|
+
options: SENSOR_OPTIONS,
|
|
124
|
+
required: false,
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
const options = {
|
|
128
|
+
displayName,
|
|
129
|
+
language,
|
|
130
|
+
pythonVersion,
|
|
131
|
+
quality,
|
|
132
|
+
role,
|
|
133
|
+
provides,
|
|
134
|
+
consumes,
|
|
135
|
+
};
|
|
98
136
|
try {
|
|
99
137
|
await ensureDir(targetDir);
|
|
100
|
-
|
|
101
|
-
await createBaseFiles(targetDir, projectName,
|
|
102
|
-
|
|
103
|
-
const packageJson = await createPackageJson(projectName,
|
|
138
|
+
log.success(`Created project directory: ${projectName}`);
|
|
139
|
+
await createBaseFiles(targetDir, projectName, options);
|
|
140
|
+
log.success('Created base files');
|
|
141
|
+
const packageJson = await createPackageJson(projectName, options);
|
|
104
142
|
await writeFile(resolve(targetDir, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
105
|
-
|
|
106
|
-
|
|
143
|
+
log.success('Created package.json');
|
|
144
|
+
// Always create tsconfig.json (needed for contract.ts compilation)
|
|
145
|
+
await createTsConfig(targetDir, options);
|
|
146
|
+
log.success('Created tsconfig.json');
|
|
147
|
+
// Always create contract.ts at root level
|
|
148
|
+
await createContractFile(targetDir, options);
|
|
149
|
+
log.success('Created contract.ts');
|
|
150
|
+
if (options.language === 'python') {
|
|
107
151
|
await createPythonRequirements(targetDir);
|
|
108
|
-
|
|
152
|
+
log.success('Created requirements.txt');
|
|
109
153
|
await createMyPyConfig(targetDir);
|
|
110
|
-
|
|
154
|
+
log.success('Created mypy configuration');
|
|
155
|
+
}
|
|
156
|
+
if (options.language === 'go') {
|
|
157
|
+
await createGoFiles(targetDir, projectName);
|
|
158
|
+
log.success('Created Go files');
|
|
111
159
|
}
|
|
112
|
-
if (
|
|
113
|
-
await
|
|
114
|
-
|
|
160
|
+
if (options.quality) {
|
|
161
|
+
await createCodeQualityConfig(targetDir, options);
|
|
162
|
+
log.success('Created code quality configuration');
|
|
115
163
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
164
|
+
await createSourceFiles(targetDir, options);
|
|
165
|
+
log.success('Created source files');
|
|
166
|
+
const nextSteps = [`${pc.bold(pc.cyan(`cd ${projectName}`))}`, `${pc.bold(pc.cyan('npm install'))}`];
|
|
167
|
+
if (options.language === 'python') {
|
|
168
|
+
nextSteps.push(`${pc.bold(pc.cyan('pip install -r requirements.txt'))}`);
|
|
169
|
+
nextSteps.push(`${pc.bold(pc.cyan('pip install -r requirements.dev.txt'))}`);
|
|
119
170
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
console.log('\nNext steps:');
|
|
123
|
-
console.log(chalk.cyan(` cd ${projectName}`));
|
|
124
|
-
console.log(chalk.cyan(' npm install'));
|
|
125
|
-
if (answers.language === 'python') {
|
|
126
|
-
console.log(chalk.cyan(' pip install -r requirements.txt'));
|
|
127
|
-
console.log(chalk.cyan(' pip install -r requirements.dev.txt'));
|
|
171
|
+
if (options.language === 'go') {
|
|
172
|
+
nextSteps.push(`${pc.bold(pc.cyan('cd src && go mod tidy'))}`);
|
|
128
173
|
}
|
|
174
|
+
nextSteps.push(`${pc.bold(pc.cyan('npm run bundle'))}`);
|
|
175
|
+
showOutro(`${pc.green('Done!')} Next steps:\n\n ${nextSteps.join('\n ')}`);
|
|
129
176
|
}
|
|
130
177
|
catch (err) {
|
|
131
|
-
|
|
178
|
+
log.buildError(err);
|
|
132
179
|
process.exit(1);
|
|
133
180
|
}
|
|
134
181
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/publish.js
CHANGED
|
@@ -1,52 +1,56 @@
|
|
|
1
|
+
import { isCancel, select, text } from '@clack/prompts';
|
|
1
2
|
import { exec, spawn } from 'node:child_process';
|
|
2
|
-
import { readFileSync } from 'node:fs';
|
|
3
|
-
import { writeFile } from 'node:fs/promises';
|
|
3
|
+
import { existsSync, readFileSync, readdirSync } from 'node:fs';
|
|
4
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
4
5
|
import { resolve } from 'node:path';
|
|
5
6
|
import { promisify } from 'node:util';
|
|
6
|
-
import prompts from 'prompts';
|
|
7
7
|
import semver from 'semver';
|
|
8
|
-
import {
|
|
8
|
+
import { showCancel, showIntro, showOutro } from '../utils/banners.js';
|
|
9
|
+
import * as log from '../utils/logger.js';
|
|
9
10
|
const execAsync = promisify(exec);
|
|
11
|
+
function handleCancel(value) {
|
|
12
|
+
if (isCancel(value)) {
|
|
13
|
+
showCancel('Operation cancelled');
|
|
14
|
+
process.exit(0);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
10
18
|
function validateBundle() {
|
|
11
19
|
try {
|
|
12
20
|
const bundlePath = resolve(process.cwd(), 'bundle');
|
|
13
21
|
const packagePath = resolve(bundlePath, 'package.json');
|
|
14
22
|
const bundleZipPath = resolve(bundlePath, 'bundle.zip');
|
|
15
23
|
try {
|
|
16
|
-
|
|
17
|
-
if (!packageJson['camera.ui']?.bundled) {
|
|
18
|
-
logger.error('Bundle not found. Please run "npm run bundle" first.');
|
|
19
|
-
return false;
|
|
20
|
-
}
|
|
24
|
+
readFileSync(packagePath);
|
|
21
25
|
}
|
|
22
26
|
catch {
|
|
23
|
-
|
|
27
|
+
log.error('package.json not found in bundle. Please run "npm run bundle" first.');
|
|
24
28
|
return false;
|
|
25
29
|
}
|
|
26
30
|
try {
|
|
27
31
|
readFileSync(bundleZipPath);
|
|
28
32
|
}
|
|
29
33
|
catch {
|
|
30
|
-
|
|
34
|
+
log.error('bundle.zip not found. Please run "npm run bundle" first.');
|
|
31
35
|
return false;
|
|
32
36
|
}
|
|
33
37
|
return true;
|
|
34
38
|
}
|
|
35
39
|
catch (error) {
|
|
36
|
-
|
|
40
|
+
log.error(`Validation failed: ${error.message}`);
|
|
37
41
|
return false;
|
|
38
42
|
}
|
|
39
43
|
}
|
|
40
44
|
async function validateVersion(name, version) {
|
|
41
45
|
if (!semver.valid(version)) {
|
|
42
|
-
|
|
46
|
+
log.error('Invalid version format. Please use semver (e.g. 1.0.0)');
|
|
43
47
|
return false;
|
|
44
48
|
}
|
|
45
49
|
try {
|
|
46
50
|
const { stdout } = await execAsync(`npm view ${name} versions --json`);
|
|
47
51
|
const versions = JSON.parse(stdout);
|
|
48
52
|
if (versions.includes(version)) {
|
|
49
|
-
|
|
53
|
+
log.error(`Version ${version} already exists`);
|
|
50
54
|
return false;
|
|
51
55
|
}
|
|
52
56
|
return true;
|
|
@@ -76,8 +80,9 @@ async function spawnPromise(command, args, cwd) {
|
|
|
76
80
|
});
|
|
77
81
|
}
|
|
78
82
|
export async function publishProject(options) {
|
|
83
|
+
showIntro();
|
|
79
84
|
if (!options.alpha && !options.beta && !options.latest) {
|
|
80
|
-
|
|
85
|
+
log.error('Please specify a version to publish: --alpha, --beta, --latest');
|
|
81
86
|
process.exit(1);
|
|
82
87
|
}
|
|
83
88
|
if (!validateBundle()) {
|
|
@@ -87,40 +92,76 @@ export async function publishProject(options) {
|
|
|
87
92
|
const pJson = JSON.parse(readFileSync(pJsonPath, 'utf-8'));
|
|
88
93
|
const { name, version } = pJson;
|
|
89
94
|
const tag = options.alpha ? 'alpha' : options.beta ? 'beta' : options.latest ? 'latest' : 'latest';
|
|
90
|
-
const
|
|
91
|
-
type: 'text',
|
|
92
|
-
name: 'targetVersion',
|
|
95
|
+
const targetVersion = handleCancel(await text({
|
|
93
96
|
message: 'Version:',
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
placeholder: version,
|
|
98
|
+
defaultValue: version,
|
|
99
|
+
validate: (value) => {
|
|
100
|
+
if (!semver.valid(value)) {
|
|
101
|
+
return 'Invalid version format. Please use semver (e.g. 1.0.0)';
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
},
|
|
105
|
+
}));
|
|
106
|
+
// Validate version doesn't already exist
|
|
107
|
+
const versionValid = await validateVersion(name, targetVersion);
|
|
108
|
+
if (!versionValid) {
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
const action = handleCancel(await select({
|
|
100
112
|
message: `Publishing ${name}@${targetVersion} (${tag}). Pick an action:`,
|
|
101
|
-
|
|
102
|
-
{
|
|
103
|
-
{
|
|
113
|
+
options: [
|
|
114
|
+
{ value: 'publish', label: 'Publish' },
|
|
115
|
+
{ value: 'cancel', label: 'Cancel' },
|
|
104
116
|
],
|
|
105
|
-
}
|
|
106
|
-
if (action === 'cancel'
|
|
107
|
-
|
|
108
|
-
process.exit(
|
|
117
|
+
}));
|
|
118
|
+
if (action === 'cancel') {
|
|
119
|
+
showCancel('Operation cancelled');
|
|
120
|
+
process.exit(0);
|
|
109
121
|
}
|
|
110
122
|
if (action === 'publish') {
|
|
111
123
|
try {
|
|
112
|
-
|
|
124
|
+
log.info('Updating package version...');
|
|
113
125
|
pJson.version = targetVersion;
|
|
126
|
+
// Publish platform packages first
|
|
127
|
+
const platformsDir = resolve(process.cwd(), 'bundle', 'platforms');
|
|
128
|
+
if (existsSync(platformsDir)) {
|
|
129
|
+
const platformDirs = readdirSync(platformsDir, { withFileTypes: true })
|
|
130
|
+
.filter((d) => d.isDirectory())
|
|
131
|
+
.map((d) => d.name);
|
|
132
|
+
if (platformDirs.length > 0) {
|
|
133
|
+
log.info('Publishing platform packages...');
|
|
134
|
+
for (const dir of platformDirs) {
|
|
135
|
+
const platformDir = resolve(platformsDir, dir);
|
|
136
|
+
const platformPkgPath = resolve(platformDir, 'package.json');
|
|
137
|
+
const platformPkgContent = await readFile(platformPkgPath, 'utf-8');
|
|
138
|
+
const platformPkg = JSON.parse(platformPkgContent);
|
|
139
|
+
// Update version to match target version
|
|
140
|
+
platformPkg.version = targetVersion;
|
|
141
|
+
await writeFile(platformPkgPath, JSON.stringify(platformPkg, null, 2));
|
|
142
|
+
log.info(` Publishing ${platformPkg.name}@${targetVersion}...`);
|
|
143
|
+
process.env.SAFE_PUBLISH = 'true';
|
|
144
|
+
await spawnPromise('npm', ['publish', '--tag', tag], platformDir);
|
|
145
|
+
log.success(` Published ${platformPkg.name}@${targetVersion}`);
|
|
146
|
+
}
|
|
147
|
+
// Update optionalDependencies versions in main package
|
|
148
|
+
if (pJson.optionalDependencies) {
|
|
149
|
+
for (const dep of Object.keys(pJson.optionalDependencies)) {
|
|
150
|
+
pJson.optionalDependencies[dep] = targetVersion;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
114
155
|
await writeFile(pJsonPath, JSON.stringify(pJson, null, 2));
|
|
115
|
-
|
|
156
|
+
log.info('Publishing to npm...');
|
|
116
157
|
process.env.SAFE_PUBLISH = 'true';
|
|
117
158
|
const args = ['publish', '--tag', tag];
|
|
118
159
|
await spawnPromise('npm', args, resolve(process.cwd(), 'bundle'));
|
|
119
|
-
|
|
160
|
+
showOutro(`Successfully published ${name}@${targetVersion}`);
|
|
120
161
|
}
|
|
121
162
|
catch (error) {
|
|
122
|
-
|
|
123
|
-
|
|
163
|
+
log.error('Failed to publish package');
|
|
164
|
+
log.error(error.message);
|
|
124
165
|
process.exit(1);
|
|
125
166
|
}
|
|
126
167
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
|
+
import { artifactsCommand } from './commands/artifacts.js';
|
|
3
4
|
import { buildProject } from './commands/bundle.js';
|
|
4
5
|
import { createProject } from './commands/create.js';
|
|
5
6
|
import { publishProject } from './commands/publish.js';
|
|
6
|
-
import { initBanner } from './utils/banners.js';
|
|
7
7
|
import pJson from './utils/pjson.js';
|
|
8
8
|
const program = new Command();
|
|
9
|
-
initBanner();
|
|
10
9
|
program.name('cui').version(pJson.version);
|
|
11
10
|
program
|
|
12
11
|
.command('bundle')
|
|
13
12
|
.description('Bundle the project')
|
|
14
|
-
.
|
|
15
|
-
|
|
13
|
+
.option('-t, --target <goos-goarch>', 'Restrict the Go build to a single target (e.g. linux-amd64) — used by CI matrix jobs')
|
|
14
|
+
.action(async (options) => {
|
|
15
|
+
await buildProject({ target: options.target });
|
|
16
|
+
});
|
|
17
|
+
program
|
|
18
|
+
.command('artifacts')
|
|
19
|
+
.description('Aggregate per-platform binaries downloaded from CI matrix jobs into a publish-ready bundle (Go plugins only)')
|
|
20
|
+
.option('-d, --dir <path>', 'Directory containing downloaded artifacts (default: ./artifacts)')
|
|
21
|
+
.action(async (options) => {
|
|
22
|
+
await artifactsCommand({ dir: options.dir });
|
|
16
23
|
});
|
|
17
24
|
program
|
|
18
25
|
.command('create <project-name>')
|
package/dist/index.js.map
CHANGED
|
@@ -1 +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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,MAAM,kBAAkB,CAAC;AAErC,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,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,4BAA4B,EAAE,sFAAsF,CAAC;KAC5H,MAAM,CAAC,KAAK,EAAE,OAA4B,EAAE,EAAE;IAC7C,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AACjD,CAAC,CAAC,CAAC;AAEL,OAAO;KACJ,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,8GAA8G,CAAC;KAC3H,MAAM,CAAC,kBAAkB,EAAE,kEAAkE,CAAC;KAC9F,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;IAC1C,MAAM,gBAAgB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAC/C,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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,9 +1,21 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
export
|
|
1
|
+
import type { PythonVersion, SensorType } from '@camera.ui/sdk';
|
|
2
|
+
export type PluginLanguage = 'python' | 'typescript' | 'go';
|
|
3
|
+
export interface GoTarget {
|
|
4
|
+
goos: 'linux' | 'darwin' | 'windows';
|
|
5
|
+
goarch: 'amd64' | 'arm64';
|
|
6
|
+
cgoEnabled?: '0' | '1';
|
|
7
|
+
cc?: string;
|
|
8
|
+
ldflags?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface GoBuildOptions {
|
|
11
|
+
targets?: GoTarget[];
|
|
12
|
+
ldflags?: string;
|
|
13
|
+
cgoEnabled?: '0' | '1';
|
|
14
|
+
env?: Record<string, string>;
|
|
15
|
+
}
|
|
4
16
|
export interface CameraUiBuildOptions {
|
|
5
17
|
rootDir?: string;
|
|
6
|
-
input?:
|
|
18
|
+
input?: string | string[];
|
|
7
19
|
mode?: 'development' | 'production';
|
|
8
20
|
additionalFiles?: string[] | {
|
|
9
21
|
source: string;
|
|
@@ -11,13 +23,17 @@ export interface CameraUiBuildOptions {
|
|
|
11
23
|
}[];
|
|
12
24
|
external?: (string | RegExp)[];
|
|
13
25
|
language?: PluginLanguage;
|
|
26
|
+
go?: GoBuildOptions;
|
|
14
27
|
}
|
|
28
|
+
export type PluginRole = 'provider' | 'consumer' | 'both';
|
|
15
29
|
export interface CreateOptions {
|
|
16
30
|
displayName: string;
|
|
17
31
|
language: PluginLanguage;
|
|
18
32
|
pythonVersion?: PythonVersion;
|
|
19
33
|
quality: boolean;
|
|
20
|
-
|
|
34
|
+
role: PluginRole;
|
|
35
|
+
provides: SensorType[];
|
|
36
|
+
consumes: SensorType[];
|
|
21
37
|
}
|
|
22
38
|
export interface PublishOptions {
|
|
23
39
|
alpha?: boolean;
|
package/dist/utils/banners.d.ts
CHANGED