@vedangiitb/qwintly-core 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/dist/ai/prompts/codegen.prompt.d.ts +9 -0
  2. package/dist/ai/prompts/codegen.prompt.d.ts.map +1 -0
  3. package/dist/ai/prompts/codegen.prompt.js +53 -0
  4. package/dist/ai/prompts/codegen.prompt.js.map +1 -0
  5. package/dist/ai/prompts/examples/codegen.examples.d.ts +2 -0
  6. package/dist/ai/prompts/examples/codegen.examples.d.ts.map +1 -0
  7. package/dist/ai/prompts/examples/codegen.examples.js +81 -0
  8. package/dist/ai/prompts/examples/codegen.examples.js.map +1 -0
  9. package/dist/ai/prompts/examples/planner.examples.d.ts +2 -0
  10. package/dist/ai/prompts/examples/planner.examples.d.ts.map +1 -0
  11. package/dist/ai/prompts/examples/planner.examples.js +3 -0
  12. package/dist/ai/prompts/examples/planner.examples.js.map +1 -0
  13. package/dist/ai/prompts/helpers/promptParts.helper.d.ts +8 -0
  14. package/dist/ai/prompts/helpers/promptParts.helper.d.ts.map +1 -0
  15. package/dist/ai/prompts/helpers/promptParts.helper.js +37 -0
  16. package/dist/ai/prompts/helpers/promptParts.helper.js.map +1 -0
  17. package/dist/ai/prompts/planner.prompt.d.ts +10 -0
  18. package/dist/ai/prompts/planner.prompt.d.ts.map +1 -0
  19. package/dist/ai/prompts/planner.prompt.js +49 -0
  20. package/dist/ai/prompts/planner.prompt.js.map +1 -0
  21. package/dist/ai/prompts/prompts.d.ts +4 -0
  22. package/dist/ai/prompts/prompts.d.ts.map +1 -0
  23. package/dist/ai/prompts/prompts.js +4 -0
  24. package/dist/ai/prompts/prompts.js.map +1 -0
  25. package/dist/ai/prompts/validator.prompt.d.ts +15 -0
  26. package/dist/ai/prompts/validator.prompt.d.ts.map +1 -0
  27. package/dist/ai/prompts/validator.prompt.js +55 -0
  28. package/dist/ai/prompts/validator.prompt.js.map +1 -0
  29. package/dist/ai/tools/helpers/elementid.helpers.d.ts +4 -0
  30. package/dist/ai/tools/helpers/elementid.helpers.d.ts.map +1 -0
  31. package/dist/ai/tools/helpers/elementid.helpers.js +19 -0
  32. package/dist/ai/tools/helpers/elementid.helpers.js.map +1 -0
  33. package/dist/ai/tools/helpers/getImage.helper.d.ts +2 -0
  34. package/dist/ai/tools/helpers/getImage.helper.d.ts.map +1 -0
  35. package/dist/ai/tools/helpers/getImage.helper.js +2 -0
  36. package/dist/ai/tools/helpers/getImage.helper.js.map +1 -0
  37. package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts +15 -0
  38. package/dist/ai/tools/helpers/pageConfigJson.helpers.d.ts.map +1 -0
  39. package/dist/ai/tools/helpers/pageConfigJson.helpers.js +172 -0
  40. package/dist/ai/tools/helpers/pageConfigJson.helpers.js.map +1 -0
  41. package/dist/ai/tools/implementations/createNewRoute.impl.d.ts +5 -0
  42. package/dist/ai/tools/implementations/createNewRoute.impl.d.ts.map +1 -0
  43. package/dist/ai/tools/implementations/createNewRoute.impl.js +101 -0
  44. package/dist/ai/tools/implementations/createNewRoute.impl.js.map +1 -0
  45. package/dist/ai/tools/implementations/deleteElement.impl.d.ts +18 -0
  46. package/dist/ai/tools/implementations/deleteElement.impl.d.ts.map +1 -0
  47. package/dist/ai/tools/implementations/deleteElement.impl.js +60 -0
  48. package/dist/ai/tools/implementations/deleteElement.impl.js.map +1 -0
  49. package/dist/ai/tools/implementations/factories.d.ts +72 -0
  50. package/dist/ai/tools/implementations/factories.d.ts.map +1 -1
  51. package/dist/ai/tools/implementations/factories.js +20 -0
  52. package/dist/ai/tools/implementations/factories.js.map +1 -1
  53. package/dist/ai/tools/implementations/insertElement.impl.d.ts +14 -0
  54. package/dist/ai/tools/implementations/insertElement.impl.d.ts.map +1 -0
  55. package/dist/ai/tools/implementations/insertElement.impl.js +73 -0
  56. package/dist/ai/tools/implementations/insertElement.impl.js.map +1 -0
  57. package/dist/ai/tools/implementations/updateClassName.impl.d.ts +13 -0
  58. package/dist/ai/tools/implementations/updateClassName.impl.d.ts.map +1 -0
  59. package/dist/ai/tools/implementations/updateClassName.impl.js +61 -0
  60. package/dist/ai/tools/implementations/updateClassName.impl.js.map +1 -0
  61. package/dist/ai/tools/implementations/updateProps.impl.d.ts +33 -0
  62. package/dist/ai/tools/implementations/updateProps.impl.d.ts.map +1 -0
  63. package/dist/ai/tools/implementations/updateProps.impl.js +90 -0
  64. package/dist/ai/tools/implementations/updateProps.impl.js.map +1 -0
  65. package/dist/ai/tools/schemas/createNewRoute.schema.d.ts +20 -0
  66. package/dist/ai/tools/schemas/createNewRoute.schema.d.ts.map +1 -0
  67. package/dist/ai/tools/schemas/createNewRoute.schema.js +20 -0
  68. package/dist/ai/tools/schemas/createNewRoute.schema.js.map +1 -0
  69. package/dist/ai/tools/schemas/deleteElement.schema.d.ts +20 -0
  70. package/dist/ai/tools/schemas/deleteElement.schema.d.ts.map +1 -0
  71. package/dist/ai/tools/schemas/deleteElement.schema.js +20 -0
  72. package/dist/ai/tools/schemas/deleteElement.schema.js.map +1 -0
  73. package/dist/ai/tools/schemas/insertElement.schema.d.ts +23 -0
  74. package/dist/ai/tools/schemas/insertElement.schema.d.ts.map +1 -0
  75. package/dist/ai/tools/schemas/insertElement.schema.js +133 -0
  76. package/dist/ai/tools/schemas/insertElement.schema.js.map +1 -0
  77. package/dist/ai/tools/schemas/updateClassName.schema.d.ts +23 -0
  78. package/dist/ai/tools/schemas/updateClassName.schema.d.ts.map +1 -0
  79. package/dist/ai/tools/schemas/updateClassName.schema.js +21 -0
  80. package/dist/ai/tools/schemas/updateClassName.schema.js.map +1 -0
  81. package/dist/ai/tools/schemas/updateProps.schema.d.ts +91 -0
  82. package/dist/ai/tools/schemas/updateProps.schema.d.ts.map +1 -0
  83. package/dist/ai/tools/schemas/updateProps.schema.js +87 -0
  84. package/dist/ai/tools/schemas/updateProps.schema.js.map +1 -0
  85. package/dist/ai/tools/toolsets/codegenTools.d.ts.map +1 -1
  86. package/dist/ai/tools/toolsets/codegenTools.js +12 -4
  87. package/dist/ai/tools/toolsets/codegenTools.js.map +1 -1
  88. package/dist/core.d.ts +5 -1
  89. package/dist/core.d.ts.map +1 -1
  90. package/dist/core.js +9 -2
  91. package/dist/core.js.map +1 -1
  92. package/dist/image/unsplash.service.d.ts +22 -0
  93. package/dist/image/unsplash.service.d.ts.map +1 -0
  94. package/dist/image/unsplash.service.js +120 -0
  95. package/dist/image/unsplash.service.js.map +1 -0
  96. package/dist/indexer/codegenIndex.d.ts.map +1 -1
  97. package/dist/indexer/codegenIndex.js +2 -5
  98. package/dist/indexer/codegenIndex.js.map +1 -1
  99. package/dist/indexer/data/configs.constants.d.ts +32 -56
  100. package/dist/indexer/data/configs.constants.d.ts.map +1 -1
  101. package/dist/indexer/data/configs.constants.js +61 -88
  102. package/dist/indexer/data/configs.constants.js.map +1 -1
  103. package/dist/indexer/plannerIndex.d.ts.map +1 -1
  104. package/dist/indexer/plannerIndex.js +2 -7
  105. package/dist/indexer/plannerIndex.js.map +1 -1
  106. package/dist/indexer/validatorIndex.d.ts.map +1 -1
  107. package/dist/indexer/validatorIndex.js +1 -0
  108. package/dist/indexer/validatorIndex.js.map +1 -1
  109. package/dist/logging/genStatus.service.d.ts +2 -2
  110. package/dist/logging/genStatus.service.d.ts.map +1 -1
  111. package/dist/logging/genStatus.service.js +2 -2
  112. package/dist/logging/genStatus.service.js.map +1 -1
  113. package/dist/repository/genStatus.repository.d.ts +1 -1
  114. package/dist/repository/genStatus.repository.d.ts.map +1 -1
  115. package/dist/repository/genStatus.repository.js +2 -1
  116. package/dist/repository/genStatus.repository.js.map +1 -1
  117. package/dist/tests/createNewRoute.impl.test.d.ts +2 -0
  118. package/dist/tests/createNewRoute.impl.test.d.ts.map +1 -0
  119. package/dist/tests/createNewRoute.impl.test.js +72 -0
  120. package/dist/tests/createNewRoute.impl.test.js.map +1 -0
  121. package/dist/tests/deleteElement.impl.test.d.ts +2 -0
  122. package/dist/tests/deleteElement.impl.test.d.ts.map +1 -0
  123. package/dist/tests/deleteElement.impl.test.js +88 -0
  124. package/dist/tests/deleteElement.impl.test.js.map +1 -0
  125. package/dist/tests/insertUpdate.impl.test.d.ts +2 -0
  126. package/dist/tests/insertUpdate.impl.test.d.ts.map +1 -0
  127. package/dist/tests/insertUpdate.impl.test.js +68 -0
  128. package/dist/tests/insertUpdate.impl.test.js.map +1 -0
  129. package/dist/types/elements.d.ts +43 -0
  130. package/dist/types/elements.d.ts.map +1 -0
  131. package/dist/types/elements.js +13 -0
  132. package/dist/types/elements.js.map +1 -0
  133. package/dist/types/image.d.ts +19 -0
  134. package/dist/types/image.d.ts.map +1 -0
  135. package/dist/types/image.js +3 -0
  136. package/dist/types/image.js.map +1 -0
  137. package/dist/types/index/configs.types.d.ts +2 -3
  138. package/dist/types/index/configs.types.d.ts.map +1 -1
  139. package/dist/types/index/configs.types.js.map +1 -1
  140. package/dist/types/index/index.types.d.ts +4 -6
  141. package/dist/types/index/index.types.d.ts.map +1 -1
  142. package/dist/types/index/index.types.js.map +1 -1
  143. package/package.json +2 -1
