@stackweld/registry 0.2.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 (115) hide show
  1. package/.turbo/turbo-build.log +4 -0
  2. package/.turbo/turbo-lint.log +436 -0
  3. package/.turbo/turbo-test.log +15 -0
  4. package/.turbo/turbo-typecheck.log +4 -0
  5. package/dist/__tests__/loader.test.d.ts +2 -0
  6. package/dist/__tests__/loader.test.d.ts.map +1 -0
  7. package/dist/__tests__/loader.test.js +126 -0
  8. package/dist/__tests__/loader.test.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +4 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/learning-resources.d.ts +16 -0
  14. package/dist/learning-resources.d.ts.map +1 -0
  15. package/dist/learning-resources.js +461 -0
  16. package/dist/learning-resources.js.map +1 -0
  17. package/dist/loader.d.ts +18 -0
  18. package/dist/loader.d.ts.map +1 -0
  19. package/dist/loader.js +56 -0
  20. package/dist/loader.js.map +1 -0
  21. package/dist/schema.d.ts +147 -0
  22. package/dist/schema.d.ts.map +1 -0
  23. package/dist/schema.js +79 -0
  24. package/dist/schema.js.map +1 -0
  25. package/package.json +39 -0
  26. package/src/__tests__/loader.test.ts +162 -0
  27. package/src/index.ts +4 -0
  28. package/src/learning-resources.ts +488 -0
  29. package/src/loader.ts +67 -0
  30. package/src/schema.ts +79 -0
  31. package/src/technologies/auth/clerk.yaml +29 -0
  32. package/src/technologies/auth/lucia.yaml +19 -0
  33. package/src/technologies/auth/nextauth.yaml +31 -0
  34. package/src/technologies/auth/supabase-auth.yaml +32 -0
  35. package/src/technologies/backend/django.yaml +17 -0
  36. package/src/technologies/backend/echo.yaml +17 -0
  37. package/src/technologies/backend/express.yaml +17 -0
  38. package/src/technologies/backend/fastapi.yaml +17 -0
  39. package/src/technologies/backend/fastify.yaml +17 -0
  40. package/src/technologies/backend/flask.yaml +17 -0
  41. package/src/technologies/backend/gin.yaml +17 -0
  42. package/src/technologies/backend/hono.yaml +17 -0
  43. package/src/technologies/backend/laravel.yaml +32 -0
  44. package/src/technologies/backend/nestjs.yaml +30 -0
  45. package/src/technologies/backend/spring-boot.yaml +30 -0
  46. package/src/technologies/backend/trpc.yaml +20 -0
  47. package/src/technologies/databases/kafka.yaml +27 -0
  48. package/src/technologies/databases/mariadb.yaml +30 -0
  49. package/src/technologies/databases/mongodb.yaml +25 -0
  50. package/src/technologies/databases/mysql.yaml +25 -0
  51. package/src/technologies/databases/neon.yaml +18 -0
  52. package/src/technologies/databases/pocketbase.yaml +24 -0
  53. package/src/technologies/databases/postgresql.yaml +26 -0
  54. package/src/technologies/databases/redis.yaml +23 -0
  55. package/src/technologies/databases/sqlite.yaml +19 -0
  56. package/src/technologies/databases/supabase.yaml +27 -0
  57. package/src/technologies/databases/turso.yaml +19 -0
  58. package/src/technologies/devops/biome.yaml +19 -0
  59. package/src/technologies/devops/cypress.yaml +20 -0
  60. package/src/technologies/devops/devcontainers.yaml +18 -0
  61. package/src/technologies/devops/docker.yaml +19 -0
  62. package/src/technologies/devops/eslint.yaml +18 -0
  63. package/src/technologies/devops/github-actions.yaml +18 -0
  64. package/src/technologies/devops/jest.yaml +19 -0
  65. package/src/technologies/devops/playwright.yaml +19 -0
  66. package/src/technologies/devops/pnpm.yaml +22 -0
  67. package/src/technologies/devops/prettier.yaml +19 -0
  68. package/src/technologies/devops/storybook.yaml +28 -0
  69. package/src/technologies/devops/turborepo.yaml +20 -0
  70. package/src/technologies/devops/typescript.yaml +20 -0
  71. package/src/technologies/devops/vitest.yaml +20 -0
  72. package/src/technologies/devops/zod.yaml +18 -0
  73. package/src/technologies/frontend/angular.yaml +19 -0
  74. package/src/technologies/frontend/astro.yaml +19 -0
  75. package/src/technologies/frontend/htmx.yaml +18 -0
  76. package/src/technologies/frontend/nextjs.yaml +22 -0
  77. package/src/technologies/frontend/nuxt.yaml +18 -0
  78. package/src/technologies/frontend/qwik.yaml +28 -0
  79. package/src/technologies/frontend/react.yaml +19 -0
  80. package/src/technologies/frontend/remix.yaml +28 -0
  81. package/src/technologies/frontend/solidjs.yaml +29 -0
  82. package/src/technologies/frontend/svelte.yaml +19 -0
  83. package/src/technologies/frontend/sveltekit.yaml +18 -0
  84. package/src/technologies/frontend/vue.yaml +18 -0
  85. package/src/technologies/orms/django-orm.yaml +21 -0
  86. package/src/technologies/orms/drizzle.yaml +23 -0
  87. package/src/technologies/orms/mongoose.yaml +22 -0
  88. package/src/technologies/orms/prisma.yaml +23 -0
  89. package/src/technologies/orms/sqlalchemy.yaml +21 -0
  90. package/src/technologies/orms/typeorm.yaml +21 -0
  91. package/src/technologies/runtimes/bun.yaml +24 -0
  92. package/src/technologies/runtimes/deno.yaml +30 -0
  93. package/src/technologies/runtimes/go.yaml +27 -0
  94. package/src/technologies/runtimes/nodejs.yaml +31 -0
  95. package/src/technologies/runtimes/php.yaml +30 -0
  96. package/src/technologies/runtimes/python.yaml +30 -0
  97. package/src/technologies/runtimes/rust.yaml +23 -0
  98. package/src/technologies/services/adminer.yaml +24 -0
  99. package/src/technologies/services/grafana.yaml +29 -0
  100. package/src/technologies/services/mailpit.yaml +27 -0
  101. package/src/technologies/services/minio.yaml +28 -0
  102. package/src/technologies/services/nginx.yaml +25 -0
  103. package/src/technologies/services/pgadmin.yaml +26 -0
  104. package/src/technologies/services/portainer.yaml +24 -0
  105. package/src/technologies/services/prometheus.yaml +27 -0
  106. package/src/technologies/services/rabbitmq.yaml +28 -0
  107. package/src/technologies/services/traefik.yaml +28 -0
  108. package/src/technologies/styling/chakra-ui.yaml +21 -0
  109. package/src/technologies/styling/css-modules.yaml +17 -0
  110. package/src/technologies/styling/daisyui.yaml +20 -0
  111. package/src/technologies/styling/material-ui.yaml +22 -0
  112. package/src/technologies/styling/shadcn-ui.yaml +20 -0
  113. package/src/technologies/styling/tailwindcss.yaml +20 -0
  114. package/tsconfig.json +11 -0
  115. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,4 @@
