@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.
- package/LICENSE.md +1 -1
- package/README.md +10 -1
- package/dist/commands/artifacts.d.ts +9 -0
- package/dist/commands/artifacts.js +116 -0
- package/dist/commands/artifacts.js.map +1 -0
- package/dist/commands/bundle.d.ts +34 -1
- package/dist/commands/bundle.js +402 -57
- 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 +95 -39
- package/dist/commands/publish.js.map +1 -1
- package/dist/index.js +13 -4
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +24 -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 +85 -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/types.d.ts
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
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
|
+
libc?: 'glibc' | 'musl';
|
|
7
|
+
cgoEnabled?: '0' | '1';
|
|
8
|
+
cc?: string;
|
|
9
|
+
ldflags?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface GoBuildOptions {
|
|
12
|
+
targets?: GoTarget[];
|
|
13
|
+
ldflags?: string;
|
|
14
|
+
cgoEnabled?: '0' | '1';
|
|
15
|
+
env?: Record<string, string>;
|
|
16
|
+
}
|
|
4
17
|
export interface CameraUiBuildOptions {
|
|
5
18
|
rootDir?: string;
|
|
6
|
-
input?:
|
|
19
|
+
input?: string | string[];
|
|
7
20
|
mode?: 'development' | 'production';
|
|
8
21
|
additionalFiles?: string[] | {
|
|
9
22
|
source: string;
|
|
@@ -11,16 +24,22 @@ export interface CameraUiBuildOptions {
|
|
|
11
24
|
}[];
|
|
12
25
|
external?: (string | RegExp)[];
|
|
13
26
|
language?: PluginLanguage;
|
|
27
|
+
go?: GoBuildOptions;
|
|
14
28
|
}
|
|
29
|
+
export type PluginRole = 'provider' | 'consumer' | 'both';
|
|
15
30
|
export interface CreateOptions {
|
|
16
31
|
displayName: string;
|
|
17
32
|
language: PluginLanguage;
|
|
18
33
|
pythonVersion?: PythonVersion;
|
|
19
34
|
quality: boolean;
|
|
20
|
-
|
|
35
|
+
role: PluginRole;
|
|
36
|
+
provides: SensorType[];
|
|
37
|
+
consumes: SensorType[];
|
|
21
38
|
}
|
|
22
39
|
export interface PublishOptions {
|
|
23
40
|
alpha?: boolean;
|
|
24
41
|
beta?: boolean;
|
|
25
42
|
latest?: boolean;
|
|
43
|
+
yes?: boolean;
|
|
44
|
+
provenance?: boolean;
|
|
26
45
|
}
|
package/dist/utils/banners.d.ts
CHANGED
package/dist/utils/banners.js
CHANGED
|
@@ -1,17 +1,21 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
])(defaultBanner);
|
|
1
|
+
import { cancel, intro, outro } from '@clack/prompts';
|
|
2
|
+
import pc from 'picocolors';
|
|
3
|
+
const defaultBanner = 'camera.ui - Plugin Development CLI';
|
|
4
|
+
const gradientBanner =
|
|
5
|
+
// eslint-disable-next-line @stylistic/max-len
|
|
6
|
+
'\x1B[38;2;223;42;76mc\x1B[39m\x1B[38;2;223;42;76ma\x1B[39m\x1B[38;2;223;42;76mm\x1B[39m\x1B[38;2;223;42;76me\x1B[39m\x1B[38;2;223;48;82mr\x1B[39m\x1B[38;2;224;54;87ma\x1B[39m\x1B[38;2;224;59;92m.\x1B[39m\x1B[38;2;225;65;97mu\x1B[39m\x1B[38;2;225;71;102mi\x1B[39m \x1B[38;2;226;77;107m-\x1B[39m \x1B[38;2;226;82;112mP\x1B[39m\x1B[38;2;227;88;117ml\x1B[39m\x1B[38;2;227;94;122mu\x1B[39m\x1B[38;2;228;100;127mg\x1B[39m\x1B[38;2;228;105;132mi\x1B[39m\x1B[38;2;229;111;137mn\x1B[39m \x1B[38;2;229;117;142mD\x1B[39m\x1B[38;2;230;123;147me\x1B[39m\x1B[38;2;230;128;152mv\x1B[39m\x1B[38;2;231;134;157me\x1B[39m\x1B[38;2;231;140;162ml\x1B[39m\x1B[38;2;232;144;164mo\x1B[39m\x1B[38;2;232;144;164mp\x1B[39m\x1B[38;2;232;144;164mm\x1B[39m\x1B[38;2;232;144;164me\x1B[39m\x1B[38;2;232;144;164mn\x1B[39m\x1B[38;2;232;144;164mt\x1B[39m \x1B[38;2;232;144;164mC\x1B[39m\x1B[38;2;232;144;164mL\x1B[39m\x1B[38;2;232;144;164mI\x1B[39m';
|
|
8
7
|
function useGradient() {
|
|
9
8
|
return process.stdout.isTTY && process.stdout.getColorDepth() > 8;
|
|
10
9
|
}
|
|
11
|
-
export function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
10
|
+
export function showIntro() {
|
|
11
|
+
const banner = useGradient() ? gradientBanner : defaultBanner;
|
|
12
|
+
intro(banner);
|
|
13
|
+
}
|
|
14
|
+
export function showOutro(message) {
|
|
15
|
+
outro(message);
|
|
16
|
+
}
|
|
17
|
+
export function showCancel(message) {
|
|
18
|
+
cancel(pc.red('✖') + (message ? ` ${message}` : ' Operation cancelled'));
|
|
15
19
|
}
|
|
16
20
|
export function getBanner() {
|
|
17
21
|
return useGradient() ? gradientBanner : defaultBanner;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../src/utils/banners.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"banners.js","sourceRoot":"","sources":["../../src/utils/banners.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,aAAa,GAAG,oCAAoC,CAAC;AAE3D,MAAM,cAAc;AAClB,8CAA8C;AAC9C,m5BAAm5B,CAAC;AAEt5B,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;IAC9D,KAAK,CAAC,MAAM,CAAC,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,KAAK,CAAC,OAAO,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,WAAW,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC;AACxD,CAAC"}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -1,24 +1,12 @@
|
|
|
1
|
-
declare
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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 {};
|
|
1
|
+
export declare function info(message: string): void;
|
|
2
|
+
export declare function success(message: string): void;
|
|
3
|
+
export declare function warn(message: string): void;
|
|
4
|
+
export declare function error(message: string): void;
|
|
5
|
+
export declare function debug(message: string): void;
|
|
6
|
+
export declare function step(current: number, total: number, message: string): void;
|
|
7
|
+
export declare function fileOperation(type: 'file' | 'dir', path: string, copied: boolean): void;
|
|
8
|
+
export declare function missingFile(file: string): void;
|
|
9
|
+
export declare function outputFiles(files: string[]): void;
|
|
10
|
+
export declare function buildSuccess(outDir: string, durationMs?: number): void;
|
|
11
|
+
export declare function buildError(err: Error | unknown): void;
|
|
12
|
+
export declare function bundleSize(sizeMb: number): void;
|
package/dist/utils/logger.js
CHANGED
|
@@ -1,91 +1,65 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
console.log(
|
|
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
|
-
});
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
export function info(message) {
|
|
3
|
+
console.log(pc.blue('ℹ') + ' ' + message);
|
|
4
|
+
}
|
|
5
|
+
export function success(message) {
|
|
6
|
+
console.log(pc.green('✔') + ' ' + message);
|
|
7
|
+
}
|
|
8
|
+
export function warn(message) {
|
|
9
|
+
console.log(pc.yellow('⚠') + ' ' + message);
|
|
10
|
+
}
|
|
11
|
+
export function error(message) {
|
|
12
|
+
console.log(pc.red('✖') + ' ' + message);
|
|
13
|
+
}
|
|
14
|
+
export function debug(message) {
|
|
15
|
+
console.log(pc.dim(message));
|
|
16
|
+
}
|
|
17
|
+
export function step(current, total, message) {
|
|
18
|
+
const prefix = pc.dim(`[${current}/${total}]`);
|
|
19
|
+
console.log(`${prefix} ${message}`);
|
|
20
|
+
}
|
|
21
|
+
export function fileOperation(type, path, copied) {
|
|
22
|
+
if (copied) {
|
|
23
|
+
const icon = type === 'file' ? '📄' : '📁';
|
|
24
|
+
console.log(` ${icon} ${pc.dim(`Copied ${type}: ${path}`)}`);
|
|
61
25
|
}
|
|
62
|
-
|
|
63
|
-
console.log('
|
|
64
|
-
console.log(chalk.dim(`Output directory: ${outDir}\n`));
|
|
26
|
+
else {
|
|
27
|
+
console.log(` ${pc.red('✖')} ${pc.dim(`Failed to copy ${path}`)}`);
|
|
65
28
|
}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
29
|
+
}
|
|
30
|
+
export function missingFile(file) {
|
|
31
|
+
console.log(` ${pc.yellow('⚠')} ${pc.dim(`Missing file: ${file}`)}`);
|
|
32
|
+
}
|
|
33
|
+
export function outputFiles(files) {
|
|
34
|
+
console.log(pc.dim('\nGenerated files:'));
|
|
35
|
+
for (const file of files) {
|
|
36
|
+
console.log(` ${pc.cyan('•')} ${file}`);
|
|
74
37
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
38
|
+
}
|
|
39
|
+
export function buildSuccess(outDir, durationMs) {
|
|
40
|
+
console.log();
|
|
41
|
+
console.log(pc.green('✨ Build completed successfully!'));
|
|
42
|
+
console.log(pc.dim(`Output directory: ${outDir}`));
|
|
43
|
+
if (durationMs !== undefined) {
|
|
44
|
+
console.log(pc.dim(`Duration: ${durationMs}ms`));
|
|
45
|
+
}
|
|
46
|
+
console.log();
|
|
47
|
+
}
|
|
48
|
+
export function buildError(err) {
|
|
49
|
+
error('Build failed');
|
|
50
|
+
console.error(pc.dim('\nError details:'));
|
|
51
|
+
if (err instanceof Error) {
|
|
52
|
+
console.error(pc.red(err.message));
|
|
53
|
+
if ('frame' in err) {
|
|
54
|
+
console.error('\n' + pc.yellow('Error location:'));
|
|
55
|
+
console.error(pc.dim(err.frame));
|
|
79
56
|
}
|
|
80
57
|
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
this.spinner = ora({
|
|
84
|
-
text: message,
|
|
85
|
-
color: 'blue',
|
|
86
|
-
}).start();
|
|
87
|
-
this.isSpinning = true;
|
|
58
|
+
else {
|
|
59
|
+
console.error(pc.red(String(err)));
|
|
88
60
|
}
|
|
89
61
|
}
|
|
90
|
-
export
|
|
62
|
+
export function bundleSize(sizeMb) {
|
|
63
|
+
console.log(pc.dim(`Bundle size: ${sizeMb.toFixed(2)} MB`));
|
|
64
|
+
}
|
|
91
65
|
//# sourceMappingURL=logger.js.map
|
package/dist/utils/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/parser.d.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import type { Configuration } from 'webpack';
|
|
2
1
|
import type { CameraUiBuildOptions } from '../types.js';
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
type ProjectType = 'javascript-cjs' | 'javascript-esm' | 'typescript-cjs' | 'typescript-esm';
|
|
3
|
+
export declare function detectJsProjectType(rootDir: string): Promise<ProjectType>;
|
|
4
|
+
export declare function loadConfig(): Promise<CameraUiBuildOptions>;
|
|
5
|
+
export interface ParsedConfig {
|
|
5
6
|
userConfig: CameraUiBuildOptions;
|
|
6
|
-
|
|
7
|
+
projectType: ProjectType;
|
|
8
|
+
targetRootDir: string;
|
|
9
|
+
entryPoint: string;
|
|
10
|
+
outputFile: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function parseConfig(): Promise<ParsedConfig>;
|
|
13
|
+
export {};
|
package/dist/utils/parser.js
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { pathExists } from 'fs-extra/esm';
|
|
2
2
|
import { readFile, rm } from 'node:fs/promises';
|
|
3
3
|
import { isAbsolute, resolve } from 'node:path';
|
|
4
|
-
import { SwcMinifyWebpackPlugin } from 'swc-minify-webpack-plugin';
|
|
5
4
|
import * as tsImport from 'ts-import';
|
|
6
|
-
import
|
|
7
|
-
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
|
|
8
|
-
import { logger } from './logger.js';
|
|
9
|
-
import { moduleResolver } from './moduleResolve.js';
|
|
5
|
+
import { error } from './logger.js';
|
|
10
6
|
import { detectLanguage } from './utils.js';
|
|
11
|
-
async function
|
|
7
|
+
async function fileExists(path) {
|
|
8
|
+
try {
|
|
9
|
+
await readFile(path);
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export async function detectJsProjectType(rootDir) {
|
|
12
17
|
try {
|
|
13
18
|
const pluginLanguage = await detectLanguage(rootDir);
|
|
14
19
|
if (pluginLanguage === 'python') {
|
|
@@ -23,16 +28,7 @@ async function detectJsProjectType(rootDir) {
|
|
|
23
28
|
return 'javascript-cjs';
|
|
24
29
|
}
|
|
25
30
|
}
|
|
26
|
-
async function
|
|
27
|
-
try {
|
|
28
|
-
await readFile(path);
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return false;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
async function loadConfig() {
|
|
31
|
+
export async function loadConfig() {
|
|
36
32
|
const tsConfigPath = resolve(process.cwd(), 'cameraui.config.ts');
|
|
37
33
|
const jsConfigPath = resolve(process.cwd(), 'cameraui.config.js');
|
|
38
34
|
try {
|
|
@@ -48,189 +44,35 @@ async function loadConfig() {
|
|
|
48
44
|
}
|
|
49
45
|
return {};
|
|
50
46
|
}
|
|
51
|
-
catch (
|
|
52
|
-
|
|
47
|
+
catch (err) {
|
|
48
|
+
error(`Failed to load config: ${err instanceof Error ? err.message : String(err)}`);
|
|
53
49
|
return {};
|
|
54
50
|
}
|
|
55
51
|
}
|
|
56
|
-
async function getModuleRules(projectType, targetRootDir) {
|
|
57
|
-
const rules = [];
|
|
58
|
-
const isTypeScript = projectType.startsWith('typescript');
|
|
59
|
-
if (isTypeScript) {
|
|
60
|
-
rules.push({
|
|
61
|
-
test: /\.ts$/,
|
|
62
|
-
exclude: /node_modules/,
|
|
63
|
-
use: [
|
|
64
|
-
{
|
|
65
|
-
loader: await moduleResolver.resolveModule('ts-loader'),
|
|
66
|
-
options: {
|
|
67
|
-
configFile: resolve(targetRootDir, 'tsconfig.json'),
|
|
68
|
-
transpileOnly: true,
|
|
69
|
-
compilerOptions: {
|
|
70
|
-
module: 'esnext',
|
|
71
|
-
moduleResolution: 'node',
|
|
72
|
-
},
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
loader: await moduleResolver.resolveModule('babel-loader'),
|
|
77
|
-
options: {
|
|
78
|
-
presets: [
|
|
79
|
-
await moduleResolver.resolveBabelModule('@babel/preset-env', {
|
|
80
|
-
config: {
|
|
81
|
-
targets: { node: '22' },
|
|
82
|
-
modules: false,
|
|
83
|
-
},
|
|
84
|
-
}),
|
|
85
|
-
await moduleResolver.resolveBabelModule('@babel/preset-typescript'),
|
|
86
|
-
],
|
|
87
|
-
plugins: [
|
|
88
|
-
await moduleResolver.resolveBabelModule('@babel/plugin-transform-typescript', {
|
|
89
|
-
config: { allowDeclareFields: true },
|
|
90
|
-
}),
|
|
91
|
-
],
|
|
92
|
-
},
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
rules.push({
|
|
98
|
-
test: /\.js$/,
|
|
99
|
-
exclude: /node_modules/,
|
|
100
|
-
type: 'javascript/esm',
|
|
101
|
-
use: {
|
|
102
|
-
loader: await moduleResolver.resolveModule('babel-loader'),
|
|
103
|
-
options: {
|
|
104
|
-
presets: [
|
|
105
|
-
await moduleResolver.resolveBabelModule('@babel/preset-env', {
|
|
106
|
-
config: {
|
|
107
|
-
targets: { node: '22' },
|
|
108
|
-
modules: false,
|
|
109
|
-
},
|
|
110
|
-
}),
|
|
111
|
-
],
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
rules.push({
|
|
116
|
-
test: /\.node$/,
|
|
117
|
-
loader: await moduleResolver.resolveModule('node-loader'),
|
|
118
|
-
});
|
|
119
|
-
rules.push({
|
|
120
|
-
test: /\.json$/,
|
|
121
|
-
type: 'json',
|
|
122
|
-
});
|
|
123
|
-
return rules;
|
|
124
|
-
}
|
|
125
52
|
export async function parseConfig() {
|
|
126
53
|
const userConfig = await loadConfig();
|
|
127
54
|
const cliRootDir = process.cwd();
|
|
128
55
|
const targetRootDir = userConfig.rootDir ? (isAbsolute(userConfig.rootDir) ? userConfig.rootDir : resolve(cliRootDir, userConfig.rootDir)) : cliRootDir;
|
|
129
56
|
const projectType = await detectJsProjectType(targetRootDir);
|
|
130
57
|
const outputDir = resolve(targetRootDir, 'bundle', 'dist');
|
|
58
|
+
const isTypeScript = projectType.startsWith('typescript');
|
|
131
59
|
// Determine entry point
|
|
132
|
-
let
|
|
60
|
+
let entryPoint;
|
|
133
61
|
if (typeof userConfig.input === 'string') {
|
|
134
|
-
|
|
62
|
+
entryPoint = resolve(targetRootDir, userConfig.input);
|
|
135
63
|
}
|
|
136
|
-
else {
|
|
137
|
-
|
|
64
|
+
else if (Array.isArray(userConfig.input) && userConfig.input.length > 0) {
|
|
65
|
+
entryPoint = resolve(targetRootDir, userConfig.input[0]);
|
|
138
66
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
new webpack.ProgressPlugin(),
|
|
142
|
-
new webpack.optimize.LimitChunkCountPlugin({
|
|
143
|
-
maxChunks: 1,
|
|
144
|
-
}),
|
|
145
|
-
new webpack.DefinePlugin({
|
|
146
|
-
'process.env.NODE_ENV': JSON.stringify(userConfig.mode === 'development' ? 'development' : 'production'),
|
|
147
|
-
}),
|
|
148
|
-
];
|
|
149
|
-
if (userConfig.mode === 'development' && process.env.ANALYZE) {
|
|
150
|
-
plugins.push(new BundleAnalyzerPlugin({
|
|
151
|
-
generateStatsFile: true,
|
|
152
|
-
}));
|
|
67
|
+
else {
|
|
68
|
+
entryPoint = resolve(targetRootDir, isTypeScript ? 'src/index.ts' : 'src/index.js');
|
|
153
69
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
output: {
|
|
161
|
-
path: outputDir,
|
|
162
|
-
filename: 'index.js',
|
|
163
|
-
libraryTarget: 'commonjs2',
|
|
164
|
-
assetModuleFilename: '[path][name][ext]',
|
|
165
|
-
},
|
|
166
|
-
resolve: {
|
|
167
|
-
extensions: ['.ts', '.js', '.mjs', '.json'],
|
|
168
|
-
symlinks: true,
|
|
169
|
-
mainFields: ['node', 'module', 'main'],
|
|
170
|
-
extensionAlias: {
|
|
171
|
-
'.js': projectType.startsWith('typescript') ? ['.ts', '.js'] : ['.js'],
|
|
172
|
-
'.mjs': projectType.startsWith('typescript') ? ['.mts', '.mjs'] : ['.mjs'],
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
resolveLoader: {
|
|
176
|
-
modules: moduleResolver.getWebpackResolveConfig({
|
|
177
|
-
includeGlobalModules: false,
|
|
178
|
-
includeCliModules: false,
|
|
179
|
-
}).resolve.modules,
|
|
180
|
-
},
|
|
181
|
-
module: {
|
|
182
|
-
rules: moduleRules,
|
|
183
|
-
},
|
|
184
|
-
experiments: {
|
|
185
|
-
topLevelAwait: true,
|
|
186
|
-
},
|
|
187
|
-
externals: [
|
|
188
|
-
({ request }, callback) => {
|
|
189
|
-
if (!request) {
|
|
190
|
-
return callback();
|
|
191
|
-
}
|
|
192
|
-
if (request.endsWith('.node')) {
|
|
193
|
-
return callback(null, `commonjs ${request}`);
|
|
194
|
-
}
|
|
195
|
-
// Check user-defined externals if they exist
|
|
196
|
-
if (userConfig.external && userConfig.external?.length > 0) {
|
|
197
|
-
const isExternal = userConfig.external.some((ext) => {
|
|
198
|
-
if (typeof ext === 'string') {
|
|
199
|
-
return request === ext || request.startsWith(`${ext}/`);
|
|
200
|
-
}
|
|
201
|
-
return ext.test(request);
|
|
202
|
-
});
|
|
203
|
-
if (isExternal) {
|
|
204
|
-
return callback(null, `commonjs ${request}`);
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
callback();
|
|
208
|
-
},
|
|
209
|
-
],
|
|
210
|
-
devtool: userConfig.mode === 'development' ? 'source-map' : false,
|
|
211
|
-
optimization: {
|
|
212
|
-
minimize: userConfig.mode !== 'development',
|
|
213
|
-
minimizer: [
|
|
214
|
-
new SwcMinifyWebpackPlugin({
|
|
215
|
-
compress: {
|
|
216
|
-
typeofs: false,
|
|
217
|
-
},
|
|
218
|
-
module: true,
|
|
219
|
-
keep_classnames: true,
|
|
220
|
-
keep_fnames: true,
|
|
221
|
-
}),
|
|
222
|
-
],
|
|
223
|
-
},
|
|
224
|
-
plugins,
|
|
225
|
-
stats: {
|
|
226
|
-
colors: true,
|
|
227
|
-
errorDetails: true,
|
|
228
|
-
},
|
|
229
|
-
node: {
|
|
230
|
-
__dirname: false,
|
|
231
|
-
__filename: false,
|
|
232
|
-
},
|
|
70
|
+
return {
|
|
71
|
+
userConfig,
|
|
72
|
+
projectType,
|
|
73
|
+
targetRootDir,
|
|
74
|
+
entryPoint,
|
|
75
|
+
outputFile: resolve(outputDir, 'index.js'),
|
|
233
76
|
};
|
|
234
|
-
return { webpackConfig, userConfig };
|
|
235
77
|
}
|
|
236
78
|
//# sourceMappingURL=parser.js.map
|
package/dist/utils/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/utils/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,18 @@ export declare function createBaseFiles(targetDir: string, projectName: string,
|
|
|
3
3
|
export declare function createPackageJson(projectName: string, options: CreateOptions): Promise<any>;
|
|
4
4
|
export declare function createPythonRequirements(targetDir: string): Promise<void>;
|
|
5
5
|
export declare function createMyPyConfig(targetDir: string): Promise<void>;
|
|
6
|
-
export declare function createTsConfig(targetDir: string): Promise<void>;
|
|
6
|
+
export declare function createTsConfig(targetDir: string, options: CreateOptions): Promise<void>;
|
|
7
7
|
export declare function createCodeQualityConfig(targetDir: string, options: CreateOptions): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Create contract.ts at project root (always TypeScript, even for Python plugins)
|
|
10
|
+
* This file is bundled to contract.js during the bundle process
|
|
11
|
+
*/
|
|
12
|
+
export declare function createContractFile(targetDir: string, options: CreateOptions): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Create source files in src/ directory (no contract files here)
|
|
15
|
+
*/
|
|
8
16
|
export declare function createSourceFiles(targetDir: string, options: CreateOptions): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Create Go source files for a new Go plugin project
|
|
19
|
+
*/
|
|
20
|
+
export declare function createGoFiles(targetDir: string, projectName: string): Promise<void>;
|