@camera.ui/cli 0.0.49 → 0.0.51

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 (54) hide show
  1. package/LICENSE.md +1 -1
  2. package/README.md +10 -1
  3. package/dist/commands/artifacts.d.ts +9 -0
  4. package/dist/commands/artifacts.js +116 -0
  5. package/dist/commands/artifacts.js.map +1 -0
  6. package/dist/commands/bundle.d.ts +34 -1
  7. package/dist/commands/bundle.js +402 -57
  8. package/dist/commands/bundle.js.map +1 -1
  9. package/dist/commands/create.js +140 -93
  10. package/dist/commands/create.js.map +1 -1
  11. package/dist/commands/publish.js +95 -39
  12. package/dist/commands/publish.js.map +1 -1
  13. package/dist/index.js +13 -4
  14. package/dist/index.js.map +1 -1
  15. package/dist/types.d.ts +24 -5
  16. package/dist/utils/banners.d.ts +3 -1
  17. package/dist/utils/banners.js +15 -11
  18. package/dist/utils/banners.js.map +1 -1
  19. package/dist/utils/logger.d.ts +12 -24
  20. package/dist/utils/logger.js +57 -83
  21. package/dist/utils/logger.js.map +1 -1
  22. package/dist/utils/parser.d.ts +11 -4
  23. package/dist/utils/parser.js +27 -185
  24. package/dist/utils/parser.js.map +1 -1
  25. package/dist/utils/templates.d.ts +13 -1
  26. package/dist/utils/templates.js +148 -68
  27. package/dist/utils/templates.js.map +1 -1
  28. package/dist/utils/utils.js +13 -11
  29. package/dist/utils/utils.js.map +1 -1
  30. package/dist/utils/versions.js +1 -2
  31. package/dist/utils/versions.js.map +1 -1
  32. package/package.json +29 -43
  33. package/templates/base/README.md +2 -2
  34. package/templates/base/SECURITY.md +1 -1
  35. package/templates/base/package.json +2 -3
  36. package/templates/base/updates.config.js +1 -1
  37. package/templates/go/go.mod +5 -0
  38. package/templates/go/postinstall.js +85 -0
  39. package/templates/go/src/main.go +51 -0
  40. package/templates/python/requirements.txt +1 -1
  41. package/templates/python/ruff.toml +2 -2
  42. package/templates/python/src/main.py +299 -28
  43. package/templates/typescript/contract.ts +36 -0
  44. package/templates/typescript/eslint.config.js +13 -3
  45. package/templates/typescript/package.eslint.json +2 -2
  46. package/templates/typescript/package.json +4 -4
  47. package/templates/typescript/src/index.ts +96 -27
  48. package/templates/typescript/src/sensor.ts +207 -0
  49. package/CHANGELOG.md +0 -8
  50. package/CONTRIBUTING.md +0 -1
  51. package/scripts/chmod.js +0 -17
  52. package/templates/base/cameraui.config.js +0 -10
  53. package/templates/base/eslint.config.js +0 -64
  54. package/templates/base/src/index.js +0 -41
