@timo9378/flow2code 0.1.5 → 0.1.6
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/CHANGELOG.md +12 -0
- package/dist/cli.js +14 -14
- package/dist/compiler.cjs +11 -13
- package/dist/compiler.js +11 -13
- package/dist/server.js +14 -14
- package/out/404.html +1 -1
- package/out/__next.__PAGE__.txt +2 -2
- package/out/__next._full.txt +2 -2
- package/out/__next._head.txt +1 -1
- package/out/__next._index.txt +1 -1
- package/out/__next._tree.txt +1 -1
- package/out/_next/static/chunks/{2be31674b47c1089.js → bfa275b7488d8b70.js} +1 -1
- package/out/_not-found/__next._full.txt +1 -1
- package/out/_not-found/__next._head.txt +1 -1
- package/out/_not-found/__next._index.txt +1 -1
- package/out/_not-found/__next._not-found/__PAGE__.txt +1 -1
- package/out/_not-found/__next._not-found.txt +1 -1
- package/out/_not-found/__next._tree.txt +1 -1
- package/out/_not-found.html +1 -1
- package/out/_not-found.txt +1 -1
- package/out/index.html +2 -2
- package/out/index.txt +2 -2
- package/package.json +1 -1
- /package/out/_next/static/{qqgjMH_XFks-bLx9gn_yB → wFX9tOZWtEdER7XrtbgHQ}/_buildManifest.js +0 -0
- /package/out/_next/static/{qqgjMH_XFks-bLx9gn_yB → wFX9tOZWtEdER7XrtbgHQ}/_clientMiddlewareManifest.json +0 -0
- /package/out/_next/static/{qqgjMH_XFks-bLx9gn_yB → wFX9tOZWtEdER7XrtbgHQ}/_ssgManifest.js +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/).
|
|
7
7
|
|
|
8
|
+
## [0.1.6] — 2026-03-05
|
|
9
|
+
|
|
10
|
+
### Fixed (Critical)
|
|
11
|
+
- **Compiler uses migratedIR** — `compile()` now uses validator's auto-migrated IR instead of the stale original, preventing silent data corruption on older IR versions
|
|
12
|
+
- **`generateConcurrentNodes` flowState overwrite** — Removed `flowState[nodeId] = rN` overwrite that replaced correct values with `undefined` (task functions already populate flowState internally)
|
|
13
|
+
- **`handleCompile` path traversal** — Added separator suffix to `startsWith()` check, preventing directory-prefix attacks (e.g. `/home/user` → `/home/user2/`)
|
|
14
|
+
- **Undo/Redo snapshot deep clone** — `createSnapshot()` now uses `structuredClone(n.data)` instead of shallow spread, preventing nested mutation from corrupting all snapshots sharing a reference
|
|
15
|
+
|
|
16
|
+
### Tests
|
|
17
|
+
- Added path traversal regression test, IR migration integration test
|
|
18
|
+
- Test count: 407 tests / 33 test files
|
|
19
|
+
|
|
8
20
|
## [0.1.5] — 2026-03-05
|
|
9
21
|
|
|
10
22
|
### Security
|
package/dist/cli.js
CHANGED
|
@@ -1822,21 +1822,22 @@ function compile(ir, options) {
|
|
|
1822
1822
|
errors: validation.errors.map((e) => `[${e.code}] ${e.message}`)
|
|
1823
1823
|
};
|
|
1824
1824
|
}
|
|
1825
|
+
const workingIR = validation.migrated && validation.migratedIR ? validation.migratedIR : ir;
|
|
1825
1826
|
let plan;
|
|
1826
1827
|
try {
|
|
1827
|
-
plan = topologicalSort(
|
|
1828
|
+
plan = topologicalSort(workingIR);
|
|
1828
1829
|
} catch (err) {
|
|
1829
1830
|
return {
|
|
1830
1831
|
success: false,
|
|
1831
1832
|
errors: [err instanceof Error ? err.message : String(err)]
|
|
1832
1833
|
};
|
|
1833
1834
|
}
|
|
1834
|
-
const nodeMap = new Map(
|
|
1835
|
+
const nodeMap = new Map(workingIR.nodes.map((n) => [n.id, n]));
|
|
1835
1836
|
const platformName = options?.platform ?? "nextjs";
|
|
1836
1837
|
const platform = getPlatform(platformName);
|
|
1837
|
-
const symbolTable = buildSymbolTable(
|
|
1838
|
+
const symbolTable = buildSymbolTable(workingIR);
|
|
1838
1839
|
const context = {
|
|
1839
|
-
ir,
|
|
1840
|
+
ir: workingIR,
|
|
1840
1841
|
plan,
|
|
1841
1842
|
nodeMap,
|
|
1842
1843
|
envVars: /* @__PURE__ */ new Set(),
|
|
@@ -1853,8 +1854,8 @@ function compile(ir, options) {
|
|
|
1853
1854
|
generatedBlockNodeIds: /* @__PURE__ */ new Set(),
|
|
1854
1855
|
pluginRegistry
|
|
1855
1856
|
};
|
|
1856
|
-
const trigger =
|
|
1857
|
-
const preComputedBlockNodes = computeControlFlowDescendants(
|
|
1857
|
+
const trigger = workingIR.nodes.find((n) => n.category === "trigger" /* TRIGGER */);
|
|
1858
|
+
const preComputedBlockNodes = computeControlFlowDescendants(workingIR, trigger.id);
|
|
1858
1859
|
for (const nodeId of preComputedBlockNodes) {
|
|
1859
1860
|
context.childBlockNodeIds.add(nodeId);
|
|
1860
1861
|
context.symbolTableExclusions.add(nodeId);
|
|
@@ -1864,7 +1865,7 @@ function compile(ir, options) {
|
|
|
1864
1865
|
);
|
|
1865
1866
|
if (hasConcurrency) {
|
|
1866
1867
|
context.dagMode = true;
|
|
1867
|
-
for (const node of
|
|
1868
|
+
for (const node of workingIR.nodes) {
|
|
1868
1869
|
if (node.category !== "trigger" /* TRIGGER */) {
|
|
1869
1870
|
context.symbolTableExclusions.add(node.id);
|
|
1870
1871
|
}
|
|
@@ -1879,8 +1880,8 @@ function compile(ir, options) {
|
|
|
1879
1880
|
});
|
|
1880
1881
|
const code = sourceFile.getFullText();
|
|
1881
1882
|
const filePath = platform.getOutputFilePath(trigger);
|
|
1882
|
-
collectRequiredPackages(
|
|
1883
|
-
const sourceMap = buildSourceMap(code,
|
|
1883
|
+
collectRequiredPackages(workingIR, context);
|
|
1884
|
+
const sourceMap = buildSourceMap(code, workingIR, filePath);
|
|
1884
1885
|
const dependencies = {
|
|
1885
1886
|
all: [...context.requiredPackages].sort(),
|
|
1886
1887
|
missing: [...context.requiredPackages].sort(),
|
|
@@ -2129,11 +2130,8 @@ function generateConcurrentNodes(writer, nodeIds, context) {
|
|
|
2129
2130
|
writer.writeLine(";");
|
|
2130
2131
|
}
|
|
2131
2132
|
writer.writeLine(
|
|
2132
|
-
`
|
|
2133
|
+
`await Promise.all([${taskNames.map((t) => `${t}()`).join(", ")}]);`
|
|
2133
2134
|
);
|
|
2134
|
-
activeNodeIds.forEach((nodeId, i) => {
|
|
2135
|
-
writer.writeLine(`flowState['${nodeId}'] = r${i};`);
|
|
2136
|
-
});
|
|
2137
2135
|
activeNodeIds.forEach((nodeId) => {
|
|
2138
2136
|
const varName = context.symbolTable.getVarName(nodeId);
|
|
2139
2137
|
writer.writeLine(`const ${varName} = flowState['${nodeId}'];`);
|
|
@@ -3707,7 +3705,9 @@ function handleCompile(body, projectRoot) {
|
|
|
3707
3705
|
let writtenPath = null;
|
|
3708
3706
|
if (shouldWrite && result.filePath && result.code) {
|
|
3709
3707
|
const fullPath = resolve(join2(projectRoot, result.filePath));
|
|
3710
|
-
|
|
3708
|
+
const resolvedRoot = resolve(projectRoot);
|
|
3709
|
+
const sep = resolvedRoot.endsWith("/") || resolvedRoot.endsWith("\\") ? "" : process.platform === "win32" ? "\\" : "/";
|
|
3710
|
+
if (!fullPath.startsWith(resolvedRoot + sep)) {
|
|
3711
3711
|
return {
|
|
3712
3712
|
status: 400,
|
|
3713
3713
|
body: { success: false, error: "Output path escapes project root" }
|
package/dist/compiler.cjs
CHANGED
|
@@ -1831,21 +1831,22 @@ function compile(ir, options) {
|
|
|
1831
1831
|
errors: validation.errors.map((e) => `[${e.code}] ${e.message}`)
|
|
1832
1832
|
};
|
|
1833
1833
|
}
|
|
1834
|
+
const workingIR = validation.migrated && validation.migratedIR ? validation.migratedIR : ir;
|
|
1834
1835
|
let plan;
|
|
1835
1836
|
try {
|
|
1836
|
-
plan = topologicalSort(
|
|
1837
|
+
plan = topologicalSort(workingIR);
|
|
1837
1838
|
} catch (err) {
|
|
1838
1839
|
return {
|
|
1839
1840
|
success: false,
|
|
1840
1841
|
errors: [err instanceof Error ? err.message : String(err)]
|
|
1841
1842
|
};
|
|
1842
1843
|
}
|
|
1843
|
-
const nodeMap = new Map(
|
|
1844
|
+
const nodeMap = new Map(workingIR.nodes.map((n) => [n.id, n]));
|
|
1844
1845
|
const platformName = options?.platform ?? "nextjs";
|
|
1845
1846
|
const platform = getPlatform(platformName);
|
|
1846
|
-
const symbolTable = buildSymbolTable(
|
|
1847
|
+
const symbolTable = buildSymbolTable(workingIR);
|
|
1847
1848
|
const context = {
|
|
1848
|
-
ir,
|
|
1849
|
+
ir: workingIR,
|
|
1849
1850
|
plan,
|
|
1850
1851
|
nodeMap,
|
|
1851
1852
|
envVars: /* @__PURE__ */ new Set(),
|
|
@@ -1862,8 +1863,8 @@ function compile(ir, options) {
|
|
|
1862
1863
|
generatedBlockNodeIds: /* @__PURE__ */ new Set(),
|
|
1863
1864
|
pluginRegistry
|
|
1864
1865
|
};
|
|
1865
|
-
const trigger =
|
|
1866
|
-
const preComputedBlockNodes = computeControlFlowDescendants(
|
|
1866
|
+
const trigger = workingIR.nodes.find((n) => n.category === "trigger" /* TRIGGER */);
|
|
1867
|
+
const preComputedBlockNodes = computeControlFlowDescendants(workingIR, trigger.id);
|
|
1867
1868
|
for (const nodeId of preComputedBlockNodes) {
|
|
1868
1869
|
context.childBlockNodeIds.add(nodeId);
|
|
1869
1870
|
context.symbolTableExclusions.add(nodeId);
|
|
@@ -1873,7 +1874,7 @@ function compile(ir, options) {
|
|
|
1873
1874
|
);
|
|
1874
1875
|
if (hasConcurrency) {
|
|
1875
1876
|
context.dagMode = true;
|
|
1876
|
-
for (const node of
|
|
1877
|
+
for (const node of workingIR.nodes) {
|
|
1877
1878
|
if (node.category !== "trigger" /* TRIGGER */) {
|
|
1878
1879
|
context.symbolTableExclusions.add(node.id);
|
|
1879
1880
|
}
|
|
@@ -1888,8 +1889,8 @@ function compile(ir, options) {
|
|
|
1888
1889
|
});
|
|
1889
1890
|
const code = sourceFile.getFullText();
|
|
1890
1891
|
const filePath = platform.getOutputFilePath(trigger);
|
|
1891
|
-
collectRequiredPackages(
|
|
1892
|
-
const sourceMap = buildSourceMap(code,
|
|
1892
|
+
collectRequiredPackages(workingIR, context);
|
|
1893
|
+
const sourceMap = buildSourceMap(code, workingIR, filePath);
|
|
1893
1894
|
const dependencies = {
|
|
1894
1895
|
all: [...context.requiredPackages].sort(),
|
|
1895
1896
|
missing: [...context.requiredPackages].sort(),
|
|
@@ -2143,11 +2144,8 @@ function generateConcurrentNodes(writer, nodeIds, context) {
|
|
|
2143
2144
|
writer.writeLine(";");
|
|
2144
2145
|
}
|
|
2145
2146
|
writer.writeLine(
|
|
2146
|
-
`
|
|
2147
|
+
`await Promise.all([${taskNames.map((t) => `${t}()`).join(", ")}]);`
|
|
2147
2148
|
);
|
|
2148
|
-
activeNodeIds.forEach((nodeId, i) => {
|
|
2149
|
-
writer.writeLine(`flowState['${nodeId}'] = r${i};`);
|
|
2150
|
-
});
|
|
2151
2149
|
activeNodeIds.forEach((nodeId) => {
|
|
2152
2150
|
const varName = context.symbolTable.getVarName(nodeId);
|
|
2153
2151
|
writer.writeLine(`const ${varName} = flowState['${nodeId}'];`);
|
package/dist/compiler.js
CHANGED
|
@@ -1764,21 +1764,22 @@ function compile(ir, options) {
|
|
|
1764
1764
|
errors: validation.errors.map((e) => `[${e.code}] ${e.message}`)
|
|
1765
1765
|
};
|
|
1766
1766
|
}
|
|
1767
|
+
const workingIR = validation.migrated && validation.migratedIR ? validation.migratedIR : ir;
|
|
1767
1768
|
let plan;
|
|
1768
1769
|
try {
|
|
1769
|
-
plan = topologicalSort(
|
|
1770
|
+
plan = topologicalSort(workingIR);
|
|
1770
1771
|
} catch (err) {
|
|
1771
1772
|
return {
|
|
1772
1773
|
success: false,
|
|
1773
1774
|
errors: [err instanceof Error ? err.message : String(err)]
|
|
1774
1775
|
};
|
|
1775
1776
|
}
|
|
1776
|
-
const nodeMap = new Map(
|
|
1777
|
+
const nodeMap = new Map(workingIR.nodes.map((n) => [n.id, n]));
|
|
1777
1778
|
const platformName = options?.platform ?? "nextjs";
|
|
1778
1779
|
const platform = getPlatform(platformName);
|
|
1779
|
-
const symbolTable = buildSymbolTable(
|
|
1780
|
+
const symbolTable = buildSymbolTable(workingIR);
|
|
1780
1781
|
const context = {
|
|
1781
|
-
ir,
|
|
1782
|
+
ir: workingIR,
|
|
1782
1783
|
plan,
|
|
1783
1784
|
nodeMap,
|
|
1784
1785
|
envVars: /* @__PURE__ */ new Set(),
|
|
@@ -1795,8 +1796,8 @@ function compile(ir, options) {
|
|
|
1795
1796
|
generatedBlockNodeIds: /* @__PURE__ */ new Set(),
|
|
1796
1797
|
pluginRegistry
|
|
1797
1798
|
};
|
|
1798
|
-
const trigger =
|
|
1799
|
-
const preComputedBlockNodes = computeControlFlowDescendants(
|
|
1799
|
+
const trigger = workingIR.nodes.find((n) => n.category === "trigger" /* TRIGGER */);
|
|
1800
|
+
const preComputedBlockNodes = computeControlFlowDescendants(workingIR, trigger.id);
|
|
1800
1801
|
for (const nodeId of preComputedBlockNodes) {
|
|
1801
1802
|
context.childBlockNodeIds.add(nodeId);
|
|
1802
1803
|
context.symbolTableExclusions.add(nodeId);
|
|
@@ -1806,7 +1807,7 @@ function compile(ir, options) {
|
|
|
1806
1807
|
);
|
|
1807
1808
|
if (hasConcurrency) {
|
|
1808
1809
|
context.dagMode = true;
|
|
1809
|
-
for (const node of
|
|
1810
|
+
for (const node of workingIR.nodes) {
|
|
1810
1811
|
if (node.category !== "trigger" /* TRIGGER */) {
|
|
1811
1812
|
context.symbolTableExclusions.add(node.id);
|
|
1812
1813
|
}
|
|
@@ -1821,8 +1822,8 @@ function compile(ir, options) {
|
|
|
1821
1822
|
});
|
|
1822
1823
|
const code = sourceFile.getFullText();
|
|
1823
1824
|
const filePath = platform.getOutputFilePath(trigger);
|
|
1824
|
-
collectRequiredPackages(
|
|
1825
|
-
const sourceMap = buildSourceMap(code,
|
|
1825
|
+
collectRequiredPackages(workingIR, context);
|
|
1826
|
+
const sourceMap = buildSourceMap(code, workingIR, filePath);
|
|
1826
1827
|
const dependencies = {
|
|
1827
1828
|
all: [...context.requiredPackages].sort(),
|
|
1828
1829
|
missing: [...context.requiredPackages].sort(),
|
|
@@ -2076,11 +2077,8 @@ function generateConcurrentNodes(writer, nodeIds, context) {
|
|
|
2076
2077
|
writer.writeLine(";");
|
|
2077
2078
|
}
|
|
2078
2079
|
writer.writeLine(
|
|
2079
|
-
`
|
|
2080
|
+
`await Promise.all([${taskNames.map((t) => `${t}()`).join(", ")}]);`
|
|
2080
2081
|
);
|
|
2081
|
-
activeNodeIds.forEach((nodeId, i) => {
|
|
2082
|
-
writer.writeLine(`flowState['${nodeId}'] = r${i};`);
|
|
2083
|
-
});
|
|
2084
2082
|
activeNodeIds.forEach((nodeId) => {
|
|
2085
2083
|
const varName = context.symbolTable.getVarName(nodeId);
|
|
2086
2084
|
writer.writeLine(`const ${varName} = flowState['${nodeId}'];`);
|
package/dist/server.js
CHANGED
|
@@ -1717,21 +1717,22 @@ function compile(ir, options) {
|
|
|
1717
1717
|
errors: validation.errors.map((e) => `[${e.code}] ${e.message}`)
|
|
1718
1718
|
};
|
|
1719
1719
|
}
|
|
1720
|
+
const workingIR = validation.migrated && validation.migratedIR ? validation.migratedIR : ir;
|
|
1720
1721
|
let plan;
|
|
1721
1722
|
try {
|
|
1722
|
-
plan = topologicalSort(
|
|
1723
|
+
plan = topologicalSort(workingIR);
|
|
1723
1724
|
} catch (err) {
|
|
1724
1725
|
return {
|
|
1725
1726
|
success: false,
|
|
1726
1727
|
errors: [err instanceof Error ? err.message : String(err)]
|
|
1727
1728
|
};
|
|
1728
1729
|
}
|
|
1729
|
-
const nodeMap = new Map(
|
|
1730
|
+
const nodeMap = new Map(workingIR.nodes.map((n) => [n.id, n]));
|
|
1730
1731
|
const platformName = options?.platform ?? "nextjs";
|
|
1731
1732
|
const platform = getPlatform(platformName);
|
|
1732
|
-
const symbolTable = buildSymbolTable(
|
|
1733
|
+
const symbolTable = buildSymbolTable(workingIR);
|
|
1733
1734
|
const context = {
|
|
1734
|
-
ir,
|
|
1735
|
+
ir: workingIR,
|
|
1735
1736
|
plan,
|
|
1736
1737
|
nodeMap,
|
|
1737
1738
|
envVars: /* @__PURE__ */ new Set(),
|
|
@@ -1748,8 +1749,8 @@ function compile(ir, options) {
|
|
|
1748
1749
|
generatedBlockNodeIds: /* @__PURE__ */ new Set(),
|
|
1749
1750
|
pluginRegistry
|
|
1750
1751
|
};
|
|
1751
|
-
const trigger =
|
|
1752
|
-
const preComputedBlockNodes = computeControlFlowDescendants(
|
|
1752
|
+
const trigger = workingIR.nodes.find((n) => n.category === "trigger" /* TRIGGER */);
|
|
1753
|
+
const preComputedBlockNodes = computeControlFlowDescendants(workingIR, trigger.id);
|
|
1753
1754
|
for (const nodeId of preComputedBlockNodes) {
|
|
1754
1755
|
context.childBlockNodeIds.add(nodeId);
|
|
1755
1756
|
context.symbolTableExclusions.add(nodeId);
|
|
@@ -1759,7 +1760,7 @@ function compile(ir, options) {
|
|
|
1759
1760
|
);
|
|
1760
1761
|
if (hasConcurrency) {
|
|
1761
1762
|
context.dagMode = true;
|
|
1762
|
-
for (const node of
|
|
1763
|
+
for (const node of workingIR.nodes) {
|
|
1763
1764
|
if (node.category !== "trigger" /* TRIGGER */) {
|
|
1764
1765
|
context.symbolTableExclusions.add(node.id);
|
|
1765
1766
|
}
|
|
@@ -1774,8 +1775,8 @@ function compile(ir, options) {
|
|
|
1774
1775
|
});
|
|
1775
1776
|
const code = sourceFile.getFullText();
|
|
1776
1777
|
const filePath = platform.getOutputFilePath(trigger);
|
|
1777
|
-
collectRequiredPackages(
|
|
1778
|
-
const sourceMap = buildSourceMap(code,
|
|
1778
|
+
collectRequiredPackages(workingIR, context);
|
|
1779
|
+
const sourceMap = buildSourceMap(code, workingIR, filePath);
|
|
1779
1780
|
const dependencies = {
|
|
1780
1781
|
all: [...context.requiredPackages].sort(),
|
|
1781
1782
|
missing: [...context.requiredPackages].sort(),
|
|
@@ -2029,11 +2030,8 @@ function generateConcurrentNodes(writer, nodeIds, context) {
|
|
|
2029
2030
|
writer.writeLine(";");
|
|
2030
2031
|
}
|
|
2031
2032
|
writer.writeLine(
|
|
2032
|
-
`
|
|
2033
|
+
`await Promise.all([${taskNames.map((t) => `${t}()`).join(", ")}]);`
|
|
2033
2034
|
);
|
|
2034
|
-
activeNodeIds.forEach((nodeId, i) => {
|
|
2035
|
-
writer.writeLine(`flowState['${nodeId}'] = r${i};`);
|
|
2036
|
-
});
|
|
2037
2035
|
activeNodeIds.forEach((nodeId) => {
|
|
2038
2036
|
const varName = context.symbolTable.getVarName(nodeId);
|
|
2039
2037
|
writer.writeLine(`const ${varName} = flowState['${nodeId}'];`);
|
|
@@ -3485,7 +3483,9 @@ function handleCompile(body, projectRoot) {
|
|
|
3485
3483
|
let writtenPath = null;
|
|
3486
3484
|
if (shouldWrite && result.filePath && result.code) {
|
|
3487
3485
|
const fullPath = resolve(join(projectRoot, result.filePath));
|
|
3488
|
-
|
|
3486
|
+
const resolvedRoot = resolve(projectRoot);
|
|
3487
|
+
const sep = resolvedRoot.endsWith("/") || resolvedRoot.endsWith("\\") ? "" : process.platform === "win32" ? "\\" : "/";
|
|
3488
|
+
if (!fullPath.startsWith(resolvedRoot + sep)) {
|
|
3489
3489
|
return {
|
|
3490
3490
|
status: 400,
|
|
3491
3491
|
body: { success: false, error: "Output path escapes project root" }
|
package/out/404.html
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><!--
|
|
1
|
+
<!DOCTYPE html><!--wFX9tOZWtEdER7XrtbgHQ--><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/chunks/83ab8820627f8bfe.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/b6e8711267bccbbd.js"/><script src="/_next/static/chunks/fbca595129527827.js" async=""></script><script src="/_next/static/chunks/ab8888d4b78b94be.js" async=""></script><script src="/_next/static/chunks/turbopack-576234c945ffdc44.js" async=""></script><script src="/_next/static/chunks/acf223168ac429f7.js" async=""></script><script src="/_next/static/chunks/b163b5d7cccbcf42.js" async=""></script><script src="/_next/static/chunks/6b84376656bd9887.js" async=""></script><script src="/_next/static/chunks/b112c2f519e4b429.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><title>Flow2Code | Visual AST Compiler</title><meta name="description" content="Visual backend logic generator: compile canvas nodes directly into native TypeScript code"/><link rel="manifest" href="/site.webmanifest"/><link rel="icon" href="/favicon.ico" sizes="any"/><link rel="icon" href="/favicon-16x16.png" sizes="16x16" type="image/png"/><link rel="icon" href="/favicon-32x32.png" sizes="32x32" type="image/png"/><link rel="apple-touch-icon" href="/apple-touch-icon.png"/><script src="/_next/static/chunks/a6dad97d9634a72d.js" noModule=""></script></head><body class="antialiased overflow-hidden"><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/b6e8711267bccbbd.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[46798,[\"/_next/static/chunks/acf223168ac429f7.js\"],\"TooltipProvider\"]\n3:I[95731,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"default\"]\n4:I[58298,[\"/_next/static/chunks/acf223168ac429f7.js\",\"/_next/static/chunks/b112c2f519e4b429.js\"],\"default\"]\n5:I[32294,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"default\"]\n6:I[5806,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"OutletBoundary\"]\n7:\"$Sreact.suspense\"\n9:I[5806,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"ViewportBoundary\"]\nb:I[5806,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"MetadataBoundary\"]\nd:I[63491,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"default\"]\n:HL[\"/_next/static/chunks/83ab8820627f8bfe.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"wFX9tOZWtEdER7XrtbgHQ\",\"c\":[\"\",\"_not-found\"],\"q\":\"\",\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/chunks/83ab8820627f8bfe.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}],[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/acf223168ac429f7.js\",\"async\":true,\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"children\":[\"$\",\"body\",null,{\"className\":\"antialiased overflow-hidden\",\"children\":[\"$\",\"$L2\",null,{\"delayDuration\":200,\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$4\",\"errorStyles\":[],\"errorScripts\":[[\"$\",\"script\",\"script-0\",{\"src\":\"/_next/static/chunks/b112c2f519e4b429.js\",\"async\":true}]],\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],[]],\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L5\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:style\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:1:props:style\",\"children\":404}],[\"$\",\"div\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:style\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$0:f:0:1:0:props:children:1:props:children:props:children:props:children:props:notFound:0:1:props:children:props:children:2:props:children:props:style\",\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L6\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.MetadataOutlet\",\"children\":\"$@8\"}]}]]}],{},null,false,false]},null,false,false]},null,false,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[\"$\",\"$L9\",null,{\"children\":\"$La\"}],[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"$7\",null,{\"name\":\"Next.Metadata\",\"children\":\"$Lc\"}]}]}],null]}],false]],\"m\":\"$undefined\",\"G\":[\"$d\",[]],\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n"])</script><script>self.__next_f.push([1,"e:I[22192,[\"/_next/static/chunks/b163b5d7cccbcf42.js\",\"/_next/static/chunks/6b84376656bd9887.js\"],\"IconMark\"]\n8:null\nc:[[\"$\",\"title\",\"0\",{\"children\":\"Flow2Code | Visual AST Compiler\"}],[\"$\",\"meta\",\"1\",{\"name\":\"description\",\"content\":\"Visual backend logic generator: compile canvas nodes directly into native TypeScript code\"}],[\"$\",\"link\",\"2\",{\"rel\":\"manifest\",\"href\":\"/site.webmanifest\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"icon\",\"href\":\"/favicon.ico\",\"sizes\":\"any\"}],[\"$\",\"link\",\"4\",{\"rel\":\"icon\",\"href\":\"/favicon-16x16.png\",\"sizes\":\"16x16\",\"type\":\"image/png\"}],[\"$\",\"link\",\"5\",{\"rel\":\"icon\",\"href\":\"/favicon-32x32.png\",\"sizes\":\"32x32\",\"type\":\"image/png\"}],[\"$\",\"link\",\"6\",{\"rel\":\"apple-touch-icon\",\"href\":\"/apple-touch-icon.png\"}],[\"$\",\"$Le\",\"7\",{}]]\n"])</script></body></html>
|
package/out/__next.__PAGE__.txt
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
1:"$Sreact.fragment"
|
|
2
2
|
2:I[55026,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"ClientPageRoot"]
|
|
3
|
-
3:I[52683,["/_next/static/chunks/acf223168ac429f7.js","/_next/static/chunks/5f1a9fec0e69c483.js","/_next/static/chunks/
|
|
3
|
+
3:I[52683,["/_next/static/chunks/acf223168ac429f7.js","/_next/static/chunks/5f1a9fec0e69c483.js","/_next/static/chunks/bfa275b7488d8b70.js"],"default"]
|
|
4
4
|
6:I[5806,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"OutletBoundary"]
|
|
5
5
|
7:"$Sreact.suspense"
|
|
6
6
|
:HL["/_next/static/chunks/8a5bd6fe3abc8091.css","style"]
|
|
7
|
-
0:{"buildId":"
|
|
7
|
+
0:{"buildId":"wFX9tOZWtEdER7XrtbgHQ","rsc":["$","$1","c",{"children":[["$","$L2",null,{"Component":"$3","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@4","$@5"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/8a5bd6fe3abc8091.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/5f1a9fec0e69c483.js","async":true}],["$","script","script-1",{"src":"/_next/static/chunks/bfa275b7488d8b70.js","async":true}]],["$","$L6",null,{"children":["$","$7",null,{"name":"Next.MetadataOutlet","children":"$@8"}]}]]}],"loading":null,"isPartial":false}
|
|
8
8
|
4:{}
|
|
9
9
|
5:"$0:rsc:props:children:0:props:serverProvidedParams:params"
|
|
10
10
|
8:null
|
package/out/__next._full.txt
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
4:I[58298,["/_next/static/chunks/acf223168ac429f7.js","/_next/static/chunks/b112c2f519e4b429.js"],"default"]
|
|
5
5
|
5:I[32294,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"default"]
|
|
6
6
|
6:I[55026,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"ClientPageRoot"]
|
|
7
|
-
7:I[52683,["/_next/static/chunks/acf223168ac429f7.js","/_next/static/chunks/5f1a9fec0e69c483.js","/_next/static/chunks/
|
|
7
|
+
7:I[52683,["/_next/static/chunks/acf223168ac429f7.js","/_next/static/chunks/5f1a9fec0e69c483.js","/_next/static/chunks/bfa275b7488d8b70.js"],"default"]
|
|
8
8
|
a:I[5806,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"OutletBoundary"]
|
|
9
9
|
b:"$Sreact.suspense"
|
|
10
10
|
d:I[5806,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"ViewportBoundary"]
|
|
@@ -12,7 +12,7 @@ f:I[5806,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b843
|
|
|
12
12
|
11:I[63491,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"default"]
|
|
13
13
|
:HL["/_next/static/chunks/83ab8820627f8bfe.css","style"]
|
|
14
14
|
:HL["/_next/static/chunks/8a5bd6fe3abc8091.css","style"]
|
|
15
|
-
0:{"P":null,"b":"
|
|
15
|
+
0:{"P":null,"b":"wFX9tOZWtEdER7XrtbgHQ","c":["",""],"q":"","i":false,"f":[[["",{"children":["__PAGE__",{}]},"$undefined","$undefined",true],[["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/83ab8820627f8bfe.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/acf223168ac429f7.js","async":true,"nonce":"$undefined"}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased overflow-hidden","children":["$","$L2",null,{"delayDuration":200,"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$4","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"/_next/static/chunks/b112c2f519e4b429.js","async":true}]],"template":["$","$L5",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]],"forbidden":"$undefined","unauthorized":"$undefined"}]}]}]}]]}],{"children":[["$","$1","c",{"children":[["$","$L6",null,{"Component":"$7","serverProvidedParams":{"searchParams":{},"params":{},"promises":["$@8","$@9"]}}],[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/8a5bd6fe3abc8091.css","precedence":"next","crossOrigin":"$undefined","nonce":"$undefined"}],["$","script","script-0",{"src":"/_next/static/chunks/5f1a9fec0e69c483.js","async":true,"nonce":"$undefined"}],["$","script","script-1",{"src":"/_next/static/chunks/bfa275b7488d8b70.js","async":true,"nonce":"$undefined"}]],["$","$La",null,{"children":["$","$b",null,{"name":"Next.MetadataOutlet","children":"$@c"}]}]]}],{},null,false,false]},null,false,false],["$","$1","h",{"children":[null,["$","$Ld",null,{"children":"$Le"}],["$","div",null,{"hidden":true,"children":["$","$Lf",null,{"children":["$","$b",null,{"name":"Next.Metadata","children":"$L10"}]}]}],null]}],false]],"m":"$undefined","G":["$11",[]],"S":true}
|
|
16
16
|
8:{}
|
|
17
17
|
9:"$0:f:0:1:1:children:0:props:children:0:props:serverProvidedParams:params"
|
|
18
18
|
e:[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]
|
package/out/__next._head.txt
CHANGED
|
@@ -3,4 +3,4 @@
|
|
|
3
3
|
3:I[5806,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"MetadataBoundary"]
|
|
4
4
|
4:"$Sreact.suspense"
|
|
5
5
|
5:I[22192,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"IconMark"]
|
|
6
|
-
0:{"buildId":"
|
|
6
|
+
0:{"buildId":"wFX9tOZWtEdER7XrtbgHQ","rsc":["$","$1","h",{"children":[null,["$","$L2",null,{"children":[["$","meta","0",{"charSet":"utf-8"}],["$","meta","1",{"name":"viewport","content":"width=device-width, initial-scale=1"}]]}],["$","div",null,{"hidden":true,"children":["$","$L3",null,{"children":["$","$4",null,{"name":"Next.Metadata","children":[["$","title","0",{"children":"Flow2Code | Visual AST Compiler"}],["$","meta","1",{"name":"description","content":"Visual backend logic generator: compile canvas nodes directly into native TypeScript code"}],["$","link","2",{"rel":"manifest","href":"/site.webmanifest"}],["$","link","3",{"rel":"icon","href":"/favicon.ico","sizes":"any"}],["$","link","4",{"rel":"icon","href":"/favicon-16x16.png","sizes":"16x16","type":"image/png"}],["$","link","5",{"rel":"icon","href":"/favicon-32x32.png","sizes":"32x32","type":"image/png"}],["$","link","6",{"rel":"apple-touch-icon","href":"/apple-touch-icon.png"}],["$","$L5","7",{}]]}]}]}],null]}],"loading":null,"isPartial":false}
|
package/out/__next._index.txt
CHANGED
|
@@ -4,4 +4,4 @@
|
|
|
4
4
|
4:I[58298,["/_next/static/chunks/acf223168ac429f7.js","/_next/static/chunks/b112c2f519e4b429.js"],"default"]
|
|
5
5
|
5:I[32294,["/_next/static/chunks/b163b5d7cccbcf42.js","/_next/static/chunks/6b84376656bd9887.js"],"default"]
|
|
6
6
|
:HL["/_next/static/chunks/83ab8820627f8bfe.css","style"]
|
|
7
|
-
0:{"buildId":"
|
|
7
|
+
0:{"buildId":"wFX9tOZWtEdER7XrtbgHQ","rsc":["$","$1","c",{"children":[[["$","link","0",{"rel":"stylesheet","href":"/_next/static/chunks/83ab8820627f8bfe.css","precedence":"next"}],["$","script","script-0",{"src":"/_next/static/chunks/acf223168ac429f7.js","async":true}]],["$","html",null,{"lang":"en","children":["$","body",null,{"className":"antialiased overflow-hidden","children":["$","$L2",null,{"delayDuration":200,"children":["$","$L3",null,{"parallelRouterKey":"children","error":"$4","errorStyles":[],"errorScripts":[["$","script","script-0",{"src":"/_next/static/chunks/b112c2f519e4b429.js","async":true}]],"template":["$","$L5",null,{}],"notFound":[[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":404}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],[]]}]}]}]}]]}],"loading":null,"isPartial":false}
|
package/out/__next._tree.txt
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
:HL["/_next/static/chunks/83ab8820627f8bfe.css","style"]
|
|
2
2
|
:HL["/_next/static/chunks/8a5bd6fe3abc8091.css","style"]
|
|
3
|
-
0:{"buildId":"
|
|
3
|
+
0:{"buildId":"wFX9tOZWtEdER7XrtbgHQ","tree":{"name":"","paramType":null,"paramKey":"","hasRuntimePrefetch":false,"slots":{"children":{"name":"__PAGE__","paramType":null,"paramKey":"__PAGE__","hasRuntimePrefetch":false,"slots":null,"isRootLayout":false}},"isRootLayout":true},"staleTime":300}
|