1
+
2
+ > @stackweld/registry@0.2.0 build /home/orlando/Desktop/XPlus-Finance/PROYECTOS_NUEVOS/Stackweld/stackweld/packages/registry
3
+ > tsc -b
4
+
@@ -0,0 +1,436 @@
1
+
2
+ > @stackpilot/registry@0.1.0 lint /home/orlando/Desktop/XPlus-Finance/PROYECTOS_NUEVOS/StackPilot/stackpilot/packages/registry
3
+ > biome check src/
4
+
5
+ src/loader.ts:5:21 lint/style/useNodejsImportProtocol FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
6
+
7
+ i A Node.js builtin module should be imported with the node: protocol.
8
+
9
+ 3 │ */
10
+ 4 │
11
+ > 5 │ import * as fs from "fs";
12
+ │ ^^^^
13
+ 6 │ import * as path from "path";
14
+ 7 │ import { parse as parseYaml } from "yaml";
15
+
16
+ i Using the node: protocol is more explicit and signals that the imported module belongs to Node.js.
17
+
18
+ i Unsafe fix: Add the node: protocol.
19
+
20
+ 3 3 │ */
21
+ 4 4 │
22
+ 5 │ - import·*·as·fs·from·"fs";
23
+ 5 │ + import·*·as·fs·from·"node:fs";
24
+ 6 6 │ import * as path from "path";
25
+ 7 7 │ import { parse as parseYaml } from "yaml";
26
+
27
+
28
+ src/loader.ts:6:23 lint/style/useNodejsImportProtocol FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
29
+
30
+ i A Node.js builtin module should be imported with the node: protocol.
31
+
32
+ 5 │ import * as fs from "fs";
33
+ > 6 │ import * as path from "path";
34
+ │ ^^^^^^
35
+ 7 │ import { parse as parseYaml } from "yaml";
36
+ 8 │ import Ajv from "ajv";
37
+
38
+ i Using the node: protocol is more explicit and signals that the imported module belongs to Node.js.
39
+
40
+ i Unsafe fix: Add the node: protocol.
41
+
42
+ 4 4 │
43
+ 5 5 │ import * as fs from "fs";
44
+ 6 │ - import·*·as·path·from·"path";
45
+ 6 │ + import·*·as·path·from·"node:path";
46
+ 7 7 │ import { parse as parseYaml } from "yaml";
47
+ 8 8 │ import Ajv from "ajv";
48
+
49
+
50
+ src/__tests__/loader.test.ts:28:12 lint/style/noNonNullAssertion FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━
51
+
52
+ ! Forbidden non-null assertion.
53
+
54
+ 26 │ const tech = loadTechnology("nextjs");
55
+ 27 │ expect(tech).not.toBeNull();
56
+ > 28 │ expect(tech!.name).toBe("Next.js");
57
+ │ ^^^^^
58
+ 29 │ expect(tech!.category).toBe("frontend");
59
+ 30 │ expect(tech!.requires).toContain("nodejs");
60
+
61
+ i Unsafe fix: Replace with optional chain operator ?. This operator includes runtime checks, so it is safer than the compile-only non-null assertion operator
62
+
63
+ 26 26 │ const tech = loadTechnology("nextjs");
64
+ 27 27 │ expect(tech).not.toBeNull();
65
+ 28 │ - ····expect(tech!.name).toBe("Next.js");
66
+ 28 │ + ····expect(tech?.name).toBe("Next.js");
67
+ 29 29 │ expect(tech!.category).toBe("frontend");
68
+ 30 30 │ expect(tech!.requires).toContain("nodejs");
69
+
70
+
71
+ src/__tests__/loader.test.ts:29:12 lint/style/noNonNullAssertion FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━
72
+
73
+ ! Forbidden non-null assertion.
74
+
75
+ 27 │ expect(tech).not.toBeNull();
76
+ 28 │ expect(tech!.name).toBe("Next.js");
77
+ > 29 │ expect(tech!.category).toBe("frontend");
78
+ │ ^^^^^
79
+ 30 │ expect(tech!.requires).toContain("nodejs");
80
+ 31 │ });
81
+
82
+ i Unsafe fix: Replace with optional chain operator ?. This operator includes runtime checks, so it is safer than the compile-only non-null assertion operator
83
+
84
+ 27 27 │ expect(tech).not.toBeNull();
85
+ 28 28 │ expect(tech!.name).toBe("Next.js");
86
+ 29 │ - ····expect(tech!.category).toBe("frontend");
87
+ 29 │ + ····expect(tech?.category).toBe("frontend");
88
+ 30 30 │ expect(tech!.requires).toContain("nodejs");
89
+ 31 31 │ });
90
+
91
+
92
+ src/__tests__/loader.test.ts:30:12 lint/style/noNonNullAssertion FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━
93
+
94
+ ! Forbidden non-null assertion.
95
+
96
+ 28 │ expect(tech!.name).toBe("Next.js");
97
+ 29 │ expect(tech!.category).toBe("frontend");
98
+ > 30 │ expect(tech!.requires).toContain("nodejs");
99
+ │ ^^^^^
100
+ 31 │ });
101
+ 32 │
102
+
103
+ i Unsafe fix: Replace with optional chain operator ?. This operator includes runtime checks, so it is safer than the compile-only non-null assertion operator
104
+
105
+ 28 28 │ expect(tech!.name).toBe("Next.js");
106
+ 29 29 │ expect(tech!.category).toBe("frontend");
107
+ 30 │ - ····expect(tech!.requires).toContain("nodejs");
108
+ 30 │ + ····expect(tech?.requires).toContain("nodejs");
109
+ 31 31 │ });
110
+ 32 32 │
111
+
112
+
113
+ src/__tests__/loader.test.ts:1:1 assist/source/organizeImports FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━
114
+
115
+ × The imports and exports are not sorted.
116
+
117
+ > 1 │ import { describe, it, expect } from "vitest";
118
+ │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
119
+ 2 │ import { loadAllTechnologies, loadTechnology, listTechnologyIds } from "../loader.js";
120
+ 3 │
121
+
122
+ i Safe fix: Organize Imports (Biome)
123
+
124
+ 1 │ - import·{·describe,·it,·expect·}·from·"vitest";
125
+ 2 │ - import·{·loadAllTechnologies,·loadTechnology,·listTechnologyIds·}·from·"../loader.js";
126
+ 1 │ + import·{·describe,·expect,·it·}·from·"vitest";
127
+ 2 │ + import·{·listTechnologyIds,·loadAllTechnologies,·loadTechnology·}·from·"../loader.js";
128
+ 3 3 │
129
+ 4 4 │ describe("Registry Loader", () => {
130
+
131
+
132
+ src/__tests__/loader.test.ts format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
133
+
134
+ × Formatter would have printed the following content:
135
+
136
+ 140 140 │
137
+ 141 141 │ for (const tech of techs) {
138
+ 142 │ - ······expect(
139
+ 143 │ - ········tech.versions.length,
140
+ 144 │ - ········`${tech.id}·has·no·versions·defined`,
141
+ 145 │ - ······).toBeGreaterThan(0);
142
+ 142 │ + ······expect(tech.versions.length,·`${tech.id}·has·no·versions·defined`).toBeGreaterThan(0);
143
+ 146 143 │ }
144
+ 147 144 │ });
145
+ ······· │
146
+ 161 158 │ }
147
+ 162 159 │
148
+ 163 │ - ····expect(
149
+ 164 │ - ······asymmetric,
150
+ 165 │ - ······`Asymmetric·incompatibilities·found:·${asymmetric.join(",·")}`,
151
+ 166 │ - ····).toEqual([]);
152
+ 160 │ + ····expect(asymmetric,·`Asymmetric·incompatibilities·found:·${asymmetric.join(",·")}`).toEqual([]);
153
+ 167 161 │ });
154
+ 168 162 │ });
155
+
156
+
157
+ src/index.ts:1:1 assist/source/organizeImports FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
158
+
159
+ × The imports and exports are not sorted.
160
+
161
+ > 1 │ export { loadAllTechnologies, loadTechnology, listTechnologyIds } from "./loader.js";
162
+ │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
163
+ 2 │ export { technologySchema } from "./schema.js";
164
+ 3 │ export { getLearningResources, LEARNING_RESOURCES } from "./learning-resources.js";
165
+
166
+ i Safe fix: Organize Imports (Biome)
167
+
168
+ 1 │ - export·{·loadAllTechnologies,·loadTechnology,·listTechnologyIds·}·from·"./loader.js";
169
+ 2 │ - export·{·technologySchema·}·from·"./schema.js";
170
+ 3 │ - export·{·getLearningResources,·LEARNING_RESOURCES·}·from·"./learning-resources.js";
171
+ 4 │ - export·type·{·LearningResource·}·from·"./learning-resources.js";
172
+ 1 │ + export·type·{·LearningResource·}·from·"./learning-resources.js";
173
+ 2 │ + export·{·getLearningResources,·LEARNING_RESOURCES·}·from·"./learning-resources.js";
174
+ 3 │ + export·{·listTechnologyIds,·loadAllTechnologies,·loadTechnology·}·from·"./loader.js";
175
+ 4 │ + export·{·technologySchema·}·from·"./schema.js";
176
+ 5 5 │
177
+
178
+
179
+ src/learning-resources.ts format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
180
+
181
+ × Formatter would have printed the following content:
182
+
183
+ 12 12 │ export const LEARNING_RESOURCES: Record<string, LearningResource[]> = {
184
+ 13 13 │ nextjs: [
185
+ 14 │ - ····{·title:·"Official·Documentation",·url:·"https://nextjs.org/docs",·type:·"docs",·difficulty:·"beginner"·},
186
+ 15 │ - ····{·title:·"Learn·Next.js",·url:·"https://nextjs.org/learn",·type:·"tutorial",·difficulty:·"beginner"·},
187
+ 16 │ - ····{·title:·"App·Router·Deep·Dive",·url:·"https://nextjs.org/docs/app",·type:·"docs",·difficulty:·"intermediate"·},
188
+ 17 │ - ····{·title:·"Data·Fetching·Patterns",·url:·"https://nextjs.org/docs/app/building-your-application/data-fetching",·type:·"docs",·difficulty:·"advanced"·},
189
+ 14 │ + ····{
190
+ 15 │ + ······title:·"Official·Documentation",
191
+ 16 │ + ······url:·"https://nextjs.org/docs",
192
+ 17 │ + ······type:·"docs",
193
+ 18 │ + ······difficulty:·"beginner",
194
+ 19 │ + ····},
195
+ 20 │ + ····{
196
+ 21 │ + ······title:·"Learn·Next.js",
197
+ 22 │ + ······url:·"https://nextjs.org/learn",
198
+ 23 │ + ······type:·"tutorial",
199
+ 24 │ + ······difficulty:·"beginner",
200
+ 25 │ + ····},
201
+ 26 │ + ····{
202
+ 27 │ + ······title:·"App·Router·Deep·Dive",
203
+ 28 │ + ······url:·"https://nextjs.org/docs/app",
204
+ 29 │ + ······type:·"docs",
205
+ 30 │ + ······difficulty:·"intermediate",
206
+ 31 │ + ····},
207
+ 32 │ + ····{
208
+ 33 │ + ······title:·"Data·Fetching·Patterns",
209
+ 34 │ + ······url:·"https://nextjs.org/docs/app/building-your-application/data-fetching",
210
+ 35 │ + ······type:·"docs",
211
+ 36 │ + ······difficulty:·"advanced",
212
+ 37 │ + ····},
213
+ 18 38 │ ],
214
+ 19 39 │
215
+ 20 40 │ react: [
216
+ 21 │ - ····{·title:·"Official·Documentation",·url:·"https://react.dev",·type:·"docs",·difficulty:·"beginner"·},
217
+ 22 │ - ····{·title:·"React·Quick·Start",·url:·"https://react.dev/learn",·type:·"tutorial",·difficulty:·"beginner"·},
218
+ 23 │ - ····{·title:·"Thinking·in·React",·url:·"https://react.dev/learn/thinking-in-react",·type:·"tutorial",·difficulty:·"intermediate"·},
219
+ 24 │ - ····{·title:·"React·Server·Components",·url:·"https://react.dev/reference/rsc/server-components",·type:·"docs",·difficulty:·"advanced"·},
220
+ 41 │ + ····{
221
+ 42 │ + ······title:·"Official·Documentation",
222
+ 43 │ + ······url:·"https://react.dev",
223
+ 44 │ + ······type:·"docs",
224
+ 45 │ + ······difficulty:·"beginner",
225
+ 46 │ + ····},
226
+ 47 │ + ····{
227
+ 48 │ + ······title:·"React·Quick·Start",
228
+ 49 │ + ······url:·"https://react.dev/learn",
229
+ 50 │ + ······type:·"tutorial",
230
+ 51 │ + ······difficulty:·"beginner",
231
+ 52 │ + ····},
232
+ 53 │ + ····{
233
+ 54 │ + ······title:·"Thinking·in·React",
234
+ 55 │ + ······url:·"https://react.dev/learn/thinking-in-react",
235
+ 56 │ + ······type:·"tutorial",
236
+ 57 │ + ······difficulty:·"intermediate",
237
+ 58 │ + ····},
238
+ 59 │ + ····{
239
+ 60 │ + ······title:·"React·Server·Components",
240
+ 61 │ + ······url:·"https://react.dev/reference/rsc/server-components",
241
+ 62 │ + ······type:·"docs",
242
+ 63 │ + ······difficulty:·"advanced",
243
+ 64 │ + ····},
244
+ 25 65 │ ],
245
+ 26 66 │
246
+ 27 67 │ vue: [
247
+ 28 │ - ····{·title:·"Official·Documentation",·url:·"https://vuejs.org/guide/introduction.html",·type:·"docs",·difficulty:·"beginner"·},
248
+ 29 │ - ····{·title:·"Vue·Tutorial",·url:·"https://vuejs.org/tutorial/",·type:·"tutorial",·difficulty:·"beginner"·},
249
+ 30 │ - ····{·title:·"Composition·API·In-Depth",·url:·"https://vuejs.org/guide/extras/composition-api-faq.html",·type:·"docs",·difficulty:·"intermediate"·},
250
+ 68 │ + ····{
251
+ 69 │ + ······title:·"Official·Documentation",
252
+ 70 │ + ······url:·"https://vuejs.org/guide/introduction.html",
253
+ 71 │ + ······type:·"docs",
254
+ 72 │ + ······difficulty:·"beginner",
255
+ 73 │ + ····},
256
+ 74 │ + ····{
257
+ 75 │ + ······title:·"Vue·Tutorial",
258
+ 76 │ + ······url:·"https://vuejs.org/tutorial/",
259
+ 77 │ + ······type:·"tutorial",
260
+ 78 │ + ······difficulty:·"beginner",
261
+ 79 │ + ····},
262
+ 80 │ + ····{
263
+ 81 │ + ······title:·"Composition·API·In-Depth",
264
+ 82 │ + ······url:·"https://vuejs.org/guide/extras/composition-api-faq.html",
265
+ 83 │ + ······type:·"docs",
266
+ 84 │ + ······difficulty:·"intermediate",
267
+ 85 │ + ····},
268
+ 31 86 │ ],
269
+ 32 87 │
270
+ 33 88 │ svelte: [
271
+ 34 │ - ····{·title:·"Official·Documentation",·url:·"https://svelte.dev/docs",·type:·"docs",·difficulty:·"beginner"·},
272
+ 35 │ - ····{·title:·"Svelte·Interactive·Tutorial",·url:·"https://learn.svelte.dev/",·type:·"tutorial",·difficulty:·"beginner"·},
273
+ 36 │ - ····{·title:·"SvelteKit·Documentation",·url:·"https://svelte.dev/docs/kit/introduction",·type:·"docs",·difficulty:·"intermediate"·},
274
+ 89 │ + ····{
275
+ 90 │ + ······title:·"Official·Documentation",
276
+ 91 │ + ······url:·"https://svelte.dev/docs",
277
+ 92 │ + ······type:·"docs",
278
+ 93 │ + ······difficulty:·"beginner",
279
+ 94 │ + ····},
280
+ 95 │ + ····{
281
+ 96 │ + ······title:·"Svelte·Interactive·Tutorial",
282
+ 97 │ + ······url:·"https://learn.svelte.dev/",
283
+ 98 │ + ······type:·"tutorial",
284
+ 99 │ + ······difficulty:·"beginner",
285
+ 100 │ + ····},
286
+ 101 │ + ····{
287
+ 102 │ + ······title:·"SvelteKit·Documentation",
288
+ 103 │ + ······url:·"https://svelte.dev/docs/kit/introduction",
289
+ 104 │ + ······type:·"docs",
290
+ 105 │ + ······difficulty:·"intermediate",
291
+ 106 │ + ····},
292
+ 37 107 │ ],
293
+ 38 108 │
294
+ 39 109 │ express: [
295
+ 40 │ - ····{·title:·"Official·Documentation",·url:·"https://expressjs.com/",·type:·"docs",·difficulty:·"beginner"·},
296
+ 41 │ - ····{·title:·"Getting·Started·Guide",·url:·"https://expressjs.com/en/starter/installing.html",·type:·"tutorial",·difficulty:·"beginner"·},
297
+ 42 │ - ····{·title:·"Advanced·Routing",·url:·"https://expressjs.com/en/guide/routing.html",·type:·"docs",·difficulty:·"intermediate"·},
298
+ 110 │ + ····{
299
+ 111 │ + ······title:·"Official·Documentation",
300
+ 112 │ + ······url:·"https://expressjs.com/",
301
+ 113 │ + ······type:·"docs",
302
+ 114 │ + ······difficulty:·"beginner",
303
+ 115 │ + ····},
304
+ 116 │ + ····{
305
+ 117 │ + ······title:·"Getting·Started·Guide",
306
+ 118 │ + ······url:·"https://expressjs.com/en/starter/installing.html",
307
+ 119 │ + ······type:·"tutorial",
308
+ 120 │ + ······difficulty:·"beginner",
309
+ 121 │ + ····},
310
+ 122 │ + ····{
311
+ 123 │ + ······title:·"Advanced·Routing",
312
+ 124 │ + ······url:·"https://expressjs.com/en/guide/routing.html",
313
+ 125 │ + ······type:·"docs",
314
+ 126 │ + ······difficulty:·"intermediate",
315
+ 127 │ + ····},
316
+ 43 128 │ ],
317
+ 44 129 │
318
+ 45 130 │ fastapi: [
319
+ 46 │ - ····{·title:·"Official·Documentation",·url:·"https://fastapi.tiangolo.com/",·type:·"docs",·difficulty:·"beginner"·},
320
+ 47 │ - ····{·title:·"FastAPI·Tutorial",·url:·"https://fastapi.tiangolo.com/tutorial/",·type:·"tutorial",·difficulty:·"beginner"·},
321
+ 48 │ - ····{·title:·"Advanced·User·Guide",·url:·"https://fastapi.tiangolo.com/advanced/",·type:·"docs",·difficulty:·"advanced"·},
322
+ 131 │ + ····{
323
+ 132 │ + ······title:·"Official·Documentation",
324
+ 133 │ + ······url:·"https://fastapi.tiangolo.com/",
325
+ 134 │ + ······type:·"docs",
326
+ 135 │ + ······difficulty:·"beginner",
327
+ 136 │ + ····},
328
+ 137 │ + ····{
329
+ 138 │ + ······title:·"FastAPI·Tutorial",
330
+ 139 │ + ······url:·"https://fastapi.tiangolo.com/tutorial/",
331
+ 140 │ + ······type:·"tutorial",
332
+ 141 │ + ······difficulty:·"beginner",
333
+ 387 more lines truncated
334
+
335
+
336
+ src/loader.ts:5:1 assist/source/organizeImports FIXABLE ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
337
+
338
+ × The imports and exports are not sorted.
339
+
340
+ 3 │ */
341
+ 4 │
342
+ > 5 │ import * as fs from "fs";
343
+ │ ^^^^^^^^^^^^^^^^^^^^^^^^^
344
+ 6 │ import * as path from "path";
345
+ 7 │ import { parse as parseYaml } from "yaml";
346
+
347
+ i Safe fix: Organize Imports (Biome)
348
+
349
+ 3 3 │ */
350
+ 4 4 │
351
+ 5 │ - import·*·as·fs·from·"fs";
352
+ 6 │ - import·*·as·path·from·"path";
353
+ 7 │ - import·{·parse·as·parseYaml·}·from·"yaml";
354
+ 8 │ - import·Ajv·from·"ajv";
355
+ 9 │ - import·{·technologySchema·}·from·"./schema.js";
356
+ 10 │ -
357
+ 11 │ - import·type·{·Technology·}·from·"@stackpilot/core";
358
+ 5 │ +
359
+ 6 │ + import·type·{·Technology·}·from·"@stackpilot/core";
360
+ 7 │ + import·Ajv·from·"ajv";
361
+ 8 │ + import·*·as·fs·from·"fs";
362
+ 9 │ + import·*·as·path·from·"path";
363
+ 10 │ + import·{·parse·as·parseYaml·}·from·"yaml";
364
+ 11 │ + import·{·technologySchema·}·from·"./schema.js";
365
+ 12 12 │
366
+ 13 13 │ const ajv = new Ajv({ allErrors: true });
367
+
368
+
369
+ src/loader.ts format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
370
+
371
+ × Formatter would have printed the following content:
372
+
373
+ 32 32 │ if (!fs.statSync(categoryPath).isDirectory()) continue;
374
+ 33 33 │
375
+ 34 │ - ····const·files·=·fs.readdirSync(categoryPath).filter((f)·=>·f.endsWith(".yaml")·||·f.endsWith(".yml"));
376
+ 34 │ + ····const·files·=·fs
377
+ 35 │ + ······.readdirSync(categoryPath)
378
+ 36 │ + ······.filter((f)·=>·f.endsWith(".yaml")·||·f.endsWith(".yml"));
379
+ 35 37 │
380
+ 36 38 │ for (const file of files) {
381
+
382
+
383
+ src/schema.ts format ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
384
+
385
+ × Formatter would have printed the following content:
386
+
387
+ 7 7 │ type: "object",
388
+ 8 8 │ required: [
389
+ 9 │ - ····"id",·"name",·"category",·"description",·"website",
390
+ 10 │ - ····"versions",·"defaultVersion",·"requires",·"incompatibleWith",
391
+ 11 │ - ····"suggestedWith",·"envVars",·"configFiles",·"lastVerified",·"tags",
392
+ 9 │ + ····"id",
393
+ 10 │ + ····"name",
394
+ 11 │ + ····"category",
395
+ 12 │ + ····"description",
396
+ 13 │ + ····"website",
397
+ 14 │ + ····"versions",
398
+ 15 │ + ····"defaultVersion",
399
+ 16 │ + ····"requires",
400
+ 17 │ + ····"incompatibleWith",
401
+ 18 │ + ····"suggestedWith",
402
+ 19 │ + ····"envVars",
403
+ 20 │ + ····"configFiles",
404
+ 21 │ + ····"lastVerified",
405
+ 22 │ + ····"tags",
406
+ 12 23 │ ],
407
+ 13 24 │ properties: {
408
+ ····· │
409
+ 16 27 │ category: {
410
+ 17 28 │ type: "string",
411
+ 18 │ - ······enum:·["runtime",·"frontend",·"backend",·"database",·"orm",·"auth",·"styling",·"service",·"devops"],
412
+ 29 │ + ······enum:·[
413
+ 30 │ + ········"runtime",
414
+ 31 │ + ········"frontend",
415
+ 32 │ + ········"backend",
416
+ 33 │ + ········"database",
417
+ 34 │ + ········"orm",
418
+ 35 │ + ········"auth",
419
+ 36 │ + ········"styling",
420
+ 37 │ + ········"service",
421
+ 38 │ + ········"devops",
422
+ 39 │ + ······],
423
+ 19 40 │ },
424
+ 20 41 │ description: { type: "string" },
425
+
426
+
427
+ Checked 5 files in 33ms. No fixes applied.
428
+ Found 7 errors.
429
+ Found 3 warnings.
430
+ Found 2 infos.
431
+ check ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
432
+
433
+ × Some errors were emitted while running checks.
434
+
435
+
436
+  ELIFECYCLE  Command failed with exit code 1.
@@ -0,0 +1,15 @@
1
+
2
+ > @stackweld/registry@0.2.0 test /home/orlando/Desktop/XPlus-Finance/PROYECTOS_NUEVOS/Stackweld/stackweld/packages/registry
3
+ > vitest run --passWithNoTests
4
+
5
+
6
+  RUN  v4.1.2 /home/orlando/Desktop/XPlus-Finance/PROYECTOS_NUEVOS/Stackweld/stackweld/packages/registry
7
+
8
+ ✓ src/__tests__/loader.test.ts (14 tests) 657ms
9
+ ✓ dist/__tests__/loader.test.js (14 tests) 668ms
10
+
11
+  Test Files  2 passed (2)
12
+  Tests  28 passed (28)
13
+  Start at  09:04:49
14
+  Duration  1.36s (transform 299ms, setup 0ms, import 791ms, tests 1.33s, environment 0ms)
15
+
@@ -0,0 +1,4 @@
1
+
2
+ > @stackpilot/registry@0.1.0 typecheck /home/orlando/Desktop/XPlus-Finance/PROYECTOS_NUEVOS/StackPilot/stackpilot/packages/registry
3
+ > tsc --noEmit
4
+
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=loader.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/loader.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,126 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { listTechnologyIds, loadAllTechnologies, loadTechnology } from "../loader.js";
3
+ describe("Registry Loader", () => {
4
+ it("loads all 50 technologies", () => {
5
+ const techs = loadAllTechnologies();
6
+ expect(techs.length).toBeGreaterThanOrEqual(80);
7
+ });
8
+ it("every technology has required fields", () => {
9
+ const techs = loadAllTechnologies();
10
+ for (const tech of techs) {
11
+ expect(tech.id).toBeTruthy();
12
+ expect(tech.name).toBeTruthy();
13
+ expect(tech.category).toBeTruthy();
14
+ expect(tech.versions.length).toBeGreaterThan(0);
15
+ expect(tech.defaultVersion).toBeTruthy();
16
+ expect(Array.isArray(tech.requires)).toBe(true);
17
+ expect(Array.isArray(tech.incompatibleWith)).toBe(true);
18
+ expect(Array.isArray(tech.suggestedWith)).toBe(true);
19
+ expect(Array.isArray(tech.tags)).toBe(true);
20
+ }
21
+ });
22
+ it("loads a specific technology by ID", () => {
23
+ const tech = loadTechnology("nextjs");
24
+ expect(tech).not.toBeNull();
25
+ expect(tech?.name).toBe("Next.js");
26
+ expect(tech?.category).toBe("frontend");
27
+ expect(tech?.requires).toContain("nodejs");
28
+ });
29
+ it("returns null for unknown technology", () => {
30
+ const tech = loadTechnology("nonexistent");
31
+ expect(tech).toBeNull();
32
+ });
33
+ it("lists all technology IDs", () => {
34
+ const ids = listTechnologyIds();
35
+ expect(ids.length).toBeGreaterThanOrEqual(80);
36
+ expect(ids).toContain("nextjs");
37
+ expect(ids).toContain("postgresql");
38
+ expect(ids).toContain("prisma");
39
+ expect(ids).toContain("tailwindcss");
40
+ });
41
+ it("has no broken cross-references", () => {
42
+ const techs = loadAllTechnologies();
43
+ const idSet = new Set(techs.map((t) => t.id));
44
+ for (const tech of techs) {
45
+ for (const ref of [...tech.requires, ...tech.incompatibleWith, ...tech.suggestedWith]) {
46
+ expect(idSet.has(ref), `${tech.id} references unknown "${ref}"`).toBe(true);
47
+ }
48
+ }
49
+ });
50
+ it("covers all 9 categories", () => {
51
+ const techs = loadAllTechnologies();
52
+ const categories = new Set(techs.map((t) => t.category));
53
+ expect(categories).toContain("runtime");
54
+ expect(categories).toContain("frontend");
55
+ expect(categories).toContain("backend");
56
+ expect(categories).toContain("database");
57
+ expect(categories).toContain("orm");
58
+ expect(categories).toContain("auth");
59
+ expect(categories).toContain("styling");
60
+ expect(categories).toContain("service");
61
+ expect(categories).toContain("devops");
62
+ });
63
+ it("incompatibleWith is symmetric", () => {
64
+ const techs = loadAllTechnologies();
65
+ const techMap = new Map(techs.map((t) => [t.id, t]));
66
+ for (const tech of techs) {
67
+ for (const incompId of tech.incompatibleWith) {
68
+ const other = techMap.get(incompId);
69
+ if (other) {
70
+ expect(other.incompatibleWith.includes(tech.id), `${tech.id} says incompatible with ${incompId}, but ${incompId} doesn't list ${tech.id}`).toBe(true);
71
+ }
72
+ }
73
+ }
74
+ });
75
+ it("all technologies have unique IDs", () => {
76
+ const techs = loadAllTechnologies();
77
+ const ids = techs.map((t) => t.id);
78
+ const uniqueIds = new Set(ids);
79
+ expect(uniqueIds.size, `Found duplicate IDs: ${ids.filter((id, i) => ids.indexOf(id) !== i).join(", ")}`).toBe(ids.length);
80
+ });
81
+ it("all requires references point to existing technology IDs", () => {
82
+ const techs = loadAllTechnologies();
83
+ const idSet = new Set(techs.map((t) => t.id));
84
+ for (const tech of techs) {
85
+ for (const reqId of tech.requires) {
86
+ expect(idSet.has(reqId), `${tech.id} requires "${reqId}" which does not exist in the registry`).toBe(true);
87
+ }
88
+ }
89
+ });
90
+ it("all incompatibleWith references point to existing technology IDs", () => {
91
+ const techs = loadAllTechnologies();
92
+ const idSet = new Set(techs.map((t) => t.id));
93
+ for (const tech of techs) {
94
+ for (const incompId of tech.incompatibleWith) {
95
+ expect(idSet.has(incompId), `${tech.id} lists incompatibleWith "${incompId}" which does not exist in the registry`).toBe(true);
96
+ }
97
+ }
98
+ });
99
+ it("no technology is incompatible with itself", () => {
100
+ const techs = loadAllTechnologies();
101
+ for (const tech of techs) {
102
+ expect(tech.incompatibleWith.includes(tech.id), `${tech.id} is listed as incompatible with itself`).toBe(false);
103
+ }
104
+ });
105
+ it("all technologies have at least one version defined", () => {
106
+ const techs = loadAllTechnologies();
107
+ for (const tech of techs) {
108
+ expect(tech.versions.length, `${tech.id} has no versions defined`).toBeGreaterThan(0);
109
+ }
110
+ });
111
+ it("bidirectional incompatibilities are symmetric (if A lists B, B lists A)", () => {
112
+ const techs = loadAllTechnologies();
113
+ const techMap = new Map(techs.map((t) => [t.id, t]));
114
+ const asymmetric = [];
115
+ for (const tech of techs) {
116
+ for (const incompId of tech.incompatibleWith) {
117
+ const other = techMap.get(incompId);
118
+ if (other && !other.incompatibleWith.includes(tech.id)) {
119
+ asymmetric.push(`${tech.id} -> ${incompId}`);
120
+ }
121
+ }
122
+ }
123
+ expect(asymmetric, `Asymmetric incompatibilities found: ${asymmetric.join(", ")}`).toEqual([]);
124
+ });
125
+ });
126
+ //# sourceMappingURL=loader.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.test.js","sourceRoot":"","sources":["../../src/__tests__/loader.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { LearningResource } from "./learning-resources.js";
2
+ export { getLearningResources, LEARNING_RESOURCES } from "./learning-resources.js";
3
+ export { listTechnologyIds, loadAllTechnologies, loadTechnology } from "./loader.js";
4
+ export { technologySchema } from "./schema.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { getLearningResources, LEARNING_RESOURCES } from "./learning-resources.js";
2
+ export { listTechnologyIds, loadAllTechnologies, loadTechnology } from "./loader.js";
3
+ export { technologySchema } from "./schema.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACnF,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Learning Resources — Curated learning paths for technologies in the registry.
3
+ */
4
+ export interface LearningResource {
5
+ title: string;
6
+ url: string;
7
+ type: "docs" | "tutorial" | "video" | "course" | "book";
8
+ difficulty: "beginner" | "intermediate" | "advanced";
9
+ }
10
+ export declare const LEARNING_RESOURCES: Record<string, LearningResource[]>;
11
+ /**
12
+ * Get learning resources for a technology by its ID.
13
+ * Returns undefined if no resources are available.
14
+ */
15
+ export declare function getLearningResources(technologyId: string): LearningResource[] | undefined;
16
+ //# sourceMappingURL=learning-resources.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"learning-resources.d.ts","sourceRoot":"","sources":["../src/learning-resources.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;IACxD,UAAU,EAAE,UAAU,GAAG,cAAc,GAAG,UAAU,CAAC;CACtD;AAED,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAodjE,CAAC;AAEF;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,EAAE,GAAG,SAAS,CAEzF"}