package/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023-2024 seydx <dev@seydx.com>
3
+ Copyright (c) 2023-2026 seydx <hi@seydx.dev>
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
package/README.md CHANGED
@@ -1 +1,10 @@
1
- # @camera.ui/cli
1
+ # @camera.ui/cli
2
+
3
+ [![npm](https://img.shields.io/npm/v/@camera.ui/cli?label=npm&logo=npm)](https://www.npmjs.com/package/@camera.ui/cli)
4
+ [![License](https://img.shields.io/github/license/cameraui/cli)](LICENSE.md)
5
+
6
+ The camera.ui CLI — scaffold, build and publish camera.ui plugins.
7
+
8
+ ---
9
+
10
+ *Part of the camera.ui ecosystem - A comprehensive camera management solution.*
@@ -0,0 +1,9 @@
1
+ import type { GoTarget } from '../types.js';
2
+ export interface ArtifactsOptions {
3
+ dir?: string;
4
+ }
5
+ export interface DiscoveredBinary {
6
+ target: GoTarget;
7
+ sourcePath: string;
8
+ }
9
+ export declare function artifactsCommand(options?: ArtifactsOptions): Promise<void>;
@@ -0,0 +1,116 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { mkdir, readdir, readFile, rename } from 'node:fs/promises';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { showIntro, showOutro } from '../utils/banners.js';
5
+ import * as log from '../utils/logger.js';
6
+ import { parseConfig } from '../utils/parser.js';
7
+ import { detectLanguage, ensureDir } from '../utils/utils.js';
8
+ import { finalizeBundle, stagePlatformPackages, targetKey } from './bundle.js';
9
+ async function discoverBinaries(artifactsDir, pluginName, knownTargets) {
10
+ const found = [];
11
+ // Map each canonical key (incl. -musl) back to its target so we recover the
12
+ // full target (libc and all) instead of re-parsing the name.
13
+ const byKey = new Map(knownTargets.map((t) => [targetKey(t), t]));
14
+ async function walk(dir) {
15
+ const entries = await readdir(dir, { withFileTypes: true });
16
+ for (const entry of entries) {
17
+ const fullPath = resolve(dir, entry.name);
18
+ if (entry.isDirectory()) {
19
+ await walk(fullPath);
20
+ continue;
21
+ }
22
+ // Match `<pluginName>-<key>` or `<pluginName>-<key>.exe`, where key is
23
+ // `<goos>-<goarch>[-musl]`.
24
+ const stripped = entry.name.endsWith('.exe') ? entry.name.slice(0, -4) : entry.name;
25
+ const prefix = `${pluginName}-`;
26
+ if (!stripped.startsWith(prefix))
27
+ continue;
28
+ const rest = stripped.slice(prefix.length);
29
+ const target = byKey.get(rest);
30
+ if (!target)
31
+ continue;
32
+ found.push({ target, sourcePath: fullPath });
33
+ }
34
+ }
35
+ if (!existsSync(artifactsDir)) {
36
+ throw new Error(`Artifacts directory not found: ${artifactsDir}`);
37
+ }
38
+ await walk(artifactsDir);
39
+ return found;
40
+ }
41
+ export async function artifactsCommand(options = {}) {
42
+ const startTime = Date.now();
43
+ showIntro();
44
+ const artifactsDir = resolve(process.cwd(), options.dir ?? 'artifacts');
45
+ log.info(`Aggregating artifacts from: ${artifactsDir}`);
46
+ const { userConfig, targetRootDir } = await parseConfig();
47
+ const rootDir = userConfig.rootDir ? resolve(process.cwd(), userConfig.rootDir) : process.cwd();
48
+ const pluginLanguage = userConfig.language ?? (await detectLanguage(rootDir));
49
+ if (pluginLanguage !== 'go') {
50
+ throw new Error(`'artifacts' command is only supported for Go plugins (detected: ${pluginLanguage})`);
51
+ }
52
+ const packageJsonPath = resolve(rootDir, 'package.json');
53
+ const packageJsonContent = await readFile(packageJsonPath, 'utf-8');
54
+ const packageJson = JSON.parse(packageJsonContent);
55
+ if (!packageJson.name) {
56
+ throw new Error('package.json is missing required "name" field.');
57
+ }
58
+ const pluginName = packageJson.name.replace(/^@[^/]+\//, '');
59
+ const packageScope = packageJson.name.includes('/') ? packageJson.name.split('/')[0] : undefined;
60
+ // The plugin's configured targets are the source of truth for which
61
+ // platforms it ships. If a binary for an unconfigured target shows up in
62
+ // the artifacts dir, it's silently skipped (operator error or stale CI run).
63
+ const goOpts = userConfig.go;
64
+ const knownTargets = goOpts?.targets ?? [];
65
+ if (knownTargets.length === 0) {
66
+ throw new Error("No `go.targets` configured in cameraui.config.ts — can't determine which artifacts to consume.");
67
+ }
68
+ const discovered = await discoverBinaries(artifactsDir, pluginName, knownTargets);
69
+ if (discovered.length === 0) {
70
+ throw new Error(`No matching binaries found in ${artifactsDir} (looking for "${pluginName}-<goos>-<goarch>[-musl][.exe]")`);
71
+ }
72
+ log.info(`Found ${discovered.length}/${knownTargets.length} target binaries:`);
73
+ for (const b of discovered) {
74
+ log.info(` ${targetKey(b.target)}`);
75
+ }
76
+ const missingTargets = knownTargets.filter((t) => !discovered.some((d) => targetKey(d.target) === targetKey(t)));
77
+ if (missingTargets.length > 0) {
78
+ log.error(` Missing: ${missingTargets.map((t) => targetKey(t)).join(', ')}`);
79
+ throw new Error('Some target binaries are missing — refusing to ship a partial bundle.');
80
+ }
81
+ // Stage binaries into bundle/dist/bin/ with the canonical naming convention
82
+ // `<pluginName>-<key>[.exe]`, then hand off to the same staging routine that
83
+ // the multi-target build uses.
84
+ const bundleDir = resolve(targetRootDir, 'bundle');
85
+ const binDir = resolve(bundleDir, 'dist', 'bin');
86
+ await ensureDir(binDir);
87
+ for (const b of discovered) {
88
+ const ext = b.target.goos === 'windows' ? '.exe' : '';
89
+ const targetPath = resolve(binDir, `${pluginName}-${targetKey(b.target)}${ext}`);
90
+ await mkdir(dirname(targetPath), { recursive: true });
91
+ await rename(b.sourcePath, targetPath);
92
+ }
93
+ await stagePlatformPackages({
94
+ targets: knownTargets,
95
+ binDir,
96
+ bundleDir,
97
+ pluginName,
98
+ packageScope,
99
+ packageJson,
100
+ rootDir,
101
+ });
102
+ await finalizeBundle({
103
+ targetRootDir,
104
+ bundleDir,
105
+ rootDir,
106
+ pluginLanguage,
107
+ external: Array.isArray(userConfig.external) ? userConfig.external : [],
108
+ additionalFiles: userConfig.additionalFiles,
109
+ goTargets: knownTargets,
110
+ isDev: false,
111
+ });
112
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
113
+ log.success(`Artifacts aggregated in ${elapsed}s — bundle/ is ready to publish`);
114
+ showOutro('Done');
115
+ }
116
+ //# sourceMappingURL=artifacts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifacts.js","sourceRoot":"","sources":["../../src/commands/artifacts.ts"],"names":[],"mappings":"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"}
@@ -1 +1,34 @@
1
- export declare function buildProject(): Promise<void>;
1
+ import type { GoTarget, PluginLanguage } from '../types.js';
2
+ export declare function targetKey(t: Pick<GoTarget, 'goos' | 'goarch' | 'libc'>): string;
3
+ export interface StagePlatformPackagesArgs {
4
+ targets: GoTarget[];
5
+ binDir: string;
6
+ bundleDir: string;
7
+ pluginName: string;
8
+ packageScope?: string;
9
+ packageJson: {
10
+ version?: string;
11
+ license?: string;
12
+ [key: string]: unknown;
13
+ };
14
+ rootDir: string;
15
+ }
16
+ export declare function stagePlatformPackages(args: StagePlatformPackagesArgs): Promise<void>;
17
+ export interface FinalizeBundleArgs {
18
+ targetRootDir: string;
19
+ bundleDir: string;
20
+ rootDir: string;
21
+ pluginLanguage: PluginLanguage;
22
+ external: (string | RegExp)[];
23
+ additionalFiles?: string[] | {
24
+ source: string;
25
+ target: string;
26
+ }[];
27
+ goTargets?: GoTarget[];
28
+ isDev: boolean;
29
+ }
30
+ export declare function finalizeBundle(args: FinalizeBundleArgs): Promise<void>;
31
+ export interface BuildOptions {
32
+ target?: string;
33
+ }
34
+ export declare function buildProject(options?: BuildOptions): Promise<void>;