@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.
Files changed (73) hide show
  1. package/dist/bundle-config.d.ts +13 -0
  2. package/dist/bundle-config.d.ts.map +1 -0
  3. package/dist/bundle-config.js +70 -0
  4. package/dist/bundle-config.js.map +1 -0
  5. package/dist/bundle-config.test.d.ts +2 -0
  6. package/dist/bundle-config.test.d.ts.map +1 -0
  7. package/dist/bundle-config.test.js +33 -0
  8. package/dist/bundle-config.test.js.map +1 -0
  9. package/dist/context.d.ts +6 -0
  10. package/dist/context.d.ts.map +1 -0
  11. package/dist/context.js +2 -0
  12. package/dist/context.js.map +1 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +3 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/lane.d.ts +4 -0
  18. package/dist/lane.d.ts.map +1 -0
  19. package/dist/lane.js +34 -0
  20. package/dist/lane.js.map +1 -0
  21. package/dist/lvgl-image-assets.d.ts +22 -0
  22. package/dist/lvgl-image-assets.d.ts.map +1 -0
  23. package/dist/lvgl-image-assets.js +165 -0
  24. package/dist/lvgl-image-assets.js.map +1 -0
  25. package/dist/lvgl-image-assets.test.d.ts +2 -0
  26. package/dist/lvgl-image-assets.test.d.ts.map +1 -0
  27. package/dist/lvgl-image-assets.test.js +56 -0
  28. package/dist/lvgl-image-assets.test.js.map +1 -0
  29. package/dist/package-exclude.d.ts +16 -0
  30. package/dist/package-exclude.d.ts.map +1 -0
  31. package/dist/package-exclude.js +42 -0
  32. package/dist/package-exclude.js.map +1 -0
  33. package/dist/package-exclude.test.d.ts +2 -0
  34. package/dist/package-exclude.test.d.ts.map +1 -0
  35. package/dist/package-exclude.test.js +30 -0
  36. package/dist/package-exclude.test.js.map +1 -0
  37. package/dist/steps/bundle-js.d.ts +3 -0
  38. package/dist/steps/bundle-js.d.ts.map +1 -0
  39. package/dist/steps/bundle-js.js +49 -0
  40. package/dist/steps/bundle-js.js.map +1 -0
  41. package/dist/steps/compile-wasm.d.ts +3 -0
  42. package/dist/steps/compile-wasm.d.ts.map +1 -0
  43. package/dist/steps/compile-wasm.js +37 -0
  44. package/dist/steps/compile-wasm.js.map +1 -0
  45. package/dist/steps/compile-wasm.test.d.ts +2 -0
  46. package/dist/steps/compile-wasm.test.d.ts.map +1 -0
  47. package/dist/steps/compile-wasm.test.js +33 -0
  48. package/dist/steps/compile-wasm.test.js.map +1 -0
  49. package/dist/steps/mirror-to-build.d.ts +3 -0
  50. package/dist/steps/mirror-to-build.d.ts.map +1 -0
  51. package/dist/steps/mirror-to-build.js +44 -0
  52. package/dist/steps/mirror-to-build.js.map +1 -0
  53. package/dist/steps/pack-gui-images.d.ts +7 -0
  54. package/dist/steps/pack-gui-images.d.ts.map +1 -0
  55. package/dist/steps/pack-gui-images.js +185 -0
  56. package/dist/steps/pack-gui-images.js.map +1 -0
  57. package/dist/steps/pack-gui-images.test.d.ts +2 -0
  58. package/dist/steps/pack-gui-images.test.d.ts.map +1 -0
  59. package/dist/steps/pack-gui-images.test.js +29 -0
  60. package/dist/steps/pack-gui-images.test.js.map +1 -0
  61. package/dist/steps/pack.d.ts +3 -0
  62. package/dist/steps/pack.d.ts.map +1 -0
  63. package/dist/steps/pack.js +19 -0
  64. package/dist/steps/pack.js.map +1 -0
  65. package/dist/steps/sync-settings-assets.d.ts +6 -0
  66. package/dist/steps/sync-settings-assets.d.ts.map +1 -0
  67. package/dist/steps/sync-settings-assets.js +31 -0
  68. package/dist/steps/sync-settings-assets.js.map +1 -0
  69. package/dist/steps/validate.d.ts +3 -0
  70. package/dist/steps/validate.d.ts.map +1 -0
  71. package/dist/steps/validate.js +12 -0
  72. package/dist/steps/validate.js.map +1 -0
  73. 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,3 @@
1
+ import type { PipelineContext } from '../context.js';
2
+ export declare function runCompileWasm(ctx: PipelineContext): Promise<void>;
3
+ //# sourceMappingURL=compile-wasm.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=compile-wasm.test.d.ts.map
@@ -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,3 @@
1
+ import type { PipelineContext } from '../context.js';
2
+ export declare function runMirrorToBuild(ctx: PipelineContext): Promise<void>;
3
+ //# sourceMappingURL=mirror-to-build.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pack-gui-images.test.d.ts.map
@@ -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,3 @@
1
+ import type { PipelineContext } from '../context.js';
2
+ export declare function runPack(ctx: PipelineContext): Promise<void>;
3
+ //# sourceMappingURL=pack.d.ts.map
@@ -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,3 @@
1
+ import type { PipelineContext } from '../context.js';
2
+ export declare function runValidate(ctx: PipelineContext): Promise<void>;
3
+ //# sourceMappingURL=validate.d.ts.map
@@ -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
+ }