@@ -0,0 +1,88 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import fs from "node:fs/promises";
6
+ import { createDeleteElementImpl } from "../ai/tools/implementations/deleteElement.impl.js";
7
+ const makeRealFs = (overrides) => {
8
+ return {
9
+ readFile: async (absolutePath) => fs.readFile(absolutePath, "utf-8"),
10
+ writeFile: async (absolutePath, content) => fs.writeFile(absolutePath, content ?? "", "utf-8"),
11
+ mkdirp: async (absoluteDir) => {
12
+ await fs.mkdir(absoluteDir, { recursive: true });
13
+ },
14
+ rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),
15
+ stat: async (absolutePath) => fs.stat(absolutePath),
16
+ safeReadDir: async (absoluteDir) => fs.readdir(absoluteDir, { withFileTypes: true }),
17
+ ...(overrides ?? {}),
18
+ };
19
+ };
20
+ test("delete_element: removes nested element by id from page.config.ts", async () => {
21
+ const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "qwintly-core-"));
22
+ try {
23
+ const routeDir = path.join(workspaceRoot, "app", "a");
24
+ await fs.mkdir(routeDir, { recursive: true });
25
+ const filePath = path.join(routeDir, "pageConfig.json");
26
+ await fs.writeFile(filePath, JSON.stringify({
27
+ elements: [
28
+ {
29
+ id: "root",
30
+ type: "div",
31
+ children: [
32
+ { id: "keep", type: "text", props: { text: "hi" } },
33
+ {
34
+ id: "del_me",
35
+ type: "div",
36
+ children: [
37
+ { id: "child", type: "text", props: { text: "x" } },
38
+ ],
39
+ },
40
+ ],
41
+ },
42
+ ],
43
+ }, null, 2) + "\n", "utf-8");
44
+ const impl = createDeleteElementImpl({ workspaceRoot, fs: makeRealFs() });
45
+ const res = await impl("/a", "del_me");
46
+ assert.equal(res.success, true, `unexpected response: ${JSON.stringify(res)}`);
47
+ assert.equal(res.changed, true, `unexpected response: ${JSON.stringify(res)}`);
48
+ const after = await fs.readFile(filePath, "utf-8");
49
+ assert.ok(!after.includes('"del_me"'));
50
+ assert.ok(after.includes('"keep"'));
51
+ }
52
+ finally {
53
+ await fs.rm(workspaceRoot, { recursive: true, force: true });
54
+ }
55
+ });
56
+ test("delete_element: unchanged when id not present", async () => {
57
+ const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "qwintly-core-"));
58
+ try {
59
+ const routeDir = path.join(workspaceRoot, "app");
60
+ await fs.mkdir(routeDir, { recursive: true });
61
+ const filePath = path.join(routeDir, "pageConfig.json");
62
+ await fs.writeFile(filePath, JSON.stringify({ elements: [{ id: "root", type: "div" }] }, null, 2) + "\n", "utf-8");
63
+ const impl = createDeleteElementImpl({ workspaceRoot, fs: makeRealFs() });
64
+ const res = await impl("/", "missing");
65
+ assert.deepEqual(res, { success: true, changed: false });
66
+ const after = await fs.readFile(filePath, "utf-8");
67
+ assert.ok(after.includes('"root"'));
68
+ }
69
+ finally {
70
+ await fs.rm(workspaceRoot, { recursive: true, force: true });
71
+ }
72
+ });
73
+ test("delete_element: parse failure returns success=false", async () => {
74
+ const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "qwintly-core-"));
75
+ try {
76
+ const routeDir = path.join(workspaceRoot, "app", "a");
77
+ await fs.mkdir(routeDir, { recursive: true });
78
+ const filePath = path.join(routeDir, "pageConfig.json");
79
+ await fs.writeFile(filePath, "{ bad json }");
80
+ const impl = createDeleteElementImpl({ workspaceRoot, fs: makeRealFs() });
81
+ const res = await impl("/a", "x");
82
+ assert.equal(res.success, false);
83
+ }
84
+ finally {
85
+ await fs.rm(workspaceRoot, { recursive: true, force: true });
86
+ }
87
+ });
88
+ //# sourceMappingURL=deleteElement.impl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteElement.impl.test.js","sourceRoot":"","sources":["../../src/tests/deleteElement.impl.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport fs from \"node:fs/promises\";\nimport { createDeleteElementImpl } from \"../ai/tools/implementations/deleteElement.impl.js\";\n\ntype CoreFs = Parameters<typeof createDeleteElementImpl>[0][\"fs\"];\n\nconst makeRealFs = (overrides?: Partial<CoreFs>): CoreFs => {\n return {\n readFile: async (absolutePath) => fs.readFile(absolutePath, \"utf-8\"),\n writeFile: async (absolutePath, content) =>\n fs.writeFile(absolutePath, content ?? \"\", \"utf-8\"),\n mkdirp: async (absoluteDir) => {\n await fs.mkdir(absoluteDir, { recursive: true });\n },\n rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),\n stat: async (absolutePath) => fs.stat(absolutePath),\n safeReadDir: async (absoluteDir) =>\n fs.readdir(absoluteDir, { withFileTypes: true }),\n ...(overrides ?? {}),\n };\n};\n\ntest(\"delete_element: removes nested element by id from page.config.ts\", async () => {\n const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"qwintly-core-\"));\n try {\n const routeDir = path.join(workspaceRoot, \"app\", \"a\");\n await fs.mkdir(routeDir, { recursive: true });\n const filePath = path.join(routeDir, \"pageConfig.json\");\n await fs.writeFile(\n filePath,\n JSON.stringify(\n {\n elements: [\n {\n id: \"root\",\n type: \"div\",\n children: [\n { id: \"keep\", type: \"text\", props: { text: \"hi\" } },\n {\n id: \"del_me\",\n type: \"div\",\n children: [\n { id: \"child\", type: \"text\", props: { text: \"x\" } },\n ],\n },\n ],\n },\n ],\n },\n null,\n 2,\n ) + \"\\n\",\n \"utf-8\",\n );\n\n const impl = createDeleteElementImpl({ workspaceRoot, fs: makeRealFs() } as any);\n const res = await impl(\"/a\", \"del_me\");\n assert.equal(\n (res as any).success,\n true,\n `unexpected response: ${JSON.stringify(res)}`,\n );\n assert.equal((res as any).changed, true, `unexpected response: ${JSON.stringify(res)}`);\n\n const after = await fs.readFile(filePath, \"utf-8\");\n assert.ok(!after.includes('\"del_me\"'));\n assert.ok(after.includes('\"keep\"'));\n } finally {\n await fs.rm(workspaceRoot, { recursive: true, force: true });\n }\n});\n\ntest(\"delete_element: unchanged when id not present\", async () => {\n const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"qwintly-core-\"));\n try {\n const routeDir = path.join(workspaceRoot, \"app\");\n await fs.mkdir(routeDir, { recursive: true });\n const filePath = path.join(routeDir, \"pageConfig.json\");\n await fs.writeFile(\n filePath,\n JSON.stringify({ elements: [{ id: \"root\", type: \"div\" }] }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n const impl = createDeleteElementImpl({ workspaceRoot, fs: makeRealFs() } as any);\n const res = await impl(\"/\", \"missing\");\n assert.deepEqual(res, { success: true, changed: false });\n\n const after = await fs.readFile(filePath, \"utf-8\");\n assert.ok(after.includes('\"root\"'));\n } finally {\n await fs.rm(workspaceRoot, { recursive: true, force: true });\n }\n});\n\ntest(\"delete_element: parse failure returns success=false\", async () => {\n const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"qwintly-core-\"));\n try {\n const routeDir = path.join(workspaceRoot, \"app\", \"a\");\n await fs.mkdir(routeDir, { recursive: true });\n const filePath = path.join(routeDir, \"pageConfig.json\");\n await fs.writeFile(filePath, \"{ bad json }\");\n\n const impl = createDeleteElementImpl({ workspaceRoot, fs: makeRealFs() } as any);\n const res = await impl(\"/a\", \"x\");\n assert.equal((res as any).success, false);\n } finally {\n await fs.rm(workspaceRoot, { recursive: true, force: true });\n }\n});\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=insertUpdate.impl.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertUpdate.impl.test.d.ts","sourceRoot":"","sources":["../../src/tests/insertUpdate.impl.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,68 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+ import path from "node:path";
4
+ import os from "node:os";
5
+ import fs from "node:fs/promises";
6
+ import { createInsertElementImpl } from "../ai/tools/implementations/insertElement.impl.js";
7
+ import { createUpdatePropsImpl } from "../ai/tools/implementations/updateProps.impl.js";
8
+ import { createUpdateClassNameImpl } from "../ai/tools/implementations/updateClassName.impl.js";
9
+ const makeRealFs = (overrides) => {
10
+ return {
11
+ readFile: async (absolutePath) => fs.readFile(absolutePath, "utf-8"),
12
+ writeFile: async (absolutePath, content) => fs.writeFile(absolutePath, content ?? "", "utf-8"),
13
+ mkdirp: async (absoluteDir) => {
14
+ await fs.mkdir(absoluteDir, { recursive: true });
15
+ },
16
+ rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),
17
+ stat: async (absolutePath) => fs.stat(absolutePath),
18
+ safeReadDir: async (absoluteDir) => fs.readdir(absoluteDir, { withFileTypes: true }),
19
+ ...(overrides ?? {}),
20
+ };
21
+ };
22
+ test("insert/update tools: inject ids, insert under parent, update props and classname", async () => {
23
+ const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), "qwintly-core-"));
24
+ try {
25
+ const routeDir = path.join(workspaceRoot, "app", "a");
26
+ await fs.mkdir(routeDir, { recursive: true });
27
+ const filePath = path.join(routeDir, "pageConfig.json");
28
+ await fs.writeFile(filePath, JSON.stringify({
29
+ elements: [
30
+ {
31
+ id: "root",
32
+ type: "div",
33
+ children: [{ id: "existing", type: "text", props: { text: "x" } }],
34
+ },
35
+ ],
36
+ }, null, 2) + "\n", "utf-8");
37
+ const deps = { workspaceRoot, fs: makeRealFs() };
38
+ const insert = createInsertElementImpl(deps);
39
+ const updateProps = createUpdatePropsImpl(deps);
40
+ const updateClassName = createUpdateClassNameImpl(deps);
41
+ const inserted = await insert("/a", "root", {
42
+ type: "text",
43
+ props: { text: "hello" },
44
+ });
45
+ assert.equal(inserted.success, true, `unexpected response: ${JSON.stringify(inserted)}`);
46
+ const insertedId = inserted.inserted_id;
47
+ assert.ok(typeof insertedId === "string" && insertedId.startsWith("el_"));
48
+ const up1 = await updateProps({
49
+ route: "/a",
50
+ element_id: insertedId,
51
+ text: "updated",
52
+ href: "/x",
53
+ });
54
+ assert.equal(up1.success, true);
55
+ const up2 = await updateClassName("/a", insertedId, "text-red-500");
56
+ assert.equal(up2.success, true);
57
+ const after = JSON.parse(await fs.readFile(filePath, "utf-8"));
58
+ const found = after.elements[0].children.find((e) => e.id === insertedId);
59
+ assert.ok(found);
60
+ assert.equal(found.props.text, "updated");
61
+ assert.equal(found.props.href, "/x");
62
+ assert.equal(found.className, "text-red-500");
63
+ }
64
+ finally {
65
+ await fs.rm(workspaceRoot, { recursive: true, force: true });
66
+ }
67
+ });
68
+ //# sourceMappingURL=insertUpdate.impl.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insertUpdate.impl.test.js","sourceRoot":"","sources":["../../src/tests/insertUpdate.impl.test.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from \"node:assert/strict\";\nimport test from \"node:test\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport fs from \"node:fs/promises\";\nimport { createInsertElementImpl } from \"../ai/tools/implementations/insertElement.impl.js\";\nimport { createUpdatePropsImpl } from \"../ai/tools/implementations/updateProps.impl.js\";\nimport { createUpdateClassNameImpl } from \"../ai/tools/implementations/updateClassName.impl.js\";\n\ntype Deps = Parameters<typeof createInsertElementImpl>[0];\ntype CoreFs = Deps[\"fs\"];\n\nconst makeRealFs = (overrides?: Partial<CoreFs>): CoreFs => {\n return {\n readFile: async (absolutePath) => fs.readFile(absolutePath, \"utf-8\"),\n writeFile: async (absolutePath, content) =>\n fs.writeFile(absolutePath, content ?? \"\", \"utf-8\"),\n mkdirp: async (absoluteDir) => {\n await fs.mkdir(absoluteDir, { recursive: true });\n },\n rmFile: async (absolutePath) => fs.rm(absolutePath, { force: true }),\n stat: async (absolutePath) => fs.stat(absolutePath),\n safeReadDir: async (absoluteDir) =>\n fs.readdir(absoluteDir, { withFileTypes: true }),\n ...(overrides ?? {}),\n };\n};\n\ntest(\"insert/update tools: inject ids, insert under parent, update props and classname\", async () => {\n const workspaceRoot = await fs.mkdtemp(path.join(os.tmpdir(), \"qwintly-core-\"));\n try {\n const routeDir = path.join(workspaceRoot, \"app\", \"a\");\n await fs.mkdir(routeDir, { recursive: true });\n const filePath = path.join(routeDir, \"pageConfig.json\");\n await fs.writeFile(\n filePath,\n JSON.stringify(\n {\n elements: [\n {\n id: \"root\",\n type: \"div\",\n children: [{ id: \"existing\", type: \"text\", props: { text: \"x\" } }],\n },\n ],\n },\n null,\n 2,\n ) + \"\\n\",\n \"utf-8\",\n );\n\n const deps = { workspaceRoot, fs: makeRealFs() } as any;\n const insert = createInsertElementImpl(deps);\n const updateProps = createUpdatePropsImpl(deps);\n const updateClassName = createUpdateClassNameImpl(deps);\n\n const inserted = await insert(\"/a\", \"root\", {\n type: \"text\",\n props: { text: \"hello\" },\n } as any);\n assert.equal(\n (inserted as any).success,\n true,\n `unexpected response: ${JSON.stringify(inserted)}`,\n );\n const insertedId = (inserted as any).inserted_id as string;\n assert.ok(typeof insertedId === \"string\" && insertedId.startsWith(\"el_\"));\n\n const up1 = await updateProps({\n route: \"/a\",\n element_id: insertedId,\n text: \"updated\",\n href: \"/x\",\n } as any);\n assert.equal((up1 as any).success, true);\n\n const up2 = await updateClassName(\"/a\", insertedId, \"text-red-500\");\n assert.equal((up2 as any).success, true);\n\n const after = JSON.parse(await fs.readFile(filePath, \"utf-8\"));\n const found = (after.elements[0].children as any[]).find((e) => e.id === insertedId);\n assert.ok(found);\n assert.equal(found.props.text, \"updated\");\n assert.equal(found.props.href, \"/x\");\n assert.equal(found.className, \"text-red-500\");\n } finally {\n await fs.rm(workspaceRoot, { recursive: true, force: true });\n }\n});\n"]}
@@ -0,0 +1,43 @@
1
+ export declare const ELEMENT_TYPES: readonly ["fragment", "div", "text", "image", "button", "input", "textarea", "link", "icon"];
2
+ export type ElementType = (typeof ELEMENT_TYPES)[number];
3
+ export type OnClickAction = {
4
+ kind: "route";
5
+ href: string;
6
+ replace?: boolean;
7
+ } | {
8
+ kind: "back";
9
+ } | {
10
+ kind: "reload";
11
+ } | {
12
+ kind: "external";
13
+ href: string;
14
+ newTab?: boolean;
15
+ };
16
+ export type BuilderElement = {
17
+ id: string;
18
+ type: ElementType;
19
+ props?: {
20
+ onClick?: OnClickAction;
21
+ text?: string;
22
+ src?: string;
23
+ href?: string;
24
+ placeholder?: string;
25
+ alt?: string;
26
+ target?: string;
27
+ rel?: string;
28
+ value?: string;
29
+ type?: string;
30
+ name?: string;
31
+ size?: number;
32
+ color?: string;
33
+ strokeWidth?: number;
34
+ };
35
+ children?: BuilderElement[];
36
+ visible?: boolean;
37
+ meta?: {
38
+ name?: string;
39
+ locked?: boolean;
40
+ };
41
+ className?: string;
42
+ };
43
+ //# sourceMappingURL=elements.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.d.ts","sourceRoot":"","sources":["../../src/types/elements.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,8FAUhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD,MAAM,MAAM,aAAa,GACrB;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEzD,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAElB,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,EAAE,aAAa,CAAC;QAExB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QAGd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAEF,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAE5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,IAAI,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;IAEF,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC"}
@@ -0,0 +1,13 @@
1
+ // types/elements.ts
2
+ export const ELEMENT_TYPES = [
3
+ "fragment",
4
+ "div",
5
+ "text",
6
+ "image",
7
+ "button",
8
+ "input",
9
+ "textarea",
10
+ "link",
11
+ "icon",
12
+ ];
13
+ //# sourceMappingURL=elements.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elements.js","sourceRoot":"","sources":["../../src/types/elements.ts"],"names":[],"mappings":"AAAA,oBAAoB;AAEpB,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,UAAU;IACV,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,OAAO;IACP,UAAU;IACV,MAAM;IACN,MAAM;CACE,CAAC","sourcesContent":["// types/elements.ts\n\nexport const ELEMENT_TYPES = [\n \"fragment\",\n \"div\",\n \"text\",\n \"image\",\n \"button\",\n \"input\",\n \"textarea\",\n \"link\",\n \"icon\",\n] as const;\n\nexport type ElementType = (typeof ELEMENT_TYPES)[number];\n\nexport type OnClickAction =\n | { kind: \"route\"; href: string; replace?: boolean }\n | { kind: \"back\" }\n | { kind: \"reload\" }\n | { kind: \"external\"; href: string; newTab?: boolean };\n\nexport type BuilderElement = {\n id: string;\n type: ElementType;\n\n props?: {\n onClick?: OnClickAction;\n\n text?: string;\n src?: string;\n href?: string;\n placeholder?: string;\n alt?: string;\n target?: string;\n rel?: string;\n value?: string;\n type?: string; // input type\n\n // icon\n name?: string;\n size?: number;\n color?: string;\n strokeWidth?: number;\n };\n\n children?: BuilderElement[];\n\n visible?: boolean;\n\n meta?: {\n name?: string;\n locked?: boolean;\n };\n\n className?: string; // Tailwind only\n};"]}
@@ -0,0 +1,19 @@
1
+ export type AspectRatio = "16:9" | "1:1" | "4:3";
2
+ export interface ImageIntent {
3
+ alt: string;
4
+ query: string;
5
+ aspectRatio?: AspectRatio;
6
+ visualStyle?: string;
7
+ }
8
+ export interface ResolvedImage {
9
+ id: string;
10
+ alt: string;
11
+ imageUrl: string;
12
+ thumbUrl: string;
13
+ photographer: string;
14
+ photographerUrl: string;
15
+ unsplashUrl: string;
16
+ width: number;
17
+ height: number;
18
+ }
19
+ //# sourceMappingURL=image.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/types/image.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ // types/image.ts
2
+ export {};
3
+ //# sourceMappingURL=image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/types/image.ts"],"names":[],"mappings":"AAAA,iBAAiB","sourcesContent":["// types/image.ts\r\n\r\nexport type AspectRatio = \"16:9\" | \"1:1\" | \"4:3\";\r\n\r\nexport interface ImageIntent {\r\n alt: string;\r\n query: string;\r\n aspectRatio?: AspectRatio;\r\n visualStyle?: string;\r\n}\r\n\r\nexport interface ResolvedImage {\r\n id: string;\r\n alt: string;\r\n imageUrl: string;\r\n thumbUrl: string;\r\n photographer: string;\r\n photographerUrl: string;\r\n unsplashUrl: string;\r\n width: number;\r\n height: number;\r\n}"]}
@@ -2,18 +2,17 @@ export interface ProjectConfigsConfig {
2
2
  frameworkConfig: ProjectConfigsFrameworkConfig;
3
3
  runtimeConfig: ProjectConfigsRuntimeConfig;
4
4
  toolingConfig: ProjectConfigsToolingConfig;
5
+ renderingConfig: any;
5
6
  }
