@swarm.ing/pieui 2.0.30 → 2.0.32

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/cli.js CHANGED
@@ -188157,7 +188157,7 @@ var require_typescript_json_schema = __commonJS((exports2) => {
188157
188157
  });
188158
188158
 
188159
188159
  // src/cli.ts
188160
- var import_node_path22 = __toESM(require("node:path"));
188160
+ var import_node_path23 = __toESM(require("node:path"));
188161
188161
 
188162
188162
  // src/code/args.ts
188163
188163
  var VALID_CARD_ACTIONS = [
@@ -188171,7 +188171,8 @@ var VALID_CARD_ACTIONS = [
188171
188171
  "remote",
188172
188172
  "dump-metadata",
188173
188173
  "check-sync",
188174
- "add-story"
188174
+ "add-story",
188175
+ "generate-preview"
188175
188176
  ];
188176
188177
  var VALID_CARD_REMOTE_ACTIONS = [
188177
188178
  "push",
@@ -188375,6 +188376,9 @@ var parseArgs = (argv) => {
188375
188376
  } else if (action === "add-story") {
188376
188377
  result.componentName = positionals[0];
188377
188378
  result.cardAddStoryForce = boolFlags.force;
188379
+ } else if (action === "generate-preview") {
188380
+ result.componentName = positionals[0];
188381
+ result.cardGeneratePreviewOut = flags.dumpMetadataOut;
188378
188382
  } else if (action === "remote") {
188379
188383
  const sub = positionals[0];
188380
188384
  if (sub && VALID_CARD_REMOTE_ACTIONS.includes(sub)) {
@@ -188460,6 +188464,7 @@ var ALL_LINES = [
188460
188464
  " card list-events <Name> List methods keys on the registered PieCard",
188461
188465
  " card add-event <Name> <event> Add a new methods key with a default handler",
188462
188466
  " card add-story <Name> [--force] Generate a Storybook stories.tsx wired to PieCard methods",
188467
+ " card generate-preview <Name> [--out file.png] Render the component story via storycap and save a PNG preview",
188463
188468
  " card dump-metadata <Name> [--out file.json] Dump full PieMetadata JSON for the component",
188464
188469
  " card check-sync <Name> Compare TS ↔ Python metadata; prompt for backend project path if not configured",
188465
188470
  " card remote list [--user U] [--project S] List remote components",
@@ -188531,6 +188536,7 @@ var CARD_LINES = [
188531
188536
  " list-events <Name> List methods keys on the registered PieCard",
188532
188537
  " add-event <Name> <event> Add a new methods key with a default handler",
188533
188538
  " add-story <Name> [--force] Generate a Storybook stories.tsx wired to PieCard methods (--force overwrites)",
188539
+ " generate-preview <Name> [--out file.png] Render the component story via storycap and save a PNG preview",
188534
188540
  " dump-metadata <Name> [--out file.json] Dump full PieMetadata JSON for the component",
188535
188541
  " check-sync <Name> Compare TS ↔ Python metadata; prompts for backend project path",
188536
188542
  " remote ... Remote storage operations (see `pieui card remote --help`)",
@@ -196702,10 +196708,132 @@ var cardAddStoryCommand = (componentName, options = {}) => {
196702
196708
  printRequirements(cardAddStoryRequirements(componentName));
196703
196709
  };
196704
196710
 
196705
- // src/code/commands/cardAddFromMeta.ts
196711
+ // src/code/commands/cardGeneratePreview.ts
196706
196712
  var import_node_fs15 = __toESM(require("node:fs"));
196713
+ var import_node_http = __toESM(require("node:http"));
196714
+ var import_node_os = __toESM(require("node:os"));
196707
196715
  var import_node_path16 = __toESM(require("node:path"));
196708
196716
  var import_node_child_process3 = require("node:child_process");
196717
+ var STORYBOOK_PORT = 6006;
196718
+ var STORY_TITLE_NAMESPACE = "PieComponents";
196719
+ var isStorybookReachable = (port) => new Promise((resolve) => {
196720
+ const req = import_node_http.default.get({ hostname: "localhost", port, path: "/index.json" }, (res) => {
196721
+ res.resume();
196722
+ resolve(res.statusCode === 200);
196723
+ });
196724
+ req.on("error", () => resolve(false));
196725
+ req.setTimeout(1500, () => {
196726
+ req.destroy();
196727
+ resolve(false);
196728
+ });
196729
+ });
196730
+ var waitForStorybook = async (port, timeoutMs) => {
196731
+ const deadline = Date.now() + timeoutMs;
196732
+ while (Date.now() < deadline) {
196733
+ if (await isStorybookReachable(port))
196734
+ return true;
196735
+ await new Promise((r) => setTimeout(r, 1500));
196736
+ }
196737
+ return false;
196738
+ };
196739
+ var killProcessTree = (proc) => {
196740
+ if (!proc.pid)
196741
+ return;
196742
+ try {
196743
+ process.kill(-proc.pid, "SIGTERM");
196744
+ } catch {
196745
+ try {
196746
+ proc.kill("SIGTERM");
196747
+ } catch {}
196748
+ }
196749
+ };
196750
+ var cardGeneratePreviewCommand = async (componentName, options = {}) => {
196751
+ if (!componentName) {
196752
+ throw new Error("Component name is required");
196753
+ }
196754
+ const settings = loadSettings();
196755
+ const componentDir = import_node_path16.default.join(settings.componentsDir, componentName);
196756
+ if (!import_node_fs15.default.existsSync(componentDir)) {
196757
+ throw new Error(`Component directory not found: ${componentDir}`);
196758
+ }
196759
+ const storyPath = import_node_path16.default.join(componentDir, `${componentName}.stories.tsx`);
196760
+ if (!import_node_fs15.default.existsSync(storyPath)) {
196761
+ throw new Error(`Story file not found: ${storyPath}
196762
+ ` + `Run \`pieui card add-story ${componentName}\` first.`);
196763
+ }
196764
+ const outPath = import_node_path16.default.resolve(process.cwd(), options.out || import_node_path16.default.join(componentDir, "preview.png"));
196765
+ import_node_fs15.default.mkdirSync(import_node_path16.default.dirname(outPath), { recursive: true });
196766
+ const bunBin = process.env.PIEUI_CREATE_BUN_BIN || "bun";
196767
+ let sbProc = null;
196768
+ const alreadyRunning = await isStorybookReachable(STORYBOOK_PORT);
196769
+ if (!alreadyRunning) {
196770
+ console.log(`[pieui] Storybook not running on :${STORYBOOK_PORT} — starting it temporarily...`);
196771
+ sbProc = import_node_child_process3.spawn(bunBin, ["run", "storybook"], {
196772
+ cwd: process.cwd(),
196773
+ stdio: "ignore",
196774
+ env: process.env,
196775
+ detached: true
196776
+ });
196777
+ sbProc.unref();
196778
+ const ready = await waitForStorybook(STORYBOOK_PORT, 180000);
196779
+ if (!ready) {
196780
+ killProcessTree(sbProc);
196781
+ throw new Error("Storybook failed to become reachable within 3 minutes");
196782
+ }
196783
+ console.log(`[pieui] Storybook ready on :${STORYBOOK_PORT}`);
196784
+ } else {
196785
+ console.log(`[pieui] Using running Storybook on :${STORYBOOK_PORT}`);
196786
+ }
196787
+ const tmpDir = import_node_fs15.default.mkdtempSync(import_node_path16.default.join(import_node_os.default.tmpdir(), "pieui-storycap-"));
196788
+ try {
196789
+ const include = `${STORY_TITLE_NAMESPACE}/${componentName}/*`;
196790
+ console.log(`[pieui] Running storycap for "${include}"...`);
196791
+ const result = import_node_child_process3.spawnSync(bunBin, [
196792
+ "x",
196793
+ "storycap@latest",
196794
+ `http://localhost:${STORYBOOK_PORT}`,
196795
+ "--include",
196796
+ include,
196797
+ "--outDir",
196798
+ tmpDir,
196799
+ "--serverTimeout",
196800
+ "60000"
196801
+ ], {
196802
+ cwd: process.cwd(),
196803
+ stdio: "inherit",
196804
+ env: process.env
196805
+ });
196806
+ if (result.error) {
196807
+ throw result.error;
196808
+ }
196809
+ if (result.status !== 0) {
196810
+ throw new Error(`storycap exited with code ${result.status ?? "unknown"}`);
196811
+ }
196812
+ const producedDir = import_node_path16.default.join(tmpDir, STORY_TITLE_NAMESPACE, componentName);
196813
+ if (!import_node_fs15.default.existsSync(producedDir)) {
196814
+ throw new Error(`storycap finished but no PNGs were produced under ${producedDir}
196815
+ ` + `Tmp listing: ${import_node_fs15.default.readdirSync(tmpDir).join(", ") || "(empty)"}`);
196816
+ }
196817
+ const pngs = import_node_fs15.default.readdirSync(producedDir).filter((f) => f.endsWith(".png")).sort();
196818
+ if (pngs.length === 0) {
196819
+ throw new Error(`No PNGs in ${producedDir}`);
196820
+ }
196821
+ const picked = import_node_path16.default.join(producedDir, pngs[0]);
196822
+ import_node_fs15.default.copyFileSync(picked, outPath);
196823
+ console.log(`[pieui] Preview written: ${outPath}` + (pngs.length > 1 ? ` (picked ${pngs[0]}; other states available: ${pngs.slice(1).join(", ")})` : ""));
196824
+ } finally {
196825
+ import_node_fs15.default.rmSync(tmpDir, { recursive: true, force: true });
196826
+ if (sbProc) {
196827
+ killProcessTree(sbProc);
196828
+ console.log("[pieui] Storybook stopped");
196829
+ }
196830
+ }
196831
+ };
196832
+
196833
+ // src/code/commands/cardAddFromMeta.ts
196834
+ var import_node_fs16 = __toESM(require("node:fs"));
196835
+ var import_node_path17 = __toESM(require("node:path"));
196836
+ var import_node_child_process4 = require("node:child_process");
196709
196837
 
196710
196838
  // src/code/jsonSchemaToTs.ts
196711
196839
  var INDENT = " ";
@@ -196785,11 +196913,11 @@ var jsonSchemaToTsType = (schema) => renderType(asSchema(schema), 0);
196785
196913
  // src/code/commands/cardAddFromMeta.ts
196786
196914
  var PIE_CONFIG_PATH = ".pie/config.json";
196787
196915
  var readBackendConfig = () => {
196788
- const configPath = import_node_path16.default.join(process.cwd(), PIE_CONFIG_PATH);
196789
- if (!import_node_fs15.default.existsSync(configPath))
196916
+ const configPath = import_node_path17.default.join(process.cwd(), PIE_CONFIG_PATH);
196917
+ if (!import_node_fs16.default.existsSync(configPath))
196790
196918
  return null;
196791
196919
  try {
196792
- const parsed = JSON.parse(import_node_fs15.default.readFileSync(configPath, "utf8"));
196920
+ const parsed = JSON.parse(import_node_fs16.default.readFileSync(configPath, "utf8"));
196793
196921
  if (typeof parsed !== "object" || parsed === null)
196794
196922
  return null;
196795
196923
  return parsed;
@@ -196806,16 +196934,16 @@ var cardNameToClassFilename = (name) => {
196806
196934
  return snake.endsWith("_card") ? `${snake}.py` : `${snake}_card.py`;
196807
196935
  };
196808
196936
  var resolveSource = (fromRaw, cardName, cfg) => {
196809
- if (fromRaw && import_node_fs15.default.existsSync(fromRaw)) {
196810
- const stat = import_node_fs15.default.statSync(fromRaw);
196811
- const abs = import_node_path16.default.resolve(fromRaw);
196937
+ if (fromRaw && import_node_fs16.default.existsSync(fromRaw)) {
196938
+ const stat = import_node_fs16.default.statSync(fromRaw);
196939
+ const abs = import_node_path17.default.resolve(fromRaw);
196812
196940
  if (stat.isFile() && abs.endsWith(".json")) {
196813
196941
  return { kind: "json-file", path: abs };
196814
196942
  }
196815
196943
  if (stat.isFile() && abs.endsWith(".py")) {
196816
- const componentsDir2 = import_node_path16.default.dirname(abs);
196817
- const backendRoot2 = import_node_path16.default.dirname(componentsDir2);
196818
- const inferred = classFilenameToCardName(import_node_path16.default.basename(abs));
196944
+ const componentsDir2 = import_node_path17.default.dirname(abs);
196945
+ const backendRoot2 = import_node_path17.default.dirname(componentsDir2);
196946
+ const inferred = classFilenameToCardName(import_node_path17.default.basename(abs));
196819
196947
  return {
196820
196948
  kind: "py-file",
196821
196949
  backendRoot: backendRoot2,
@@ -196823,7 +196951,7 @@ var resolveSource = (fromRaw, cardName, cfg) => {
196823
196951
  };
196824
196952
  }
196825
196953
  if (stat.isDirectory()) {
196826
- const backendRoot2 = import_node_path16.default.dirname(abs);
196954
+ const backendRoot2 = import_node_path17.default.dirname(abs);
196827
196955
  return { kind: "name", backendRoot: backendRoot2, cardName };
196828
196956
  }
196829
196957
  throw new Error(`--from path is not a recognized source: ${fromRaw}`);
@@ -196832,15 +196960,15 @@ var resolveSource = (fromRaw, cardName, cfg) => {
196832
196960
  if (!cfg?.backendComponentsDir) {
196833
196961
  throw new Error(`--from "${fromRaw}" is not an existing path and no backendComponentsDir is configured in ${PIE_CONFIG_PATH}`);
196834
196962
  }
196835
- const componentsDir2 = import_node_path16.default.resolve(cfg.backendComponentsDir);
196836
- const backendRoot2 = import_node_path16.default.dirname(componentsDir2);
196963
+ const componentsDir2 = import_node_path17.default.resolve(cfg.backendComponentsDir);
196964
+ const backendRoot2 = import_node_path17.default.dirname(componentsDir2);
196837
196965
  return { kind: "name", backendRoot: backendRoot2, cardName: fromRaw };
196838
196966
  }
196839
196967
  if (!cfg?.backendComponentsDir) {
196840
196968
  throw new Error(`No --from provided and no backendComponentsDir configured in ${PIE_CONFIG_PATH}`);
196841
196969
  }
196842
- const componentsDir = import_node_path16.default.resolve(cfg.backendComponentsDir);
196843
- const backendRoot = import_node_path16.default.dirname(componentsDir);
196970
+ const componentsDir = import_node_path17.default.resolve(cfg.backendComponentsDir);
196971
+ const backendRoot = import_node_path17.default.dirname(componentsDir);
196844
196972
  return { kind: "name", backendRoot, cardName };
196845
196973
  };
196846
196974
  var unwrapTypescriptEnvelope2 = (parsed) => {
@@ -196857,11 +196985,11 @@ var unwrapTypescriptEnvelope2 = (parsed) => {
196857
196985
  };
196858
196986
  var fetchMetadata = (source) => {
196859
196987
  if (source.kind === "json-file") {
196860
- const raw = import_node_fs15.default.readFileSync(source.path, "utf8");
196988
+ const raw = import_node_fs16.default.readFileSync(source.path, "utf8");
196861
196989
  return unwrapTypescriptEnvelope2(JSON.parse(raw));
196862
196990
  }
196863
196991
  console.log(`[pieui] Invoking: pie card dump-metadata ${source.cardName} (cwd: ${source.backendRoot})`);
196864
- const result = import_node_child_process3.spawnSync("pie", ["card", "dump-metadata", source.cardName], {
196992
+ const result = import_node_child_process4.spawnSync("pie", ["card", "dump-metadata", source.cardName], {
196865
196993
  cwd: source.backendRoot,
196866
196994
  stdio: ["ignore", "pipe", "pipe"],
196867
196995
  env: process.env
@@ -196993,10 +197121,10 @@ var renderUI = (componentName, meta, inputInterfaceName) => {
196993
197121
  };
196994
197122
  var updateRegistryFile2 = (componentsDir, componentName) => {
196995
197123
  const registryPath = resolveRegistryPath(componentsDir);
196996
- if (!import_node_fs15.default.existsSync(registryPath)) {
197124
+ if (!import_node_fs16.default.existsSync(registryPath)) {
196997
197125
  throw new Error('registry.ts not found. Run "pieui init" first.');
196998
197126
  }
196999
- let registryContent = import_node_fs15.default.readFileSync(registryPath, "utf8");
197127
+ let registryContent = import_node_fs16.default.readFileSync(registryPath, "utf8");
197000
197128
  const importRegex = new RegExp(`["']@/piecomponents/${componentName}["']`);
197001
197129
  if (importRegex.test(registryContent)) {
197002
197130
  throw new Error(`Component ${componentName} is already registered in registry.ts`);
@@ -197005,17 +197133,17 @@ var updateRegistryFile2 = (componentsDir, componentName) => {
197005
197133
  registryContent = registryContent.trimEnd() + `
197006
197134
  ` + importLine + `
197007
197135
  `;
197008
- import_node_fs15.default.writeFileSync(registryPath, registryContent, "utf8");
197136
+ import_node_fs16.default.writeFileSync(registryPath, registryContent, "utf8");
197009
197137
  };
197010
197138
  var hasBackendSourceFor = (componentName) => {
197011
197139
  const cfg = readBackendConfig();
197012
197140
  if (!cfg?.backendComponentsDir)
197013
197141
  return false;
197014
- const componentsDir = import_node_path16.default.resolve(cfg.backendComponentsDir);
197015
- if (!import_node_fs15.default.existsSync(componentsDir))
197142
+ const componentsDir = import_node_path17.default.resolve(cfg.backendComponentsDir);
197143
+ if (!import_node_fs16.default.existsSync(componentsDir))
197016
197144
  return false;
197017
- const candidate = import_node_path16.default.join(componentsDir, cardNameToClassFilename(componentName));
197018
- return import_node_fs15.default.existsSync(candidate);
197145
+ const candidate = import_node_path17.default.join(componentsDir, cardNameToClassFilename(componentName));
197146
+ return import_node_fs16.default.existsSync(candidate);
197019
197147
  };
197020
197148
  var cardAddFromMetaCommand = (componentName, componentType, fromRaw) => {
197021
197149
  if (!componentName) {
@@ -197027,8 +197155,8 @@ var cardAddFromMetaCommand = (componentName, componentType, fromRaw) => {
197027
197155
  const cfg = readBackendConfig();
197028
197156
  const source = resolveSource(fromRaw, componentName, cfg);
197029
197157
  if (source.kind === "name") {
197030
- const candidate = import_node_path16.default.join(source.backendRoot, import_node_path16.default.basename(import_node_path16.default.resolve(cfg.backendComponentsDir)), cardNameToClassFilename(source.cardName));
197031
- if (!import_node_fs15.default.existsSync(candidate)) {
197158
+ const candidate = import_node_path17.default.join(source.backendRoot, import_node_path17.default.basename(import_node_path17.default.resolve(cfg.backendComponentsDir)), cardNameToClassFilename(source.cardName));
197159
+ if (!import_node_fs16.default.existsSync(candidate)) {
197032
197160
  console.warn(`[pieui] Note: expected backend file ${candidate} not found; relying on pie's resolution`);
197033
197161
  }
197034
197162
  }
@@ -197036,30 +197164,30 @@ var cardAddFromMetaCommand = (componentName, componentType, fromRaw) => {
197036
197164
  console.log(`[pieui] Loaded metadata for "${meta.name}" (${meta.events.length} events, input: ${meta.inputPropsCode ? "yes" : "no"})`);
197037
197165
  const dataInterfaceName = extractTypeName(meta.propsCode) || `${componentName}Data`;
197038
197166
  const inputInterfaceName = meta.inputPropsCode ? extractTypeName(meta.inputPropsCode) || `${componentName}StoredInput` : null;
197039
- const pieComponentsDir = import_node_path16.default.join(process.cwd(), "piecomponents");
197040
- if (!import_node_fs15.default.existsSync(pieComponentsDir)) {
197167
+ const pieComponentsDir = import_node_path17.default.join(process.cwd(), "piecomponents");
197168
+ if (!import_node_fs16.default.existsSync(pieComponentsDir)) {
197041
197169
  throw new Error('piecomponents directory not found. Run "pieui init" first.');
197042
197170
  }
197043
- const componentDir = import_node_path16.default.join(pieComponentsDir, componentName);
197044
- if (import_node_fs15.default.existsSync(componentDir)) {
197171
+ const componentDir = import_node_path17.default.join(pieComponentsDir, componentName);
197172
+ if (import_node_fs16.default.existsSync(componentDir)) {
197045
197173
  throw new Error(`Component ${componentName} already exists`);
197046
197174
  }
197047
197175
  try {
197048
- import_node_fs15.default.mkdirSync(import_node_path16.default.join(componentDir, "ui"), { recursive: true });
197049
- import_node_fs15.default.mkdirSync(import_node_path16.default.join(componentDir, "types"), { recursive: true });
197050
- import_node_fs15.default.writeFileSync(import_node_path16.default.join(componentDir, "index.ts"), componentIndexTemplate(componentName), "utf8");
197051
- import_node_fs15.default.writeFileSync(import_node_path16.default.join(componentDir, "types", "index.ts"), renderTypes(componentName, componentType, meta, dataInterfaceName, inputInterfaceName), "utf8");
197052
- import_node_fs15.default.writeFileSync(import_node_path16.default.join(componentDir, "ui", `${componentName}.tsx`), renderUI(componentName, meta, inputInterfaceName), "utf8");
197176
+ import_node_fs16.default.mkdirSync(import_node_path17.default.join(componentDir, "ui"), { recursive: true });
197177
+ import_node_fs16.default.mkdirSync(import_node_path17.default.join(componentDir, "types"), { recursive: true });
197178
+ import_node_fs16.default.writeFileSync(import_node_path17.default.join(componentDir, "index.ts"), componentIndexTemplate(componentName), "utf8");
197179
+ import_node_fs16.default.writeFileSync(import_node_path17.default.join(componentDir, "types", "index.ts"), renderTypes(componentName, componentType, meta, dataInterfaceName, inputInterfaceName), "utf8");
197180
+ import_node_fs16.default.writeFileSync(import_node_path17.default.join(componentDir, "ui", `${componentName}.tsx`), renderUI(componentName, meta, inputInterfaceName), "utf8");
197053
197181
  updateRegistryFile2(pieComponentsDir, componentName);
197054
197182
  } catch (error) {
197055
- import_node_fs15.default.rmSync(componentDir, { recursive: true, force: true });
197183
+ import_node_fs16.default.rmSync(componentDir, { recursive: true, force: true });
197056
197184
  throw error;
197057
197185
  }
197058
197186
  console.log(`[pieui] Component ${componentName} ported from backend successfully`);
197059
197187
  console.log(`[pieui] Files created:`);
197060
- console.log(` - ${import_node_path16.default.join(componentDir, "index.ts")}`);
197061
- console.log(` - ${import_node_path16.default.join(componentDir, "types", "index.ts")}`);
197062
- console.log(` - ${import_node_path16.default.join(componentDir, "ui", `${componentName}.tsx`)}`);
197188
+ console.log(` - ${import_node_path17.default.join(componentDir, "index.ts")}`);
197189
+ console.log(` - ${import_node_path17.default.join(componentDir, "types", "index.ts")}`);
197190
+ console.log(` - ${import_node_path17.default.join(componentDir, "ui", `${componentName}.tsx`)}`);
197063
197191
  console.log(`[pieui] Data interface: ${dataInterfaceName}`);
197064
197192
  if (inputInterfaceName) {
197065
197193
  console.log(`[pieui] Input interface: ${inputInterfaceName}`);
@@ -197119,8 +197247,8 @@ var pageAddCommand = (pagePath) => {
197119
197247
  };
197120
197248
 
197121
197249
  // src/code/commands/pageView.ts
197122
- var import_node_fs16 = __toESM(require("node:fs"));
197123
- var import_node_path17 = __toESM(require("node:path"));
197250
+ var import_node_fs17 = __toESM(require("node:fs"));
197251
+ var import_node_path18 = __toESM(require("node:path"));
197124
197252
  var normalizePagePath2 = (pagePath) => {
197125
197253
  const trimmed = pagePath.trim();
197126
197254
  if (!trimmed)
@@ -197129,7 +197257,7 @@ var normalizePagePath2 = (pagePath) => {
197129
197257
  const noRel = slashed.replace(/^\.\/+/, "");
197130
197258
  const noApp = noRel.replace(/^app\//, "");
197131
197259
  const noEdge = noApp.replace(/^\/+|\/+$/g, "");
197132
- const normalized = import_node_path17.default.posix.normalize(noEdge);
197260
+ const normalized = import_node_path18.default.posix.normalize(noEdge);
197133
197261
  if (!normalized || normalized === ".") {
197134
197262
  throw new Error("Path is required for page view command");
197135
197263
  }
@@ -197140,11 +197268,11 @@ var normalizePagePath2 = (pagePath) => {
197140
197268
  };
197141
197269
  var pageViewCommand = (pagePath) => {
197142
197270
  const normalized = normalizePagePath2(pagePath);
197143
- const target = import_node_path17.default.join(process.cwd(), "app", normalized, "page.tsx");
197144
- if (!import_node_fs16.default.existsSync(target)) {
197271
+ const target = import_node_path18.default.join(process.cwd(), "app", normalized, "page.tsx");
197272
+ if (!import_node_fs17.default.existsSync(target)) {
197145
197273
  throw new Error(`Page file not found: ${target}`);
197146
197274
  }
197147
- const source = import_node_fs16.default.readFileSync(target, "utf8");
197275
+ const source = import_node_fs17.default.readFileSync(target, "utf8");
197148
197276
  console.log(`[pieui] Path: ${target}`);
197149
197277
  console.log("");
197150
197278
  process.stdout.write(source);
@@ -197154,26 +197282,26 @@ var pageViewCommand = (pagePath) => {
197154
197282
  };
197155
197283
 
197156
197284
  // src/code/commands/pageAjax.ts
197157
- var import_node_fs17 = __toESM(require("node:fs"));
197158
- var import_node_path18 = __toESM(require("node:path"));
197159
- var import_node_child_process4 = require("node:child_process");
197285
+ var import_node_fs18 = __toESM(require("node:fs"));
197286
+ var import_node_path19 = __toESM(require("node:path"));
197287
+ var import_node_child_process5 = require("node:child_process");
197160
197288
  var PIE_CONFIG_PATH2 = ".pie/config.json";
197161
197289
  var readBackendRoot = () => {
197162
- const configPath = import_node_path18.default.join(process.cwd(), PIE_CONFIG_PATH2);
197163
- if (!import_node_fs17.default.existsSync(configPath))
197290
+ const configPath = import_node_path19.default.join(process.cwd(), PIE_CONFIG_PATH2);
197291
+ if (!import_node_fs18.default.existsSync(configPath))
197164
197292
  return;
197165
197293
  try {
197166
- const parsed = JSON.parse(import_node_fs17.default.readFileSync(configPath, "utf8"));
197294
+ const parsed = JSON.parse(import_node_fs18.default.readFileSync(configPath, "utf8"));
197167
197295
  if (typeof parsed !== "object" || parsed === null)
197168
197296
  return;
197169
197297
  const config = parsed;
197170
197298
  if (!config.backendPagesDir)
197171
197299
  return;
197172
- const pages = import_node_path18.default.resolve(config.backendPagesDir);
197173
- if (!import_node_fs17.default.existsSync(pages) || !import_node_fs17.default.statSync(pages).isDirectory()) {
197300
+ const pages = import_node_path19.default.resolve(config.backendPagesDir);
197301
+ if (!import_node_fs18.default.existsSync(pages) || !import_node_fs18.default.statSync(pages).isDirectory()) {
197174
197302
  return;
197175
197303
  }
197176
- return import_node_path18.default.dirname(pages);
197304
+ return import_node_path19.default.dirname(pages);
197177
197305
  } catch {
197178
197306
  return;
197179
197307
  }
@@ -197190,7 +197318,7 @@ var pageAjaxCommand = (pageName, action, handlerName) => {
197190
197318
  }
197191
197319
  console.log(`[pieui] Delegating to backend: ${backendRoot}`);
197192
197320
  console.log(`[pieui] pie page ajax ${pageName} ${action} ${handlerName}`);
197193
- const result = import_node_child_process4.spawnSync("pie", ["page", "ajax", pageName, action, handlerName], { cwd: backendRoot, stdio: "inherit", env: process.env });
197321
+ const result = import_node_child_process5.spawnSync("pie", ["page", "ajax", pageName, action, handlerName], { cwd: backendRoot, stdio: "inherit", env: process.env });
197194
197322
  if (result.error) {
197195
197323
  throw new Error(`Failed to invoke \`pie\` in ${backendRoot}: ${result.error.message}`);
197196
197324
  }
@@ -197556,49 +197684,49 @@ var createPieAppCommand = (appName) => {
197556
197684
  };
197557
197685
 
197558
197686
  // src/code/commands/login.ts
197559
- var import_node_child_process5 = require("node:child_process");
197687
+ var import_node_child_process6 = require("node:child_process");
197560
197688
  var import_node_crypto = require("node:crypto");
197561
- var import_node_fs19 = __toESM(require("node:fs"));
197562
- var import_node_path20 = __toESM(require("node:path"));
197689
+ var import_node_fs20 = __toESM(require("node:fs"));
197690
+ var import_node_path21 = __toESM(require("node:path"));
197563
197691
 
197564
197692
  // src/code/services/projectLinks.ts
197565
- var import_node_fs18 = __toESM(require("node:fs"));
197566
- var import_node_path19 = __toESM(require("node:path"));
197693
+ var import_node_fs19 = __toESM(require("node:fs"));
197694
+ var import_node_path20 = __toESM(require("node:path"));
197567
197695
  var readline3 = __toESM(require("node:readline/promises"));
197568
197696
  var PIE_CONFIG_DIR3 = ".pie";
197569
197697
  var PIE_CONFIG_FILE3 = "config.json";
197570
- var configPathFor = (cwd) => import_node_path19.default.join(cwd, PIE_CONFIG_DIR3, PIE_CONFIG_FILE3);
197698
+ var configPathFor = (cwd) => import_node_path20.default.join(cwd, PIE_CONFIG_DIR3, PIE_CONFIG_FILE3);
197571
197699
  var readConfig2 = (cwd) => {
197572
197700
  const p = configPathFor(cwd);
197573
- if (!import_node_fs18.default.existsSync(p))
197701
+ if (!import_node_fs19.default.existsSync(p))
197574
197702
  return {};
197575
197703
  try {
197576
- const parsed = JSON.parse(import_node_fs18.default.readFileSync(p, "utf8"));
197704
+ const parsed = JSON.parse(import_node_fs19.default.readFileSync(p, "utf8"));
197577
197705
  return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) ? parsed : {};
197578
197706
  } catch {
197579
197707
  return {};
197580
197708
  }
197581
197709
  };
197582
197710
  var writeConfig2 = (cwd, config) => {
197583
- const dir = import_node_path19.default.join(cwd, PIE_CONFIG_DIR3);
197584
- import_node_fs18.default.mkdirSync(dir, { recursive: true });
197585
- import_node_fs18.default.writeFileSync(configPathFor(cwd), JSON.stringify(config, null, 2) + `
197711
+ const dir = import_node_path20.default.join(cwd, PIE_CONFIG_DIR3);
197712
+ import_node_fs19.default.mkdirSync(dir, { recursive: true });
197713
+ import_node_fs19.default.writeFileSync(configPathFor(cwd), JSON.stringify(config, null, 2) + `
197586
197714
  `, "utf8");
197587
197715
  };
197588
197716
  var walkUpForPyproject2 = (start) => {
197589
- let dir = import_node_path19.default.resolve(start);
197590
- while (dir !== import_node_path19.default.dirname(dir)) {
197591
- if (import_node_fs18.default.existsSync(import_node_path19.default.join(dir, "pyproject.toml")))
197717
+ let dir = import_node_path20.default.resolve(start);
197718
+ while (dir !== import_node_path20.default.dirname(dir)) {
197719
+ if (import_node_fs19.default.existsSync(import_node_path20.default.join(dir, "pyproject.toml")))
197592
197720
  return dir;
197593
- dir = import_node_path19.default.dirname(dir);
197721
+ dir = import_node_path20.default.dirname(dir);
197594
197722
  }
197595
197723
  return null;
197596
197724
  };
197597
197725
  var ensureBackendDir2 = async (cwd) => {
197598
197726
  const config = readConfig2(cwd);
197599
197727
  if (config.backendProjectDir) {
197600
- const dir = import_node_path19.default.resolve(cwd, config.backendProjectDir);
197601
- if (import_node_fs18.default.existsSync(dir) && import_node_fs18.default.statSync(dir).isDirectory())
197728
+ const dir = import_node_path20.default.resolve(cwd, config.backendProjectDir);
197729
+ if (import_node_fs19.default.existsSync(dir) && import_node_fs19.default.statSync(dir).isDirectory())
197602
197730
  return dir;
197603
197731
  console.error(`[pieui] Configured backendProjectDir not found: ${dir}`);
197604
197732
  }
@@ -197623,9 +197751,9 @@ var ensureBackendDir2 = async (cwd) => {
197623
197751
  const raw = (await rl.question("[pieui] Path to backend (pie) project: ")).trim();
197624
197752
  if (!raw)
197625
197753
  return null;
197626
- const expanded = raw.startsWith("~") ? import_node_path19.default.join(process.env.HOME || "", raw.slice(1).replace(/^[\\/]/, "")) : raw;
197627
- const absolute = import_node_path19.default.resolve(expanded);
197628
- if (!import_node_fs18.default.existsSync(absolute) || !import_node_fs18.default.statSync(absolute).isDirectory()) {
197754
+ const expanded = raw.startsWith("~") ? import_node_path20.default.join(process.env.HOME || "", raw.slice(1).replace(/^[\\/]/, "")) : raw;
197755
+ const absolute = import_node_path20.default.resolve(expanded);
197756
+ if (!import_node_fs19.default.existsSync(absolute) || !import_node_fs19.default.statSync(absolute).isDirectory()) {
197629
197757
  console.error(`[pieui] Not a directory: ${absolute}`);
197630
197758
  return null;
197631
197759
  }
@@ -197659,11 +197787,11 @@ var generateCode = (length = CODE_LENGTH) => {
197659
197787
  var tryOpenBrowser = (url) => {
197660
197788
  try {
197661
197789
  if (process.platform === "win32") {
197662
- import_node_child_process5.execFile("cmd", ["/c", "start", "", url], () => {});
197790
+ import_node_child_process6.execFile("cmd", ["/c", "start", "", url], () => {});
197663
197791
  } else if (process.platform === "darwin") {
197664
- import_node_child_process5.execFile("open", [url], () => {});
197792
+ import_node_child_process6.execFile("open", [url], () => {});
197665
197793
  } else {
197666
- import_node_child_process5.execFile("xdg-open", [url], () => {});
197794
+ import_node_child_process6.execFile("xdg-open", [url], () => {});
197667
197795
  }
197668
197796
  } catch {}
197669
197797
  };
@@ -197694,8 +197822,8 @@ var appendPieCredentialsToEnv = (cwd, config) => {
197694
197822
  if (Object.keys(entries).length === 0) {
197695
197823
  return;
197696
197824
  }
197697
- const envPath = import_node_path20.default.join(cwd, ".env");
197698
- let content = import_node_fs19.default.existsSync(envPath) ? import_node_fs19.default.readFileSync(envPath, "utf8") : "";
197825
+ const envPath = import_node_path21.default.join(cwd, ".env");
197826
+ let content = import_node_fs20.default.existsSync(envPath) ? import_node_fs20.default.readFileSync(envPath, "utf8") : "";
197699
197827
  if (content.length > 0 && !content.endsWith(`
197700
197828
  `)) {
197701
197829
  content += `
@@ -197705,7 +197833,7 @@ var appendPieCredentialsToEnv = (cwd, config) => {
197705
197833
  content += `${additions.join(`
197706
197834
  `)}
197707
197835
  `;
197708
- import_node_fs19.default.writeFileSync(envPath, content, "utf8");
197836
+ import_node_fs20.default.writeFileSync(envPath, content, "utf8");
197709
197837
  console.log(`[pie] Appended credentials to ${envPath}`);
197710
197838
  };
197711
197839
  async function loginCommand(options = {}) {
@@ -197726,8 +197854,8 @@ async function loginCommand(options = {}) {
197726
197854
  try {
197727
197855
  openBrowser(connectUrl);
197728
197856
  } catch {}
197729
- const pieDir = import_node_path20.default.join(cwd, ".pie");
197730
- const configPath = import_node_path20.default.join(pieDir, "config.json");
197857
+ const pieDir = import_node_path21.default.join(cwd, ".pie");
197858
+ const configPath = import_node_path21.default.join(pieDir, "config.json");
197731
197859
  const url = `${credentialsApi}?${new URLSearchParams({ code }).toString()}`;
197732
197860
  let first = true;
197733
197861
  while (true) {
@@ -197761,7 +197889,7 @@ async function loginCommand(options = {}) {
197761
197889
  throw new Error("Login succeeded but response had no 'config' field");
197762
197890
  }
197763
197891
  const credBlob = typeof record.config === "object" && record.config !== null && !Array.isArray(record.config) ? record.config : {};
197764
- import_node_fs19.default.mkdirSync(pieDir, { recursive: true });
197892
+ import_node_fs20.default.mkdirSync(pieDir, { recursive: true });
197765
197893
  mergeConfig(cwd, credBlob);
197766
197894
  console.log(`[pie] Saved credentials to ${configPath}`);
197767
197895
  appendPieCredentialsToEnv(cwd, record.config);
@@ -197776,9 +197904,9 @@ async function loginCommand(options = {}) {
197776
197904
  }
197777
197905
 
197778
197906
  // src/code/commands/selfUpgrade.ts
197779
- var import_node_child_process6 = require("node:child_process");
197780
- var import_node_fs20 = __toESM(require("node:fs"));
197781
- var import_node_path21 = __toESM(require("node:path"));
197907
+ var import_node_child_process7 = require("node:child_process");
197908
+ var import_node_fs21 = __toESM(require("node:fs"));
197909
+ var import_node_path22 = __toESM(require("node:path"));
197782
197910
  var __dirname = "/home/runner/work/pieui/pieui/src/code/commands";
197783
197911
  var PACKAGE_NAME = "@swarm.ing/pieui";
197784
197912
  var INSTALL_ARGS = {
@@ -197789,7 +197917,7 @@ var INSTALL_ARGS = {
197789
197917
  };
197790
197918
  var isPackageManager = (value2) => value2 === "bun" || value2 === "npm" || value2 === "pnpm" || value2 === "yarn";
197791
197919
  var hasBinary = (bin) => {
197792
- const result = import_node_child_process6.spawnSync("which", [bin], { stdio: "ignore" });
197920
+ const result = import_node_child_process7.spawnSync("which", [bin], { stdio: "ignore" });
197793
197921
  return result.status === 0;
197794
197922
  };
197795
197923
  var detectPackageManager = () => {
@@ -197802,13 +197930,13 @@ var detectPackageManager = () => {
197802
197930
  };
197803
197931
  var readInstalledVersion = () => {
197804
197932
  const candidates = [
197805
- import_node_path21.default.resolve(__dirname, "..", "package.json"),
197806
- import_node_path21.default.resolve(__dirname, "..", "..", "package.json"),
197807
- import_node_path21.default.resolve(__dirname, "..", "..", "..", "package.json")
197933
+ import_node_path22.default.resolve(__dirname, "..", "package.json"),
197934
+ import_node_path22.default.resolve(__dirname, "..", "..", "package.json"),
197935
+ import_node_path22.default.resolve(__dirname, "..", "..", "..", "package.json")
197808
197936
  ];
197809
197937
  for (const file of candidates) {
197810
197938
  try {
197811
- const raw = import_node_fs20.default.readFileSync(file, "utf8");
197939
+ const raw = import_node_fs21.default.readFileSync(file, "utf8");
197812
197940
  const parsed = JSON.parse(raw);
197813
197941
  if (parsed.name === PACKAGE_NAME && parsed.version) {
197814
197942
  return parsed.version;
@@ -197832,7 +197960,7 @@ var selfUpgradeCommand = async (override) => {
197832
197960
  }
197833
197961
  const args = INSTALL_ARGS[pm];
197834
197962
  console.log(`[pieui] Upgrading via ${pm}: ${pm} ${args.join(" ")}`);
197835
- const result = import_node_child_process6.spawnSync(pm, args, {
197963
+ const result = import_node_child_process7.spawnSync(pm, args, {
197836
197964
  stdio: "inherit",
197837
197965
  env: process.env
197838
197966
  });
@@ -197916,8 +198044,8 @@ var main = async () => {
197916
198044
  await selfUpgradeCommand(args.selfUpgradePm);
197917
198045
  return;
197918
198046
  case "postbuild":
197919
- console.log(`[pieui] Source directory: ${import_node_path22.default.resolve(process.cwd(), srcDir)}`);
197920
- console.log(`[pieui] Output directory: ${import_node_path22.default.resolve(process.cwd(), outDir)}`);
198047
+ console.log(`[pieui] Source directory: ${import_node_path23.default.resolve(process.cwd(), srcDir)}`);
198048
+ console.log(`[pieui] Output directory: ${import_node_path23.default.resolve(process.cwd(), outDir)}`);
197921
198049
  console.log(`[pieui] Append mode: ${append}`);
197922
198050
  await postbuildCommand(srcDir, outDir, append);
197923
198051
  return;
@@ -197994,6 +198122,13 @@ var main = async () => {
197994
198122
  cardAddStoryCommand(name, { force: cardAddStoryForce });
197995
198123
  return;
197996
198124
  }
198125
+ if (cardAction === "generate-preview") {
198126
+ const name = requireName(componentName, "Component name");
198127
+ await cardGeneratePreviewCommand(name, {
198128
+ out: args.cardGeneratePreviewOut
198129
+ });
198130
+ return;
198131
+ }
197997
198132
  if (cardAction === "remote") {
197998
198133
  if (cardRemoteAction === "list") {
197999
198134
  await cardRemoteListCommand({
@@ -1 +1 @@
1
- {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/code/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAOR,UAAU,EACb,MAAM,SAAS,CAAA;AAyKhB,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAG,UA2I1C,CAAA;AAED,MAAM,MAAM,SAAS,GACf,KAAK,GACL,OAAO,GACP,QAAQ,GACR,MAAM,GACN,WAAW,GACX,MAAM,GACN,aAAa,GACb,MAAM,GACN,cAAc,CAAA;AAEpB,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,KAAG,SAAS,GAAG,IAe5D,CAAA;AAwMD,eAAO,MAAM,UAAU,GAAI,QAAO,SAAiB,SAwBlD,CAAA"}
1
+ {"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../src/code/args.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAOR,UAAU,EACb,MAAM,SAAS,CAAA;AA0KhB,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,EAAE,KAAG,UA8I1C,CAAA;AAED,MAAM,MAAM,SAAS,GACf,KAAK,GACL,OAAO,GACP,QAAQ,GACR,MAAM,GACN,WAAW,GACX,MAAM,GACN,aAAa,GACb,MAAM,GACN,cAAc,CAAA;AAEpB,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,KAAG,SAAS,GAAG,IAe5D,CAAA;AA0MD,eAAO,MAAM,UAAU,GAAI,QAAO,SAAiB,SAwBlD,CAAA"}
@@ -0,0 +1,4 @@
1
+ export declare const cardGeneratePreviewCommand: (componentName: string, options?: {
2
+ out?: string;
3
+ }) => Promise<void>;
4
+ //# sourceMappingURL=cardGeneratePreview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cardGeneratePreview.d.ts","sourceRoot":"","sources":["../../../src/code/commands/cardGeneratePreview.ts"],"names":[],"mappings":"AAqDA,eAAO,MAAM,0BAA0B,GACnC,eAAe,MAAM,EACrB,UAAS;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,KAC/B,OAAO,CAAC,IAAI,CAwHd,CAAA"}
@@ -3,7 +3,7 @@ export declare const MANIFEST_FILENAME = "pieui.components.json";
3
3
  export declare const REGISTER_FUNCTION = "registerPieComponent";
4
4
  export type ComponentType = 'simple' | 'complex' | 'simple-container' | 'complex-container';
5
5
  export type ListFilter = 'all' | ComponentType;
6
- export type CardAction = 'add' | 'list' | 'pull' | 'view' | 'remove' | 'list-events' | 'add-event' | 'remote' | 'dump-metadata' | 'check-sync' | 'add-story';
6
+ export type CardAction = 'add' | 'list' | 'pull' | 'view' | 'remove' | 'list-events' | 'add-event' | 'remote' | 'dump-metadata' | 'check-sync' | 'add-story' | 'generate-preview';
7
7
  export type CardRemoteAction = 'push' | 'pull' | 'list' | 'remove' | 'history' | 'public' | 'private';
8
8
  export type PageAction = 'add' | 'view' | 'ajax';
9
9
  export type PageAjaxAction = 'add' | 'remove';
@@ -38,6 +38,7 @@ export type ParsedArgs = {
38
38
  historyTo?: number;
39
39
  selfUpgradePm?: string;
40
40
  dumpMetadataOut?: string;
41
+ cardGeneratePreviewOut?: string;
41
42
  };
42
43
  export type CardScaffoldOptions = {
43
44
  ajax?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/code/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/code/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,GAAG,MAAM,wBAAwB,CAAA;AAElD,eAAO,MAAM,iBAAiB,0BAA0B,CAAA;AACxD,eAAO,MAAM,iBAAiB,yBAAyB,CAAA;AAEvD,MAAM,MAAM,aAAa,GACnB,QAAQ,GACR,SAAS,GACT,kBAAkB,GAClB,mBAAmB,CAAA;AAEzB,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,aAAa,CAAA;AAC9C,MAAM,MAAM,UAAU,GAChB,KAAK,GACL,MAAM,GACN,MAAM,GACN,MAAM,GACN,QAAQ,GACR,aAAa,GACb,WAAW,GACX,QAAQ,GACR,eAAe,GACf,YAAY,GACZ,WAAW,GACX,kBAAkB,CAAA;AACxB,MAAM,MAAM,gBAAgB,GACtB,MAAM,GACN,MAAM,GACN,MAAM,GACN,QAAQ,GACR,SAAS,GACT,QAAQ,GACR,SAAS,CAAA;AACf,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAA;AAChD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,CAAA;AAE7C,MAAM,MAAM,UAAU,GAAG;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAClC,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAC9B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,EAAE,CAAC,EAAE,OAAO,CAAA;IACZ,KAAK,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,GAAG,CAAC,UAAU,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEhD,MAAM,MAAM,YAAY,GAAG;IACvB;;yBAEqB;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,6CAA6C;IAC7C,OAAO,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACtB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,YAAY,EAAE,CAAA;IACrB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,WAAW,EAAE,UAAU,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;IAC7C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,gBAAgB,EAAE,UAAU,GAAG,IAAI,CAAA;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAA;CACrB,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swarm.ing/pieui",
3
- "version": "2.0.30",
3
+ "version": "2.0.32",
4
4
  "description": "A React component library featuring PieCard component",
5
5
  "repository": {
6
6
  "type": "git",
@@ -46,8 +46,8 @@
46
46
  }
47
47
  },
48
48
  "scripts": {
49
- "build": "rm -rf ./dist && rm -rf pieui-*.tgz && bun run build:clean && NODE_ENV=production bun run build:esm && NODE_ENV=production bun run build:cjs && NODE_ENV=production bun run build:components:esm && NODE_ENV=production bun run build:components:cjs && NODE_ENV=production bun run build:storybook:esm && NODE_ENV=production bun run build:storybook:cjs && NODE_ENV=production bun run build:storybook:addon:esm && NODE_ENV=production bun run build:storybook:addon:cjs && NODE_ENV=production bun run build:storybook:addon:preset && NODE_ENV=production bun run build:storybook:addon:manager:esm && NODE_ENV=production bun run build:storybook:addon:manager:cjs && bun run build:banner && NODE_ENV=production bun run build:types && NODE_ENV=production bun run build:cli && bun src/cli.ts postbuild --src-dir src --out-dir dist && bun pm pack",
50
- "build:banner": "node -e \"const fs=require('fs');['dist/index.esm.js','dist/index.js','dist/components/index.esm.js','dist/components/index.js','dist/storybook/index.esm.js','dist/storybook/index.js','dist/storybook/addon/index.esm.js','dist/storybook/addon/index.js','dist/storybook/addon/manager.esm.js','dist/storybook/addon/manager.js'].forEach(f=>{if(fs.existsSync(f)){fs.writeFileSync(f,'\\\"use client\\\";\\n'+fs.readFileSync(f,'utf8'))}})\"",
49
+ "build": "rm -rf ./dist && rm -rf pieui-*.tgz && bun run build:clean && NODE_ENV=production bun run build:esm && NODE_ENV=production bun run build:cjs && NODE_ENV=production bun run build:components:esm && NODE_ENV=production bun run build:components:cjs && NODE_ENV=production bun run build:storybook:esm && NODE_ENV=production bun run build:storybook:cjs && NODE_ENV=production bun run build:storybook:addon:esm && NODE_ENV=production bun run build:storybook:addon:cjs && NODE_ENV=production bun run build:storybook:addon:preset && bun run build:banner && NODE_ENV=production bun run build:types && NODE_ENV=production bun run build:cli && bun src/cli.ts postbuild --src-dir src --out-dir dist && bun pm pack",
50
+ "build:banner": "node -e \"const fs=require('fs');['dist/index.esm.js','dist/index.js','dist/components/index.esm.js','dist/components/index.js','dist/storybook/index.esm.js','dist/storybook/index.js','dist/storybook/addon/index.esm.js','dist/storybook/addon/index.js'].forEach(f=>{if(fs.existsSync(f)){fs.writeFileSync(f,'\\\"use client\\\";\\n'+fs.readFileSync(f,'utf8'))}})\"",
51
51
  "build:clean": "rm -rf dist",
52
52
  "build:esm": "bun build src/index.ts --outfile dist/index.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --minify --packages=external",
53
53
  "build:cjs": "bun build src/index.ts --outfile dist/index.js --format cjs --target node --jsx=automatic --jsx-import-source=react --minify --packages=external",
@@ -58,8 +58,8 @@
58
58
  "build:storybook:addon:esm": "bun build src/storybook/addon/index.tsx --outfile dist/storybook/addon/index.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --minify --packages=external",
59
59
  "build:storybook:addon:cjs": "bun build src/storybook/addon/index.tsx --outfile dist/storybook/addon/index.js --format cjs --target node --jsx=automatic --jsx-import-source=react --minify --packages=external",
60
60
  "build:storybook:addon:preset": "mkdir -p dist/storybook/addon && cp src/storybook/addon/preset.cjs dist/storybook/addon/preset.js",
61
- "build:storybook:addon:manager:esm": "bun build src/storybook/addon/manager.tsx --outfile dist/storybook/addon/manager.esm.js --format esm --target browser --jsx-runtime=classic --minify --packages=external",
62
- "build:storybook:addon:manager:cjs": "bun build src/storybook/addon/manager.tsx --outfile dist/storybook/addon/manager.js --format cjs --target node --jsx-runtime=classic --minify --packages=external",
61
+ "build:storybook:addon:manager:esm": "bun build src/storybook/addon/manager.tsx --outfile dist/storybook/addon/manager.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --minify --packages=external",
62
+ "build:storybook:addon:manager:cjs": "bun build src/storybook/addon/manager.tsx --outfile dist/storybook/addon/manager.js --format cjs --target node --jsx=automatic --jsx-import-source=react --minify --packages=external",
63
63
  "build:esm:debug": "bun build src/index.ts --outfile dist/index.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --packages=external",
64
64
  "build:cjs:debug": "bun build src/index.ts --outfile dist/index.js --format cjs --target node --jsx=automatic --jsx-import-source=react --packages=external",
65
65
  "build:components:esm:debug": "bun build src/components/index.ts --outfile dist/components/index.esm.js --format esm --target browser --jsx=automatic --jsx-import-source=react --packages=external",
@@ -1,3 +0,0 @@
1
- "use client";
2
- import"react";import{addons as Q,types as f}from"storybook/manager-api";import*as n from"react";import{useEffect as X,useMemo as Z,useState as q}from"react";import{addons as $,useParameter as j}from"storybook/manager-api";var S="piecard",H="piecard/fire";var u=({children:i,style:x})=>n.createElement("pre",{style:{margin:0,padding:8,fontSize:11,background:"#f5f5f5",border:"1px solid #e0e0e0",borderRadius:4,overflow:"auto",...x??{}}},i),K=(i)=>{if(i.samplePayload!==void 0)try{return JSON.stringify(i.samplePayload,null,2)}catch{}let x=i.payloadSchema;if(!x||typeof x!=="object")return"{}";let T=x.properties??{};if(!Object.keys(T).length)return"{}";let C={};for(let[b,g]of Object.entries(T)){if(typeof g!=="object"||g===null)continue;let w=g.type;if(w==="string")C[b]="";else if(w==="number"||w==="integer")C[b]=0;else if(w==="boolean")C[b]=!1;else if(w==="array")C[b]=[];else if(w==="object")C[b]={};else C[b]=null}return JSON.stringify(C,null,2)},Y=({card:i,method:x})=>{let T=Z(()=>K(x),[x]),[C,b]=q(T),[g,w]=q(null),[z,V]=q(null),W=()=>{let O=void 0,B=C.trim();if(B.length>0)try{O=JSON.parse(B)}catch(G){w(G instanceof Error?G.message:"Invalid JSON payload");return}w(null),$.getChannel().emit(H,{card:i,method:x.name,payload:O}),V(Date.now())};return n.createElement("div",{style:{padding:12,borderBottom:"1px solid #eee",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'}},n.createElement("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:6}},n.createElement("code",{style:{fontSize:13,fontWeight:600}},i,".",x.name),n.createElement("button",{type:"button",onClick:W,style:{marginLeft:"auto",padding:"4px 10px",fontSize:12,background:"#1ea7fd",color:"white",border:"none",borderRadius:4,cursor:"pointer"}},"Fire")),x.payloadCode?n.createElement("details",{style:{marginBottom:6}},n.createElement("summary",{style:{fontSize:11,cursor:"pointer"}},"Payload type"),n.createElement(u,null,x.payloadCode)):null,n.createElement("textarea",{value:C,onChange:(O)=>b(O.target.value),rows:Math.min(10,Math.max(2,C.split(`
3
- `).length)),style:{width:"100%",fontFamily:"monospace",fontSize:12,padding:6,border:"1px solid #ddd",borderRadius:4,boxSizing:"border-box"}}),g?n.createElement("div",{style:{marginTop:4,color:"#c00",fontSize:11}},g):null,z?n.createElement("div",{style:{marginTop:4,color:"#666",fontSize:11}},"Fired at ",new Date(z).toLocaleTimeString()):null)},J=({active:i})=>{let x=j(S,null);if(X(()=>{},[x]),!i)return null;if(!x||!x.card)return n.createElement("div",{style:{padding:16,fontSize:13,color:"#666"}},n.createElement("strong",null,"No PieCard parameters on this story."),n.createElement("p",{style:{marginTop:8}},"Add"," ",n.createElement("code",null,"parameters.",S," = ","{"," card, methods"," ","}")," ","to your story to surface method triggers here."));let T=x.methods??[];if(T.length===0)return n.createElement("div",{style:{padding:16,fontSize:13,color:"#666"}},"No methods declared for ",n.createElement("code",null,x.card),".");return n.createElement("div",null,T.map((C)=>n.createElement(Y,{key:C.name,card:x.card,method:C})))};var U="piecard",k=`${U}/panel`;Q.register(U,()=>{Q.add(k,{type:f.PANEL,title:"PieCard Methods",match:({viewMode:i})=>i==="story",render:({active:i})=>J({active:i})})});
@@ -1,3 +0,0 @@
1
- "use client";
2
- var $=Object.create;var{getPrototypeOf:j,defineProperty:Q,getOwnPropertyNames:u}=Object;var K=Object.prototype.hasOwnProperty;function Y(x){return this[x]}var f,k,I=(x,i,b)=>{var C=x!=null&&typeof x==="object";if(C){var T=i?f??=new WeakMap:k??=new WeakMap,g=T.get(x);if(g)return g}b=x!=null?$(j(x)):{};let w=i||!x||!x.__esModule?Q(b,"default",{value:x,enumerable:!0}):b;for(let S of u(x))if(!K.call(w,S))Q(w,S,{get:Y.bind(x,S),enumerable:!0});if(C)T.set(x,w);return w};var v=require("react"),q=require("storybook/manager-api");var n=I(require("react")),O=require("react"),B=require("storybook/manager-api");var G="piecard",U="piecard/fire";var L=({children:x,style:i})=>n.createElement("pre",{style:{margin:0,padding:8,fontSize:11,background:"#f5f5f5",border:"1px solid #e0e0e0",borderRadius:4,overflow:"auto",...i??{}}},x),M=(x)=>{if(x.samplePayload!==void 0)try{return JSON.stringify(x.samplePayload,null,2)}catch{}let i=x.payloadSchema;if(!i||typeof i!=="object")return"{}";let b=i.properties??{};if(!Object.keys(b).length)return"{}";let C={};for(let[T,g]of Object.entries(b)){if(typeof g!=="object"||g===null)continue;let w=g.type;if(w==="string")C[T]="";else if(w==="number"||w==="integer")C[T]=0;else if(w==="boolean")C[T]=!1;else if(w==="array")C[T]=[];else if(w==="object")C[T]={};else C[T]=null}return JSON.stringify(C,null,2)},N=({card:x,method:i})=>{let b=O.useMemo(()=>M(i),[i]),[C,T]=O.useState(b),[g,w]=O.useState(null),[S,X]=O.useState(null),Z=()=>{let z=void 0,H=C.trim();if(H.length>0)try{z=JSON.parse(H)}catch(J){w(J instanceof Error?J.message:"Invalid JSON payload");return}w(null),B.addons.getChannel().emit(U,{card:x,method:i.name,payload:z}),X(Date.now())};return n.createElement("div",{style:{padding:12,borderBottom:"1px solid #eee",fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'}},n.createElement("div",{style:{display:"flex",alignItems:"center",gap:12,marginBottom:6}},n.createElement("code",{style:{fontSize:13,fontWeight:600}},x,".",i.name),n.createElement("button",{type:"button",onClick:Z,style:{marginLeft:"auto",padding:"4px 10px",fontSize:12,background:"#1ea7fd",color:"white",border:"none",borderRadius:4,cursor:"pointer"}},"Fire")),i.payloadCode?n.createElement("details",{style:{marginBottom:6}},n.createElement("summary",{style:{fontSize:11,cursor:"pointer"}},"Payload type"),n.createElement(L,null,i.payloadCode)):null,n.createElement("textarea",{value:C,onChange:(z)=>T(z.target.value),rows:Math.min(10,Math.max(2,C.split(`
3
- `).length)),style:{width:"100%",fontFamily:"monospace",fontSize:12,padding:6,border:"1px solid #ddd",borderRadius:4,boxSizing:"border-box"}}),g?n.createElement("div",{style:{marginTop:4,color:"#c00",fontSize:11}},g):null,S?n.createElement("div",{style:{marginTop:4,color:"#666",fontSize:11}},"Fired at ",new Date(S).toLocaleTimeString()):null)},V=({active:x})=>{let i=B.useParameter(G,null);if(O.useEffect(()=>{},[i]),!x)return null;if(!i||!i.card)return n.createElement("div",{style:{padding:16,fontSize:13,color:"#666"}},n.createElement("strong",null,"No PieCard parameters on this story."),n.createElement("p",{style:{marginTop:8}},"Add"," ",n.createElement("code",null,"parameters.",G," = ","{"," card, methods"," ","}")," ","to your story to surface method triggers here."));let b=i.methods??[];if(b.length===0)return n.createElement("div",{style:{padding:16,fontSize:13,color:"#666"}},"No methods declared for ",n.createElement("code",null,i.card),".");return n.createElement("div",null,b.map((C)=>n.createElement(N,{key:C.name,card:i.card,method:C})))};var W="piecard",P=`${W}/panel`;q.addons.register(W,()=>{q.addons.add(P,{type:q.types.PANEL,title:"PieCard Methods",match:({viewMode:x})=>x==="story",render:({active:x})=>V({active:x})})});