@brookesia/pipeline 0.1.0
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/dist/bundle-config.d.ts +13 -0
- package/dist/bundle-config.d.ts.map +1 -0
- package/dist/bundle-config.js +70 -0
- package/dist/bundle-config.js.map +1 -0
- package/dist/bundle-config.test.d.ts +2 -0
- package/dist/bundle-config.test.d.ts.map +1 -0
- package/dist/bundle-config.test.js +33 -0
- package/dist/bundle-config.test.js.map +1 -0
- package/dist/context.d.ts +6 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lane.d.ts +4 -0
- package/dist/lane.d.ts.map +1 -0
- package/dist/lane.js +34 -0
- package/dist/lane.js.map +1 -0
- package/dist/lvgl-image-assets.d.ts +22 -0
- package/dist/lvgl-image-assets.d.ts.map +1 -0
- package/dist/lvgl-image-assets.js +165 -0
- package/dist/lvgl-image-assets.js.map +1 -0
- package/dist/lvgl-image-assets.test.d.ts +2 -0
- package/dist/lvgl-image-assets.test.d.ts.map +1 -0
- package/dist/lvgl-image-assets.test.js +56 -0
- package/dist/lvgl-image-assets.test.js.map +1 -0
- package/dist/package-exclude.d.ts +16 -0
- package/dist/package-exclude.d.ts.map +1 -0
- package/dist/package-exclude.js +42 -0
- package/dist/package-exclude.js.map +1 -0
- package/dist/package-exclude.test.d.ts +2 -0
- package/dist/package-exclude.test.d.ts.map +1 -0
- package/dist/package-exclude.test.js +30 -0
- package/dist/package-exclude.test.js.map +1 -0
- package/dist/steps/bundle-js.d.ts +3 -0
- package/dist/steps/bundle-js.d.ts.map +1 -0
- package/dist/steps/bundle-js.js +49 -0
- package/dist/steps/bundle-js.js.map +1 -0
- package/dist/steps/compile-wasm.d.ts +3 -0
- package/dist/steps/compile-wasm.d.ts.map +1 -0
- package/dist/steps/compile-wasm.js +37 -0
- package/dist/steps/compile-wasm.js.map +1 -0
- package/dist/steps/compile-wasm.test.d.ts +2 -0
- package/dist/steps/compile-wasm.test.d.ts.map +1 -0
- package/dist/steps/compile-wasm.test.js +33 -0
- package/dist/steps/compile-wasm.test.js.map +1 -0
- package/dist/steps/mirror-to-build.d.ts +3 -0
- package/dist/steps/mirror-to-build.d.ts.map +1 -0
- package/dist/steps/mirror-to-build.js +44 -0
- package/dist/steps/mirror-to-build.js.map +1 -0
- package/dist/steps/pack-gui-images.d.ts +7 -0
- package/dist/steps/pack-gui-images.d.ts.map +1 -0
- package/dist/steps/pack-gui-images.js +185 -0
- package/dist/steps/pack-gui-images.js.map +1 -0
- package/dist/steps/pack-gui-images.test.d.ts +2 -0
- package/dist/steps/pack-gui-images.test.d.ts.map +1 -0
- package/dist/steps/pack-gui-images.test.js +29 -0
- package/dist/steps/pack-gui-images.test.js.map +1 -0
- package/dist/steps/pack.d.ts +3 -0
- package/dist/steps/pack.d.ts.map +1 -0
- package/dist/steps/pack.js +19 -0
- package/dist/steps/pack.js.map +1 -0
- package/dist/steps/sync-settings-assets.d.ts +6 -0
- package/dist/steps/sync-settings-assets.d.ts.map +1 -0
- package/dist/steps/sync-settings-assets.js +31 -0
- package/dist/steps/sync-settings-assets.js.map +1 -0
- package/dist/steps/validate.d.ts +3 -0
- package/dist/steps/validate.d.ts.map +1 -0
- package/dist/steps/validate.js +12 -0
- package/dist/steps/validate.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { loadManifestFromDir, logStep } from '@brookesia/shared-utils';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { assertBundlePaths, bundlerCliArgs, resolveBundlerBin, writeDefaultBundleConfig, } from '../bundle-config.js';
|
|
6
|
+
export async function runBundleJs(ctx) {
|
|
7
|
+
const bundle = ctx.config.js?.bundle;
|
|
8
|
+
if (!bundle) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const manifest = loadManifestFromDir(ctx.sourceRoot);
|
|
12
|
+
const outputRel = bundle.output ?? manifest.runtime.entry;
|
|
13
|
+
assertBundlePaths(bundle.entry, outputRel);
|
|
14
|
+
const entryAbs = path.join(ctx.sourceRoot, bundle.entry);
|
|
15
|
+
if (!fs.existsSync(entryAbs)) {
|
|
16
|
+
throw new Error(`bundle-js: entry not found: ${bundle.entry} (expected at ${entryAbs})`);
|
|
17
|
+
}
|
|
18
|
+
const outputAbs = path.join(ctx.sourceRoot, outputRel);
|
|
19
|
+
await fs.ensureDir(path.dirname(outputAbs));
|
|
20
|
+
let configPath;
|
|
21
|
+
if (bundle.configFile) {
|
|
22
|
+
configPath = path.join(ctx.projectRoot, bundle.configFile);
|
|
23
|
+
if (!fs.existsSync(configPath)) {
|
|
24
|
+
throw new Error(`bundle-js: configFile not found: ${bundle.configFile}`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
configPath = await writeDefaultBundleConfig({
|
|
29
|
+
projectRoot: ctx.projectRoot,
|
|
30
|
+
tool: bundle.tool,
|
|
31
|
+
mode: ctx.mode,
|
|
32
|
+
entryAbs,
|
|
33
|
+
outputDirAbs: path.dirname(outputAbs),
|
|
34
|
+
outputFilename: path.basename(outputRel),
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
const bin = resolveBundlerBin(ctx.projectRoot, bundle.tool);
|
|
38
|
+
const args = bundlerCliArgs(bundle.tool, configPath, bundle.args);
|
|
39
|
+
logStep(`bundle-js (${bundle.tool}): ${bundle.entry} → ${outputRel}`);
|
|
40
|
+
await execa(bin, args, {
|
|
41
|
+
cwd: ctx.projectRoot,
|
|
42
|
+
stdio: 'inherit',
|
|
43
|
+
env: { ...process.env, NODE_ENV: ctx.mode },
|
|
44
|
+
});
|
|
45
|
+
if (!fs.existsSync(outputAbs)) {
|
|
46
|
+
throw new Error(`bundle-js: output missing: ${outputRel} (expected at ${outputAbs})`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=bundle-js.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bundle-js.js","sourceRoot":"","sources":["../../src/steps/bundle-js.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-wasm.d.ts","sourceRoot":"","sources":["../../src/steps/compile-wasm.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,wBAAsB,cAAc,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCxE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { loadManifestFromDir, logStep, wasiClangPath, } from '@brookesia/shared-utils';
|
|
2
|
+
import { execa } from 'execa';
|
|
3
|
+
import fs from 'fs-extra';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
export async function runCompileWasm(ctx) {
|
|
6
|
+
const wasm = ctx.config.wasm;
|
|
7
|
+
if (!wasm?.sources?.length) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const packageRoot = ctx.config.pack?.skipBuildMirror ? ctx.sourceRoot : ctx.buildDir;
|
|
11
|
+
await fs.ensureDir(packageRoot);
|
|
12
|
+
const manifest = loadManifestFromDir(ctx.sourceRoot);
|
|
13
|
+
const outputRel = wasm.output ?? manifest.runtime.entry;
|
|
14
|
+
const outputPath = path.join(packageRoot, outputRel);
|
|
15
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
16
|
+
const clang = wasiClangPath(ctx.config);
|
|
17
|
+
const sourcePaths = wasm.sources.map((rel) => {
|
|
18
|
+
const p = path.join(packageRoot, rel);
|
|
19
|
+
if (!fs.existsSync(p)) {
|
|
20
|
+
throw new Error(`wasm source not found: ${rel} (expected at ${p})`);
|
|
21
|
+
}
|
|
22
|
+
return p;
|
|
23
|
+
});
|
|
24
|
+
const args = [
|
|
25
|
+
'--target=wasm32-wasip1',
|
|
26
|
+
...sourcePaths,
|
|
27
|
+
'-o',
|
|
28
|
+
outputPath,
|
|
29
|
+
...(wasm.clangArgs ?? []),
|
|
30
|
+
];
|
|
31
|
+
logStep(`compile-wasm: ${wasm.sources.join(', ')} → ${outputRel}`);
|
|
32
|
+
await execa(clang, args, { stdio: 'inherit' });
|
|
33
|
+
if (!fs.existsSync(outputPath)) {
|
|
34
|
+
throw new Error(`compile-wasm: output missing: ${outputPath}`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=compile-wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-wasm.js","sourceRoot":"","sources":["../../src/steps/compile-wasm.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,OAAO,EACP,aAAa,GACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAoB;IACvD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7B,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC3B,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrF,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEhC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAE7C,MAAM,KAAK,GAAG,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACtC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG;QACX,wBAAwB;QACxB,GAAG,WAAW;QACd,IAAI;QACJ,UAAU;QACV,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;KAC1B,CAAC;IAEF,OAAO,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC;IACnE,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,iCAAiC,UAAU,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-wasm.test.d.ts","sourceRoot":"","sources":["../../src/steps/compile-wasm.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { runPipeline } from '../lane.js';
|
|
6
|
+
describe('wasm pipeline', () => {
|
|
7
|
+
it('rejects native C/C++ to Wasm compilation config', async () => {
|
|
8
|
+
const projectRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'brookesia-wasm-'));
|
|
9
|
+
const sourceRoot = path.join(projectRoot, 'src');
|
|
10
|
+
await fs.ensureDir(path.join(sourceRoot, 'native'));
|
|
11
|
+
await fs.writeJson(path.join(sourceRoot, 'manifest.json'), {
|
|
12
|
+
package: {
|
|
13
|
+
id: 'com.example.wasm',
|
|
14
|
+
version: '1.0.0',
|
|
15
|
+
},
|
|
16
|
+
runtime: {
|
|
17
|
+
type: 'Wasm',
|
|
18
|
+
entry: 'app/main.wasm',
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
await fs.writeFile(path.join(sourceRoot, 'native', 'main.c'), 'int main(void) { return 0; }\n');
|
|
22
|
+
await expect(runPipeline({
|
|
23
|
+
projectRoot,
|
|
24
|
+
sourceRoot,
|
|
25
|
+
buildDir: path.join(projectRoot, 'build'),
|
|
26
|
+
distDir: path.join(projectRoot, 'dist'),
|
|
27
|
+
signDir: path.join(projectRoot, 'sign'),
|
|
28
|
+
config: { wasm: { sources: ['native/main.c'] } },
|
|
29
|
+
mode: 'development',
|
|
30
|
+
})).rejects.toThrow('wasm.sources is no longer supported');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=compile-wasm.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile-wasm.test.js","sourceRoot":"","sources":["../../src/steps/compile-wasm.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QAChF,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,EAAE;YACzD,OAAO,EAAE;gBACP,EAAE,EAAE,kBAAkB;gBACtB,OAAO,EAAE,OAAO;aACjB;YACD,OAAO,EAAE;gBACP,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,eAAe;aACvB;SACF,CAAC,CAAC;QACH,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAEhG,MAAM,MAAM,CAAC,WAAW,CAAC;YACvB,WAAW;YACX,UAAU;YACV,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;YACzC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;YACvC,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,eAAe,CAAC,EAAE,EAAS;YACvD,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-to-build.d.ts","sourceRoot":"","sources":["../../src/steps/mirror-to-build.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAIrD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwC1E"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { loadManifestFromDir, validateAppProjectForBuild } from '@brookesia/shared-utils';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { shouldMirrorPath } from '../package-exclude.js';
|
|
5
|
+
const SKIP_DIRS = new Set(['node_modules', 'dist', 'build', '.git']);
|
|
6
|
+
export async function runMirrorToBuild(ctx) {
|
|
7
|
+
if (ctx.config.pack?.skipBuildMirror) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
validateAppProjectForBuild(ctx.projectRoot, ctx.sourceRoot);
|
|
11
|
+
const bundle = ctx.config.js?.bundle;
|
|
12
|
+
let bundleOutputJs;
|
|
13
|
+
let omitSourceJs = false;
|
|
14
|
+
let excludePatterns = [];
|
|
15
|
+
if (bundle) {
|
|
16
|
+
const manifest = loadManifestFromDir(ctx.sourceRoot);
|
|
17
|
+
bundleOutputJs = bundle.output ?? manifest.runtime.entry;
|
|
18
|
+
omitSourceJs = bundle.omitSourceJs !== false;
|
|
19
|
+
excludePatterns = bundle.excludeFromPackage ?? [];
|
|
20
|
+
}
|
|
21
|
+
await fs.emptyDir(ctx.buildDir);
|
|
22
|
+
await fs.copy(ctx.sourceRoot, ctx.buildDir, {
|
|
23
|
+
filter: (src) => {
|
|
24
|
+
if (src.endsWith('.bpk')) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const rel = path.relative(ctx.sourceRoot, src);
|
|
28
|
+
if (!rel || rel === '') {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
const parts = rel.split(path.sep);
|
|
32
|
+
if (parts.some((part) => SKIP_DIRS.has(part))) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
return shouldMirrorPath({
|
|
36
|
+
rel,
|
|
37
|
+
bundleOutputJs,
|
|
38
|
+
omitSourceJs,
|
|
39
|
+
excludePatterns,
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mirror-to-build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirror-to-build.js","sourceRoot":"","sources":["../../src/steps/mirror-to-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAErE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,GAAoB;IACzD,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC;QACrC,OAAO;IACT,CAAC;IAED,0BAA0B,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAE5D,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC;IACrC,IAAI,cAAkC,CAAC;IACvC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,eAAe,GAAa,EAAE,CAAC;IACnC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrD,cAAc,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC;QACzD,YAAY,GAAG,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC;QAC7C,eAAe,GAAG,MAAM,CAAC,kBAAkB,IAAI,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,EAAE;QAC1C,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;YACd,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBAC9C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,gBAAgB,CAAC;gBACtB,GAAG;gBACH,cAAc;gBACd,YAAY;gBACZ,eAAe;aAChB,CAAC,CAAC;QACL,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PipelineContext } from '../context.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pack GUI images from cli.sourceRoot (e.g. package/res/images) into build/res/images.
|
|
4
|
+
* Per image id: .bin (copy) > .c (Node) > .png (disabled by default).
|
|
5
|
+
*/
|
|
6
|
+
export declare function runPackGuiImages(ctx: PipelineContext): Promise<void>;
|
|
7
|
+
//# sourceMappingURL=pack-gui-images.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-gui-images.d.ts","sourceRoot":"","sources":["../../src/steps/pack-gui-images.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAwHrD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoG1E"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { LVGL_IMAGE_DEPS_HINT, logStep, logWarn, pythonHasLvglImageDeps, } from '@brookesia/shared-utils';
|
|
7
|
+
import { execa } from 'execa';
|
|
8
|
+
import fs from 'fs-extra';
|
|
9
|
+
import path from 'node:path';
|
|
10
|
+
import { imageDescriptorJson, lvglCSourceToBin, readLvglBinDimensions, } from '../lvgl-image-assets.js';
|
|
11
|
+
function pngHintDisabled(sourceRoot, imageDir) {
|
|
12
|
+
const rel = path.relative(sourceRoot, imageDir) || 'res/images';
|
|
13
|
+
return [
|
|
14
|
+
`PNG conversion is disabled for ${rel}/.`,
|
|
15
|
+
'Provide a preconverted <id>.bin or <id>.c for each PNG asset.',
|
|
16
|
+
'Set images.pngConvert to "lvgl-python" only when you intentionally want to use LVGLImage.py.',
|
|
17
|
+
].join('\n');
|
|
18
|
+
}
|
|
19
|
+
function resolveLvglImageTool(projectRoot, configured) {
|
|
20
|
+
const raw = configured?.trim();
|
|
21
|
+
if (!raw) {
|
|
22
|
+
throw new Error('PNG → bin via LVGLImage.py requires images.lvglImageTool in brookesia.config.js '
|
|
23
|
+
+ '(absolute path or relative to project root)');
|
|
24
|
+
}
|
|
25
|
+
return path.isAbsolute(raw) ? raw : path.resolve(projectRoot, raw);
|
|
26
|
+
}
|
|
27
|
+
async function writeImageJson(outputDir, id, bin, jsonOverridePath) {
|
|
28
|
+
const jsonDest = path.join(outputDir, `${id}.json`);
|
|
29
|
+
if (jsonOverridePath && (await fs.pathExists(jsonOverridePath))) {
|
|
30
|
+
await fs.copy(jsonOverridePath, jsonDest);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const { width, height } = readLvglBinDimensions(bin);
|
|
34
|
+
await fs.writeFile(jsonDest, imageDescriptorJson(id, width, height), 'utf8');
|
|
35
|
+
}
|
|
36
|
+
async function packBinFile(inputPath, outputDir, id, jsonOverridePath) {
|
|
37
|
+
const bin = await fs.readFile(inputPath);
|
|
38
|
+
await fs.writeFile(path.join(outputDir, `${id}.bin`), bin);
|
|
39
|
+
await writeImageJson(outputDir, id, bin, jsonOverridePath);
|
|
40
|
+
}
|
|
41
|
+
async function packCFile(inputPath, outputDir, id, jsonOverridePath) {
|
|
42
|
+
const source = await fs.readFile(inputPath, 'utf8');
|
|
43
|
+
const bin = lvglCSourceToBin(source);
|
|
44
|
+
await fs.writeFile(path.join(outputDir, `${id}.bin`), bin);
|
|
45
|
+
await writeImageJson(outputDir, id, bin, jsonOverridePath);
|
|
46
|
+
}
|
|
47
|
+
async function packPngWithLvglPython(ctx, pngPaths, jsonById, outputDir) {
|
|
48
|
+
const imageTool = resolveLvglImageTool(ctx.projectRoot, ctx.config.images?.lvglImageTool);
|
|
49
|
+
if (!(await fs.pathExists(imageTool))) {
|
|
50
|
+
throw new Error(`LVGLImage.py not found at ${imageTool}`);
|
|
51
|
+
}
|
|
52
|
+
if (!(await pythonHasLvglImageDeps())) {
|
|
53
|
+
throw new Error(`pack-gui-images (LVGLImage.py): missing Python deps. ${LVGL_IMAGE_DEPS_HINT}`);
|
|
54
|
+
}
|
|
55
|
+
const imgCfg = ctx.config.images ?? {};
|
|
56
|
+
const cf = imgCfg.colorFormat ?? 'ARGB8888';
|
|
57
|
+
const compress = imgCfg.compress ?? 'NONE';
|
|
58
|
+
const align = imgCfg.align ?? 1;
|
|
59
|
+
const background = imgCfg.background ?? '0x000000';
|
|
60
|
+
logStep(`pack-gui-images: ${pngPaths.size} PNG(s) → ${outputDir} via LVGLImage.py`);
|
|
61
|
+
let packed = 0;
|
|
62
|
+
for (const [id, pngPath] of pngPaths) {
|
|
63
|
+
await execa('python3', [
|
|
64
|
+
imageTool,
|
|
65
|
+
'--ofmt',
|
|
66
|
+
'BIN',
|
|
67
|
+
'--cf',
|
|
68
|
+
cf,
|
|
69
|
+
'--compress',
|
|
70
|
+
compress,
|
|
71
|
+
'--align',
|
|
72
|
+
String(align),
|
|
73
|
+
'--background',
|
|
74
|
+
background,
|
|
75
|
+
'-o',
|
|
76
|
+
outputDir,
|
|
77
|
+
pngPath,
|
|
78
|
+
], { stdio: 'inherit' });
|
|
79
|
+
const binPath = path.join(outputDir, `${id}.bin`);
|
|
80
|
+
if (!(await fs.pathExists(binPath))) {
|
|
81
|
+
throw new Error(`LVGLImage.py did not produce ${binPath}`);
|
|
82
|
+
}
|
|
83
|
+
const bin = await fs.readFile(binPath);
|
|
84
|
+
await writeImageJson(outputDir, id, bin, jsonById.get(id));
|
|
85
|
+
packed += 1;
|
|
86
|
+
}
|
|
87
|
+
return packed;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Pack GUI images from cli.sourceRoot (e.g. package/res/images) into build/res/images.
|
|
91
|
+
* Per image id: .bin (copy) > .c (Node) > .png (disabled by default).
|
|
92
|
+
*/
|
|
93
|
+
export async function runPackGuiImages(ctx) {
|
|
94
|
+
const imgCfg = ctx.config.images ?? {};
|
|
95
|
+
const inputDir = path.join(ctx.sourceRoot, imgCfg.inputDir ?? 'res/images');
|
|
96
|
+
if (!(await fs.pathExists(inputDir))) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
const legacyAssets = path.join(ctx.projectRoot, 'assets', 'images');
|
|
100
|
+
if (await fs.pathExists(legacyAssets)) {
|
|
101
|
+
const legacyFiles = await fs.readdir(legacyAssets);
|
|
102
|
+
if (legacyFiles.some((f) => /\.(png|bin|c)$/i.test(f))) {
|
|
103
|
+
logWarn(`pack-gui-images: ignoring project-root assets/images/ — use ${path.relative(ctx.projectRoot, inputDir)}/ under sourceRoot (${path.basename(ctx.sourceRoot)}/)`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const entries = await fs.readdir(inputDir);
|
|
107
|
+
const byId = new Map();
|
|
108
|
+
for (const name of entries) {
|
|
109
|
+
const lower = name.toLowerCase();
|
|
110
|
+
const id = path.basename(name, path.extname(name));
|
|
111
|
+
const slot = byId.get(id) ?? {};
|
|
112
|
+
const full = path.join(inputDir, name);
|
|
113
|
+
if (lower.endsWith('.bin')) {
|
|
114
|
+
slot.bin = full;
|
|
115
|
+
}
|
|
116
|
+
else if (lower.endsWith('.c')) {
|
|
117
|
+
slot.c = full;
|
|
118
|
+
}
|
|
119
|
+
else if (lower.endsWith('.json')) {
|
|
120
|
+
slot.json = full;
|
|
121
|
+
}
|
|
122
|
+
else if (lower.endsWith('.png')) {
|
|
123
|
+
slot.png = full;
|
|
124
|
+
}
|
|
125
|
+
byId.set(id, slot);
|
|
126
|
+
}
|
|
127
|
+
if (byId.size === 0) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
const outputDir = path.join(ctx.buildDir, 'res', 'images');
|
|
131
|
+
await fs.ensureDir(outputDir);
|
|
132
|
+
const pngConvert = imgCfg.pngConvert ?? 'off';
|
|
133
|
+
const pngToConvert = new Map();
|
|
134
|
+
const jsonById = new Map();
|
|
135
|
+
let packed = 0;
|
|
136
|
+
for (const [id, slot] of byId) {
|
|
137
|
+
// 1. .bin — copy
|
|
138
|
+
if (slot.bin) {
|
|
139
|
+
if (slot.c) {
|
|
140
|
+
logWarn(`pack-gui-images: ignoring ${id}.c (${id}.bin takes precedence)`);
|
|
141
|
+
}
|
|
142
|
+
if (slot.png) {
|
|
143
|
+
logWarn(`pack-gui-images: ignoring ${id}.png (${id}.bin takes precedence)`);
|
|
144
|
+
}
|
|
145
|
+
await packBinFile(slot.bin, outputDir, id, slot.json);
|
|
146
|
+
packed += 1;
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
// 2. .c — Node → bin
|
|
150
|
+
if (slot.c) {
|
|
151
|
+
if (slot.png) {
|
|
152
|
+
logWarn(`pack-gui-images: ignoring ${id}.png (${id}.c takes precedence)`);
|
|
153
|
+
}
|
|
154
|
+
await packCFile(slot.c, outputDir, id, slot.json);
|
|
155
|
+
packed += 1;
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
// 3. .png only — rejected by default, or converted when explicitly enabled
|
|
159
|
+
if (slot.png) {
|
|
160
|
+
const mirroredBin = path.join(outputDir, `${id}.bin`);
|
|
161
|
+
if (await fs.pathExists(mirroredBin)) {
|
|
162
|
+
const bin = await fs.readFile(mirroredBin);
|
|
163
|
+
await writeImageJson(outputDir, id, bin, slot.json);
|
|
164
|
+
logWarn(`pack-gui-images: ${id}.png skipped (${id}.bin already in build/res/images)`);
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
pngToConvert.set(id, slot.png);
|
|
168
|
+
jsonById.set(id, slot.json);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
if (pngToConvert.size > 0) {
|
|
172
|
+
if (pngConvert === 'lvgl-python') {
|
|
173
|
+
packed += await packPngWithLvglPython(ctx, pngToConvert, jsonById, outputDir);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
const names = [...pngToConvert.keys()].map((id) => `${id}.png`).join(', ');
|
|
177
|
+
throw new Error(`pack-gui-images: ${names}\n${pngHintDisabled(ctx.sourceRoot, inputDir)}`);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (packed > 0) {
|
|
181
|
+
const relIn = path.relative(ctx.projectRoot, inputDir);
|
|
182
|
+
logStep(`pack-gui-images: ${packed} image(s) from ${relIn} → build/res/images`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=pack-gui-images.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-gui-images.js","sourceRoot":"","sources":["../../src/steps/pack-gui-images.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-gui-images.test.d.ts","sourceRoot":"","sources":["../../src/steps/pack-gui-images.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SPDX-FileCopyrightText: 2026 Espressif Systems (Shanghai) CO LTD
|
|
3
|
+
*
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import fs from 'fs-extra';
|
|
7
|
+
import os from 'node:os';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { describe, expect, it } from 'vitest';
|
|
10
|
+
import { runPackGuiImages } from './pack-gui-images.js';
|
|
11
|
+
describe('runPackGuiImages', () => {
|
|
12
|
+
it('does not invoke LVGLImage.py for PNG-only assets by default', async () => {
|
|
13
|
+
const projectRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'brookesia-png-'));
|
|
14
|
+
const sourceRoot = path.join(projectRoot, 'src');
|
|
15
|
+
const buildDir = path.join(projectRoot, 'build');
|
|
16
|
+
await fs.ensureDir(path.join(sourceRoot, 'res', 'images'));
|
|
17
|
+
await fs.writeFile(path.join(sourceRoot, 'res', 'images', 'icon.png'), Buffer.from([0x89, 0x50, 0x4e, 0x47]));
|
|
18
|
+
await expect(runPackGuiImages({
|
|
19
|
+
projectRoot,
|
|
20
|
+
sourceRoot,
|
|
21
|
+
buildDir,
|
|
22
|
+
distDir: path.join(projectRoot, 'dist'),
|
|
23
|
+
signDir: path.join(projectRoot, 'sign'),
|
|
24
|
+
config: {},
|
|
25
|
+
mode: 'development',
|
|
26
|
+
})).rejects.toThrow('PNG conversion is disabled');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=pack-gui-images.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack-gui-images.test.js","sourceRoot":"","sources":["../../src/steps/pack-gui-images.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAE9G,MAAM,MAAM,CAAC,gBAAgB,CAAC;YAC5B,WAAW;YACX,UAAU;YACV,QAAQ;YACR,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC;YACvC,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.d.ts","sourceRoot":"","sources":["../../src/steps/pack.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,wBAAsB,OAAO,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAcjE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { outputBpkName, packAppPackage } from '@brookesia/packager';
|
|
2
|
+
import { loadManifestFromDir } from '@brookesia/shared-utils';
|
|
3
|
+
import fs from 'node:fs';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
export async function runPack(ctx) {
|
|
6
|
+
const sourceDir = ctx.config.pack?.skipBuildMirror ? ctx.sourceRoot : ctx.buildDir;
|
|
7
|
+
const manifest = loadManifestFromDir(sourceDir);
|
|
8
|
+
const fileName = outputBpkName(manifest, ctx.mode);
|
|
9
|
+
await fs.promises.mkdir(ctx.distDir, { recursive: true });
|
|
10
|
+
const outputPath = path.join(ctx.distDir, fileName);
|
|
11
|
+
await packAppPackage({
|
|
12
|
+
sourceDir,
|
|
13
|
+
outputPath,
|
|
14
|
+
mode: ctx.mode,
|
|
15
|
+
signDir: ctx.signDir,
|
|
16
|
+
compression: ctx.config.pack?.compression ?? 'deflate',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=pack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/steps/pack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAoB;IAChD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnF,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEpD,MAAM,cAAc,CAAC;QACnB,SAAS;QACT,UAAU;QACV,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,SAAS;KACvD,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { PipelineContext } from '../context.js';
|
|
2
|
+
/**
|
|
3
|
+
* Copy Settings demo JSON UI into package/res/ (documents/ + shared/).
|
|
4
|
+
*/
|
|
5
|
+
export declare function runSyncSettingsAssets(ctx: PipelineContext): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=sync-settings-assets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-settings-assets.d.ts","sourceRoot":"","sources":["../../src/steps/sync-settings-assets.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B/E"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { logStep } from '@brookesia/shared-utils';
|
|
2
|
+
import fs from 'fs-extra';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
/**
|
|
5
|
+
* Copy Settings demo JSON UI into package/res/ (documents/ + shared/).
|
|
6
|
+
*/
|
|
7
|
+
export async function runSyncSettingsAssets(ctx) {
|
|
8
|
+
if (!ctx.config.settings) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const raw = ctx.config.settings.assetSource?.trim();
|
|
12
|
+
if (!raw) {
|
|
13
|
+
throw new Error('settings.assetSource is required when settings is enabled '
|
|
14
|
+
+ '(absolute path or relative to project root)');
|
|
15
|
+
}
|
|
16
|
+
const assetSource = path.isAbsolute(raw)
|
|
17
|
+
? raw
|
|
18
|
+
: path.join(ctx.projectRoot, raw);
|
|
19
|
+
const resRoot = path.join(ctx.sourceRoot, 'res');
|
|
20
|
+
for (const sub of ['documents', 'shared']) {
|
|
21
|
+
const from = path.join(assetSource, sub);
|
|
22
|
+
const to = path.join(resRoot, sub);
|
|
23
|
+
if (!(await fs.pathExists(from))) {
|
|
24
|
+
throw new Error(`Settings asset source missing: ${from}`);
|
|
25
|
+
}
|
|
26
|
+
await fs.ensureDir(path.dirname(to));
|
|
27
|
+
await fs.copy(from, to, { overwrite: true });
|
|
28
|
+
}
|
|
29
|
+
logStep(`sync-settings-assets: ${assetSource} → ${resRoot}`);
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=sync-settings-assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-settings-assets.js","sourceRoot":"","sources":["../../src/steps/sync-settings-assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,GAAoB;IAC9D,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,4DAA4D;cAC1D,6CAA6C,CAChD,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QACtC,CAAC,CAAC,GAAG;QACL,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAEjD,KAAK,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAU,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;QAC5D,CAAC;QACD,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO,CAAC,yBAAyB,WAAW,MAAM,OAAO,EAAE,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/steps/validate.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,wBAAsB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAQrE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { validateManifest, validateNoMetaInfInSource, } from '@brookesia/config-schema';
|
|
2
|
+
import { loadManifestFromDir } from '@brookesia/shared-utils';
|
|
3
|
+
export async function runValidate(ctx) {
|
|
4
|
+
// After mirror, validate the tree that will be packed.
|
|
5
|
+
const sourceDir = ctx.config.pack?.skipBuildMirror ? ctx.sourceRoot : ctx.buildDir;
|
|
6
|
+
if (ctx.config.validate?.forbidSourceMetaInf !== false) {
|
|
7
|
+
validateNoMetaInfInSource(sourceDir);
|
|
8
|
+
}
|
|
9
|
+
const manifest = loadManifestFromDir(sourceDir);
|
|
10
|
+
validateManifest(manifest, sourceDir);
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/steps/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAoB;IACpD,uDAAuD;IACvD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IACnF,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,mBAAmB,KAAK,KAAK,EAAE,CAAC;QACvD,yBAAyB,CAAC,SAAS,CAAC,CAAC;IACvC,CAAC;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAChD,gBAAgB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;AACxC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@brookesia/pipeline",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Build and release pipeline for ESP-Brookesia app projects",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist"
|
|
11
|
+
],
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public",
|
|
14
|
+
"registry": "https://registry.npmjs.org/"
|
|
15
|
+
},
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/espressif/esp-brookesia-toolkit.git",
|
|
19
|
+
"directory": "packages/pipeline"
|
|
20
|
+
},
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "tsc -p tsconfig.json",
|
|
29
|
+
"clean": "rm -rf dist",
|
|
30
|
+
"test": "vitest run"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@brookesia/config-schema": "0.1.0",
|
|
34
|
+
"@brookesia/packager": "0.1.0",
|
|
35
|
+
"@brookesia/shared-utils": "0.1.0",
|
|
36
|
+
"execa": "^9.5.2",
|
|
37
|
+
"fs-extra": "^11.3.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/fs-extra": "^11.0.4",
|
|
41
|
+
"typescript": "^5.7.3"
|
|
42
|
+
}
|
|
43
|
+
}
|