6
7
  export interface ProjectConfigsFrameworkConfig {
7
8
  name: string;
8
9
  router: string;
9
10
  language: string;
11
+ icons: string;
10
12
  styling: string;
11
- ui: string;
12
- stateManagement: string;
13
13
  }
14
14
  export interface ProjectConfigsRuntimeConfig {
15
15
  target: string;
16
- rendering: string;
17
16
  serverActions: string;
18
17
  apiRoutes: string;
19
18
  dataFetching: string;
@@ -1 +1 @@
1
- {"version":3,"file":"configs.types.d.ts","sourceRoot":"","sources":["../../../src/types/index/configs.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,6BAA6B,CAAC;IAC/C,aAAa,EAAE,2BAA2B,CAAC;IAC3C,aAAa,EAAE,2BAA2B,CAAC;CAC5C;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"configs.types.d.ts","sourceRoot":"","sources":["../../../src/types/index/configs.types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,6BAA6B,CAAC;IAC/C,aAAa,EAAE,2BAA2B,CAAC;IAC3C,aAAa,EAAE,2BAA2B,CAAC;IAC3C,eAAe,EAAE,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -1 +1 @@
1
- {"version":3,"file":"configs.types.js","sourceRoot":"","sources":["../../../src/types/index/configs.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ProjectConfigsConfig {\n frameworkConfig: ProjectConfigsFrameworkConfig;\n runtimeConfig: ProjectConfigsRuntimeConfig;\n toolingConfig: ProjectConfigsToolingConfig;\n}\n\nexport interface ProjectConfigsFrameworkConfig {\n name: string;\n router: string;\n language: string;\n styling: string;\n ui: string;\n stateManagement: string;\n}\n\nexport interface ProjectConfigsRuntimeConfig {\n target: string;\n rendering: string;\n serverActions: string;\n apiRoutes: string;\n dataFetching: string;\n}\n\nexport interface ProjectConfigsToolingConfig {\n packageManager: string;\n linting: string;\n formatting: string;\n typecheck: string;\n testing: string;\n}\n"]}
1
+ {"version":3,"file":"configs.types.js","sourceRoot":"","sources":["../../../src/types/index/configs.types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ProjectConfigsConfig {\n frameworkConfig: ProjectConfigsFrameworkConfig;\n runtimeConfig: ProjectConfigsRuntimeConfig;\n toolingConfig: ProjectConfigsToolingConfig;\n renderingConfig: any;\n}\n\nexport interface ProjectConfigsFrameworkConfig {\n name: string;\n router: string;\n language: string;\n icons: string;\n styling: string;\n}\n\nexport interface ProjectConfigsRuntimeConfig {\n target: string;\n serverActions: string;\n apiRoutes: string;\n dataFetching: string;\n}\n\nexport interface ProjectConfigsToolingConfig {\n packageManager: string;\n linting: string;\n formatting: string;\n typecheck: string;\n testing: string;\n}\n"]}
@@ -1,16 +1,14 @@
1
- import { projectConfigs, projectConventions } from "../../indexer/data/configs.constants.js";
1
+ import { projectConfigs } from "../../indexer/data/configs.constants.js";
2
2
  export type CodegenIndex = {
3
3
  folderTree: string;
4
- projectConfigs: Pick<typeof projectConfigs, "frameworkConfig" | "runtimeConfig">;
5
- projectConventions: Pick<typeof projectConventions, "importsConventions" | "uiArchitecture">;
4
+ projectConfigs: Pick<typeof projectConfigs, "frameworkConfig" | "runtimeConfig" | "renderingConfig">;
6
5
  };
7
6
  export type PlannerIndex = {
8
7
  folderTree: string;
9
- projectConfigs: Pick<typeof projectConfigs, "frameworkConfig" | "runtimeConfig" | "toolingConfig">;
10
- projectConventions: Pick<typeof projectConventions, "folderConventions" | "importsConventions" | "routingConventions" | "namingConventions">;
8
+ projectConfigs: Pick<typeof projectConfigs, "frameworkConfig" | "runtimeConfig" | "toolingConfig" | "renderingConfig">;
11
9
  };
12
10
  export type ValidatorIndex = {
13
11
  folderTree: string;
14
- projectConfigs: Pick<typeof projectConfigs, "frameworkConfig" | "runtimeConfig" | "toolingConfig">;
12
+ projectConfigs: Pick<typeof projectConfigs, "frameworkConfig" | "runtimeConfig" | "toolingConfig" | "renderingConfig">;
15
13
  };
16
14
  //# sourceMappingURL=index.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../../src/types/index/index.types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,kBAAkB,EACnB,MAAM,yCAAyC,CAAC;AAEjD,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAClB,OAAO,cAAc,EACrB,iBAAiB,GAAG,eAAe,CACpC,CAAC;IACF,kBAAkB,EAAE,IAAI,CACtB,OAAO,kBAAkB,EACzB,oBAAoB,GAAG,gBAAgB,CACxC,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAClB,OAAO,cAAc,EACrB,iBAAiB,GAAG,eAAe,GAAG,eAAe,CACtD,CAAC;IACF,kBAAkB,EAAE,IAAI,CACtB,OAAO,kBAAkB,EACvB,mBAAmB,GACnB,oBAAoB,GACpB,oBAAoB,GACpB,mBAAmB,CACtB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAClB,OAAO,cAAc,EACrB,iBAAiB,GAAG,eAAe,GAAG,eAAe,CACtD,CAAC;CACH,CAAC"}
1
+ {"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../../src/types/index/index.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAClB,OAAO,cAAc,EACrB,iBAAiB,GAAG,eAAe,GAAG,iBAAiB,CACxD,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAClB,OAAO,cAAc,EACrB,iBAAiB,GAAG,eAAe,GAAG,eAAe,GAAG,iBAAiB,CAC1E,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,IAAI,CAClB,OAAO,cAAc,EACrB,iBAAiB,GAAG,eAAe,GAAG,eAAe,GAAG,iBAAiB,CAC1E,CAAC;CACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.types.js","sourceRoot":"","sources":["../../../src/types/index/index.types.ts"],"names":[],"mappings":"","sourcesContent":["import {\r\n projectConfigs,\r\n projectConventions,\r\n} from \"../../indexer/data/configs.constants.js\";\r\n\r\nexport type CodegenIndex = {\r\n folderTree: string;\r\n projectConfigs: Pick<\r\n typeof projectConfigs,\r\n \"frameworkConfig\" | \"runtimeConfig\"\r\n >;\r\n projectConventions: Pick<\r\n typeof projectConventions,\r\n \"importsConventions\" | \"uiArchitecture\"\r\n >;\r\n};\r\n\r\nexport type PlannerIndex = {\r\n folderTree: string;\r\n projectConfigs: Pick<\r\n typeof projectConfigs,\r\n \"frameworkConfig\" | \"runtimeConfig\" | \"toolingConfig\"\r\n >;\r\n projectConventions: Pick<\r\n typeof projectConventions,\r\n | \"folderConventions\"\r\n | \"importsConventions\"\r\n | \"routingConventions\"\r\n | \"namingConventions\"\r\n >;\r\n};\r\n\r\nexport type ValidatorIndex = {\r\n folderTree: string;\r\n projectConfigs: Pick<\r\n typeof projectConfigs,\r\n \"frameworkConfig\" | \"runtimeConfig\" | \"toolingConfig\"\r\n >;\r\n};\r\n"]}
1
+ {"version":3,"file":"index.types.js","sourceRoot":"","sources":["../../../src/types/index/index.types.ts"],"names":[],"mappings":"","sourcesContent":["import { projectConfigs } from \"../../indexer/data/configs.constants.js\";\r\n\r\nexport type CodegenIndex = {\r\n folderTree: string;\r\n projectConfigs: Pick<\r\n typeof projectConfigs,\r\n \"frameworkConfig\" | \"runtimeConfig\" | \"renderingConfig\"\r\n >;\r\n};\r\n\r\nexport type PlannerIndex = {\r\n folderTree: string;\r\n projectConfigs: Pick<\r\n typeof projectConfigs,\r\n \"frameworkConfig\" | \"runtimeConfig\" | \"toolingConfig\" | \"renderingConfig\"\r\n >;\r\n};\r\n\r\nexport type ValidatorIndex = {\r\n folderTree: string;\r\n projectConfigs: Pick<\r\n typeof projectConfigs,\r\n \"frameworkConfig\" | \"runtimeConfig\" | \"toolingConfig\" | \"renderingConfig\"\r\n >;\r\n};\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vedangiitb/qwintly-core",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "Qwintly Core",
5
5
  "homepage": "https://github.com/vedangiitb/qwintly-core#readme",
6
6
  "bugs": {
@@ -41,6 +41,7 @@
41
41
  "dependencies": {
42
42
  "@supabase/supabase-js": "^2.105.1",
43
43
  "@upstash/redis": "^1.37.0",
44
+ "nanoid": "^5.1.11",
44
45
  "zod": "^4.3.6",
45
46
  "zod-to-json-schema": "^3.25.2"
46
47
  },