@suss/packs 0.33.0 → 0.34.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.
- package/README.md +10 -11
- package/dist/activerecord.d.ts +7 -0
- package/dist/activerecord.js +34 -4
- package/dist/apollo-client.js +26 -39
- package/dist/apollo.js +12 -20
- package/dist/aws-dynamodb.js +4 -4
- package/dist/aws-eventbridge.js +3 -3
- package/dist/aws-lambda.js +31 -54
- package/dist/aws-s3.js +1 -1
- package/dist/aws-secrets-manager.js +1 -1
- package/dist/aws-sns.js +2 -2
- package/dist/aws-sqs.js +20 -11
- package/dist/aws-ssm.js +1 -1
- package/dist/axios.js +13 -27
- package/dist/bigquery-python.js +3 -3
- package/dist/bigquery.js +1 -1
- package/dist/{chunk-NYWZHQBJ.js → chunk-GK4BILHB.js} +8 -9
- package/dist/cloudflare-workers.js +26 -35
- package/dist/drizzle.js +15 -20
- package/dist/express.js +3 -6
- package/dist/fabrication.d.ts +1 -0
- package/dist/fabrication.js +36 -0
- package/dist/factory-bot.d.ts +1 -0
- package/dist/factory-bot.js +36 -0
- package/dist/faraday.js +4 -5
- package/dist/fastapi.js +21 -5
- package/dist/fastify.js +10 -14
- package/dist/fetch.js +3 -4
- package/dist/flask-restx.js +19 -12
- package/dist/gcs.js +1 -1
- package/dist/graphql-ruby.js +20 -16
- package/dist/hono.js +17 -27
- package/dist/httpx.js +3 -5
- package/dist/minitest.d.ts +1 -0
- package/dist/minitest.js +59 -0
- package/dist/mongoose.js +7 -7
- package/dist/nestjs-graphql.js +14 -25
- package/dist/nestjs-microservices.js +9 -10
- package/dist/nestjs-rest.js +42 -22
- package/dist/net-http.js +5 -6
- package/dist/nextjs.js +16 -17
- package/dist/node.js +144 -28
- package/dist/package-exports.js +1 -1
- package/dist/pg.js +3 -2
- package/dist/prisma.js +281 -48
- package/dist/pytest.d.ts +1 -0
- package/dist/pytest.js +81 -0
- package/dist/rails.js +46 -27
- package/dist/react-query.js +1 -1
- package/dist/react-router.js +21 -48
- package/dist/react.js +14 -5
- package/dist/redis.js +1 -1
- package/dist/requests.js +4 -5
- package/dist/rspec.d.ts +1 -0
- package/dist/rspec.js +135 -0
- package/dist/sqlalchemy.js +1 -1
- package/dist/sqlmodel.js +7 -8
- package/dist/ts-rest.js +6 -8
- package/dist/typeorm.d.ts +1 -0
- package/dist/typeorm.js +291 -0
- package/dist/vitest.d.ts +1 -0
- package/dist/vitest.js +64 -0
- package/package.json +47 -11
package/dist/typeorm.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
// ../framework/typeorm/dist/index.js
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { scopeOption, storageSystemOption } from "@suss/extractor";
|
|
4
|
+
import {
|
|
5
|
+
constructedFrom,
|
|
6
|
+
pack,
|
|
7
|
+
sqlStatements,
|
|
8
|
+
storageCalls
|
|
9
|
+
} from "@suss/recognize";
|
|
10
|
+
import fs from "fs";
|
|
11
|
+
import path from "path";
|
|
12
|
+
import { ts } from "ts-morph";
|
|
13
|
+
var STORAGE_SYSTEM_OF_DRIVER = {
|
|
14
|
+
postgres: "postgresql",
|
|
15
|
+
"aurora-postgres": "postgresql",
|
|
16
|
+
mysql: "mysql",
|
|
17
|
+
mariadb: "mysql",
|
|
18
|
+
"aurora-mysql": "mysql",
|
|
19
|
+
sqlite: "sqlite",
|
|
20
|
+
"better-sqlite3": "sqlite",
|
|
21
|
+
sqljs: "sqlite"
|
|
22
|
+
};
|
|
23
|
+
var UNPAIRED_DRIVERS = /* @__PURE__ */ new Set([
|
|
24
|
+
"cockroachdb",
|
|
25
|
+
"mssql",
|
|
26
|
+
"oracle",
|
|
27
|
+
"sap",
|
|
28
|
+
"spanner",
|
|
29
|
+
"mongodb"
|
|
30
|
+
]);
|
|
31
|
+
var CONNECTION_FACTORIES = /* @__PURE__ */ new Set(["forRoot", "forRootAsync"]);
|
|
32
|
+
var INSTALLED_PACKAGES = "node_modules";
|
|
33
|
+
var SOURCE_FILE = /\.(?:[cm]?ts|[cm]?js)$/;
|
|
34
|
+
function storageSystemFromDataSource(projectRoot) {
|
|
35
|
+
const systems = /* @__PURE__ */ new Set();
|
|
36
|
+
for (const file of sourceFilesUnder(projectRoot)) {
|
|
37
|
+
const text = fs.readFileSync(file, "utf8");
|
|
38
|
+
if (!text.includes("typeorm")) {
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
for (const driver of driversIn(file, text)) {
|
|
42
|
+
if (UNPAIRED_DRIVERS.has(driver)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
const system = STORAGE_SYSTEM_OF_DRIVER[driver];
|
|
46
|
+
if (system !== void 0) {
|
|
47
|
+
systems.add(system);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const [only] = systems;
|
|
52
|
+
return systems.size === 1 && only !== void 0 ? { storageSystem: only } : null;
|
|
53
|
+
}
|
|
54
|
+
function sourceFilesUnder(dir) {
|
|
55
|
+
let entries;
|
|
56
|
+
try {
|
|
57
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
58
|
+
} catch {
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
const files = [];
|
|
62
|
+
for (const entry of entries) {
|
|
63
|
+
const full = path.join(dir, entry.name);
|
|
64
|
+
if (entry.isDirectory()) {
|
|
65
|
+
if (!entry.name.startsWith(".") && entry.name !== INSTALLED_PACKAGES) {
|
|
66
|
+
files.push(...sourceFilesUnder(full));
|
|
67
|
+
}
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (entry.isFile() && SOURCE_FILE.test(entry.name) && !entry.name.endsWith(".d.ts")) {
|
|
71
|
+
files.push(full);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return files;
|
|
75
|
+
}
|
|
76
|
+
function driversIn(file, text) {
|
|
77
|
+
const source = ts.createSourceFile(file, text, ts.ScriptTarget.Latest);
|
|
78
|
+
const found = [];
|
|
79
|
+
const visit = (node) => {
|
|
80
|
+
const options = connectionOptionsOf(node);
|
|
81
|
+
if (options !== void 0) {
|
|
82
|
+
found.push(...stringTypesIn(options, source));
|
|
83
|
+
}
|
|
84
|
+
ts.forEachChild(node, visit);
|
|
85
|
+
};
|
|
86
|
+
visit(source);
|
|
87
|
+
return found;
|
|
88
|
+
}
|
|
89
|
+
function connectionOptionsOf(node) {
|
|
90
|
+
if (ts.isNewExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "DataSource") {
|
|
91
|
+
return node.arguments?.[0];
|
|
92
|
+
}
|
|
93
|
+
if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && CONNECTION_FACTORIES.has(node.expression.name.text) && ts.isIdentifier(node.expression.expression) && node.expression.expression.text === "TypeOrmModule") {
|
|
94
|
+
return node.arguments[0];
|
|
95
|
+
}
|
|
96
|
+
return void 0;
|
|
97
|
+
}
|
|
98
|
+
function stringTypesIn(options, source) {
|
|
99
|
+
const found = [];
|
|
100
|
+
const visit = (node) => {
|
|
101
|
+
if (ts.isPropertyAssignment(node) && node.name.getText(source) === "type" && ts.isStringLiteralLike(node.initializer)) {
|
|
102
|
+
found.push(node.initializer.text);
|
|
103
|
+
}
|
|
104
|
+
ts.forEachChild(node, visit);
|
|
105
|
+
};
|
|
106
|
+
visit(options);
|
|
107
|
+
return found;
|
|
108
|
+
}
|
|
109
|
+
var NEST_MODULE = "@nestjs/typeorm";
|
|
110
|
+
var TYPEORM_MODULE = "typeorm";
|
|
111
|
+
var INJECT_REPOSITORY = "InjectRepository";
|
|
112
|
+
var INJECT_DATA_SOURCE = "InjectDataSource";
|
|
113
|
+
var INJECT_ENTITY_MANAGER = "InjectEntityManager";
|
|
114
|
+
var WHOLE_ROW = ["*"];
|
|
115
|
+
var CONDITION_COLUMNS = ({ input }) => {
|
|
116
|
+
const conditions = input.items();
|
|
117
|
+
if (conditions.length === 0) {
|
|
118
|
+
return keysOf(input);
|
|
119
|
+
}
|
|
120
|
+
return [...new Set(conditions.flatMap((condition2) => keysOf(condition2)))];
|
|
121
|
+
};
|
|
122
|
+
var SELECTED = ({ input }) => {
|
|
123
|
+
const listed = input.items().map((item) => item.text()).filter((name) => name !== null);
|
|
124
|
+
if (listed.length > 0) {
|
|
125
|
+
return listed;
|
|
126
|
+
}
|
|
127
|
+
const flagged = keysOf(input, (value) => value.flag() !== false);
|
|
128
|
+
return flagged.length > 0 ? flagged : WHOLE_ROW;
|
|
129
|
+
};
|
|
130
|
+
var PAYLOAD = ({ input }) => {
|
|
131
|
+
const entities = input.items();
|
|
132
|
+
if (entities.length === 0) {
|
|
133
|
+
const written = keysOf(input);
|
|
134
|
+
return written.length > 0 ? written : WHOLE_ROW;
|
|
135
|
+
}
|
|
136
|
+
const union = /* @__PURE__ */ new Set();
|
|
137
|
+
for (const entity of entities) {
|
|
138
|
+
const written = keysOf(entity);
|
|
139
|
+
if (written.length === 0) {
|
|
140
|
+
return WHOLE_ROW;
|
|
141
|
+
}
|
|
142
|
+
for (const name of written) {
|
|
143
|
+
union.add(name);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return [...union];
|
|
147
|
+
};
|
|
148
|
+
function keysOf(value, keep = () => true) {
|
|
149
|
+
const found = [];
|
|
150
|
+
for (const entry of value.entries("nothing")) {
|
|
151
|
+
if (entry.key !== null && keep(entry.value)) {
|
|
152
|
+
found.push(entry.key);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return found;
|
|
156
|
+
}
|
|
157
|
+
var optionsWhere = {
|
|
158
|
+
of: { at: 0, property: ["where"] },
|
|
159
|
+
by: CONDITION_COLUMNS
|
|
160
|
+
};
|
|
161
|
+
var optionsSelect = {
|
|
162
|
+
of: { at: 0, property: ["select"] },
|
|
163
|
+
by: SELECTED
|
|
164
|
+
};
|
|
165
|
+
var condition = (at) => ({
|
|
166
|
+
of: { at },
|
|
167
|
+
by: CONDITION_COLUMNS
|
|
168
|
+
});
|
|
169
|
+
var payload = (at) => ({ of: { at }, by: PAYLOAD });
|
|
170
|
+
var REPOSITORY_METHODS = {
|
|
171
|
+
find: { kind: "read", selector: optionsWhere, fields: optionsSelect },
|
|
172
|
+
findOne: { kind: "read", selector: optionsWhere, fields: optionsSelect },
|
|
173
|
+
findOneOrFail: {
|
|
174
|
+
kind: "read",
|
|
175
|
+
selector: optionsWhere,
|
|
176
|
+
fields: optionsSelect
|
|
177
|
+
},
|
|
178
|
+
findAndCount: {
|
|
179
|
+
kind: "read",
|
|
180
|
+
selector: optionsWhere,
|
|
181
|
+
fields: optionsSelect
|
|
182
|
+
},
|
|
183
|
+
count: { kind: "read", selector: optionsWhere },
|
|
184
|
+
exists: { kind: "read", selector: optionsWhere },
|
|
185
|
+
findBy: { kind: "read", selector: condition(0), fields: WHOLE_ROW },
|
|
186
|
+
findOneBy: { kind: "read", selector: condition(0), fields: WHOLE_ROW },
|
|
187
|
+
findOneByOrFail: { kind: "read", selector: condition(0), fields: WHOLE_ROW },
|
|
188
|
+
findAndCountBy: { kind: "read", selector: condition(0), fields: WHOLE_ROW },
|
|
189
|
+
countBy: { kind: "read", selector: condition(0) },
|
|
190
|
+
existsBy: { kind: "read", selector: condition(0) },
|
|
191
|
+
save: { kind: "write", fields: payload(0) },
|
|
192
|
+
insert: { kind: "write", fields: payload(0) },
|
|
193
|
+
upsert: { kind: "write", fields: payload(0) },
|
|
194
|
+
update: { kind: "write", selector: condition(0), fields: payload(1) },
|
|
195
|
+
increment: { kind: "write", selector: condition(0), fields: { at: 1 } },
|
|
196
|
+
decrement: { kind: "write", selector: condition(0), fields: { at: 1 } },
|
|
197
|
+
delete: { kind: "write", selector: condition(0), fields: WHOLE_ROW },
|
|
198
|
+
softDelete: { kind: "write", selector: condition(0), fields: WHOLE_ROW },
|
|
199
|
+
restore: { kind: "write", selector: condition(0), fields: WHOLE_ROW },
|
|
200
|
+
// `remove` takes loaded entities and deletes them by primary key, which
|
|
201
|
+
// the call does not spell.
|
|
202
|
+
remove: { kind: "write", fields: WHOLE_ROW },
|
|
203
|
+
softRemove: { kind: "write", fields: WHOLE_ROW }
|
|
204
|
+
};
|
|
205
|
+
var ENTITY = constructedFrom({ from: [TYPEORM_MODULE], named: ["Entity"] });
|
|
206
|
+
function tableOf(_selector, call) {
|
|
207
|
+
const entity = call.receiver()?.classAt?.(0) ?? null;
|
|
208
|
+
if (entity === null) {
|
|
209
|
+
return null;
|
|
210
|
+
}
|
|
211
|
+
const decorator = entity.decorator(ENTITY);
|
|
212
|
+
const stated = decorator?.propertyAt(0, "name", "nothing") ?? decorator?.nameAt(0, "nothing") ?? null;
|
|
213
|
+
if (stated !== null) {
|
|
214
|
+
return stated;
|
|
215
|
+
}
|
|
216
|
+
const className = entity.name();
|
|
217
|
+
return className === null ? null : snakeCase(className);
|
|
218
|
+
}
|
|
219
|
+
function snakeCase(name) {
|
|
220
|
+
return name.replace(/([A-Z])([A-Z])([a-z])/g, "$1_$2$3").replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase();
|
|
221
|
+
}
|
|
222
|
+
var optionsSchema = z.object({
|
|
223
|
+
/**
|
|
224
|
+
* The storage system the calls target, `"postgresql"` when unset. It
|
|
225
|
+
* has to match the other side's `storageSystem`, or the calls do not
|
|
226
|
+
* pair.
|
|
227
|
+
*/
|
|
228
|
+
storageSystem: storageSystemOption.optional(),
|
|
229
|
+
/** Scope for the storage binding, `"default"` when unset. */
|
|
230
|
+
scope: scopeOption.optional()
|
|
231
|
+
}).strict();
|
|
232
|
+
function repositoryCalls(options) {
|
|
233
|
+
return storageCalls({
|
|
234
|
+
system: options.storageSystem ?? "postgresql",
|
|
235
|
+
scope: options.scope ?? "default",
|
|
236
|
+
client: constructedFrom({
|
|
237
|
+
from: [NEST_MODULE],
|
|
238
|
+
named: [INJECT_REPOSITORY]
|
|
239
|
+
}),
|
|
240
|
+
unsettledName: "nothing"
|
|
241
|
+
}).methods(REPOSITORY_METHODS).container(tableOf).example('this.orders.find({ where: { status: "open" } })');
|
|
242
|
+
}
|
|
243
|
+
var STATEMENT = { statement: { at: 0 } };
|
|
244
|
+
function rawStatements(options) {
|
|
245
|
+
const system = options.storageSystem ?? "postgresql";
|
|
246
|
+
return sqlStatements({
|
|
247
|
+
system,
|
|
248
|
+
dialect: system,
|
|
249
|
+
scope: options.scope ?? "default",
|
|
250
|
+
client: constructedFrom({
|
|
251
|
+
from: [NEST_MODULE],
|
|
252
|
+
named: [INJECT_DATA_SOURCE, INJECT_ENTITY_MANAGER]
|
|
253
|
+
})
|
|
254
|
+
}).methods({ query: STATEMENT }).example('this.source.query("SELECT id FROM orders")');
|
|
255
|
+
}
|
|
256
|
+
function typeormFramework(options = {}) {
|
|
257
|
+
return {
|
|
258
|
+
...pack("typeorm", [repositoryCalls(options), rawStatements(options)], {
|
|
259
|
+
languages: ["typescript", "javascript"],
|
|
260
|
+
recognizedAs: "@suss/framework-typeorm",
|
|
261
|
+
protocol: "in-process"
|
|
262
|
+
}),
|
|
263
|
+
parameterSuppliers: [
|
|
264
|
+
INJECT_REPOSITORY,
|
|
265
|
+
INJECT_DATA_SOURCE,
|
|
266
|
+
INJECT_ENTITY_MANAGER
|
|
267
|
+
].map((name) => ({ module: NEST_MODULE, name }))
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
var declares = {
|
|
271
|
+
kind: "effects",
|
|
272
|
+
package: "@suss/framework-typeorm",
|
|
273
|
+
dependencies: [{ ecosystem: "npm", name: NEST_MODULE }],
|
|
274
|
+
reads: "TypeORM repositories that NestJS injects with `@InjectRepository`. Each read and write becomes a storage-access interaction on the entity's table, and a `query` on an injected data source or entity manager is read as SQL.",
|
|
275
|
+
configuration: {
|
|
276
|
+
file: "suss.typeorm.json",
|
|
277
|
+
example: { storageSystem: "postgresql" },
|
|
278
|
+
required: false,
|
|
279
|
+
// The extract command init prints passes this file, so init always
|
|
280
|
+
// writes it, with the pack's own default when the project does not say.
|
|
281
|
+
defaults: { storageSystem: "postgresql" },
|
|
282
|
+
why: "which database the connection uses: postgresql, mysql, or sqlite. It assumes postgresql otherwise, and the calls do not pair with a store on another database.",
|
|
283
|
+
readFromProject: storageSystemFromDataSource
|
|
284
|
+
}
|
|
285
|
+
};
|
|
286
|
+
var index_default = typeormFramework;
|
|
287
|
+
export {
|
|
288
|
+
declares,
|
|
289
|
+
index_default as default,
|
|
290
|
+
optionsSchema
|
|
291
|
+
};
|
package/dist/vitest.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { declares, default, optionsSchema } from '@suss/framework-vitest';
|
package/dist/vitest.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// ../framework/vitest/dist/index.js
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var optionsSchema = z.object({
|
|
4
|
+
/**
|
|
5
|
+
* The test files to read, matched on whole path segments from the
|
|
6
|
+
* end. `suss extract --intent` fills it in from the tests the PRDs
|
|
7
|
+
* name, so a run reads those files and no others. Left out, every
|
|
8
|
+
* file that imports vitest is read.
|
|
9
|
+
*/
|
|
10
|
+
files: z.array(z.string().min(1)).optional()
|
|
11
|
+
}).strict();
|
|
12
|
+
function vitestFramework(options = {}) {
|
|
13
|
+
return {
|
|
14
|
+
name: "vitest",
|
|
15
|
+
protocol: "in-process",
|
|
16
|
+
languages: ["typescript", "javascript"],
|
|
17
|
+
discovery: [
|
|
18
|
+
{
|
|
19
|
+
kind: "test",
|
|
20
|
+
match: {
|
|
21
|
+
type: "testCase",
|
|
22
|
+
style: "block",
|
|
23
|
+
importModule: "vitest",
|
|
24
|
+
suiteNames: ["describe", "suite"],
|
|
25
|
+
caseNames: ["it", "test"],
|
|
26
|
+
skipModifiers: ["skip", "todo"],
|
|
27
|
+
argumentModifiers: ["skipIf", "runIf"],
|
|
28
|
+
rowModifiers: ["each", "for"],
|
|
29
|
+
mocks: {
|
|
30
|
+
object: "vi",
|
|
31
|
+
moduleMethods: ["mock", "doMock"],
|
|
32
|
+
memberMethods: ["spyOn"]
|
|
33
|
+
},
|
|
34
|
+
...options.files !== void 0 ? { files: options.files } : {}
|
|
35
|
+
},
|
|
36
|
+
requiresImport: ["vitest"]
|
|
37
|
+
}
|
|
38
|
+
],
|
|
39
|
+
// What a test returns does not matter. Every way out of the body is
|
|
40
|
+
// a terminal so the calls on each path are recorded.
|
|
41
|
+
terminals: [
|
|
42
|
+
{ kind: "return", match: { type: "returnStatement" }, extraction: {} },
|
|
43
|
+
{ kind: "throw", match: { type: "throwExpression" }, extraction: {} },
|
|
44
|
+
{
|
|
45
|
+
kind: "return",
|
|
46
|
+
match: { type: "functionFallthrough" },
|
|
47
|
+
extraction: {}
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
inputMapping: { type: "allPositional" }
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
var declares = {
|
|
54
|
+
kind: "framework",
|
|
55
|
+
package: "@suss/framework-vitest",
|
|
56
|
+
dependencies: [],
|
|
57
|
+
reads: "vitest cases, named by their titles, so a PRD scenario can say which test covers it."
|
|
58
|
+
};
|
|
59
|
+
var index_default = vitestFramework;
|
|
60
|
+
export {
|
|
61
|
+
declares,
|
|
62
|
+
index_default as default,
|
|
63
|
+
optionsSchema
|
|
64
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@suss/packs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.34.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Every pack suss ships in one install, so it can read Express, Hono, NestJS, FastAPI, Rails, Prisma, OpenAPI and the rest.",
|
|
6
6
|
"keywords": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
],
|
|
16
16
|
"license": "Apache-2.0",
|
|
17
17
|
"author": "Nimbus Cloud AI LLC",
|
|
18
|
-
"homepage": "https://
|
|
18
|
+
"homepage": "https://suss.sh",
|
|
19
19
|
"repository": {
|
|
20
20
|
"type": "git",
|
|
21
21
|
"url": "git+https://github.com/nimbuscloud-ai/suss.git",
|
|
@@ -177,6 +177,22 @@
|
|
|
177
177
|
"types": "./dist/pg-ruby.d.ts",
|
|
178
178
|
"import": "./dist/pg-ruby.js"
|
|
179
179
|
},
|
|
180
|
+
"./rspec": {
|
|
181
|
+
"types": "./dist/rspec.d.ts",
|
|
182
|
+
"import": "./dist/rspec.js"
|
|
183
|
+
},
|
|
184
|
+
"./factory-bot": {
|
|
185
|
+
"types": "./dist/factory-bot.d.ts",
|
|
186
|
+
"import": "./dist/factory-bot.js"
|
|
187
|
+
},
|
|
188
|
+
"./fabrication": {
|
|
189
|
+
"types": "./dist/fabrication.d.ts",
|
|
190
|
+
"import": "./dist/fabrication.js"
|
|
191
|
+
},
|
|
192
|
+
"./minitest": {
|
|
193
|
+
"types": "./dist/minitest.d.ts",
|
|
194
|
+
"import": "./dist/minitest.js"
|
|
195
|
+
},
|
|
180
196
|
"./prisma": {
|
|
181
197
|
"types": "./dist/prisma.d.ts",
|
|
182
198
|
"import": "./dist/prisma.js"
|
|
@@ -209,6 +225,14 @@
|
|
|
209
225
|
"types": "./dist/zustand.d.ts",
|
|
210
226
|
"import": "./dist/zustand.js"
|
|
211
227
|
},
|
|
228
|
+
"./vitest": {
|
|
229
|
+
"types": "./dist/vitest.d.ts",
|
|
230
|
+
"import": "./dist/vitest.js"
|
|
231
|
+
},
|
|
232
|
+
"./pytest": {
|
|
233
|
+
"types": "./dist/pytest.d.ts",
|
|
234
|
+
"import": "./dist/pytest.js"
|
|
235
|
+
},
|
|
212
236
|
"./sqlalchemy": {
|
|
213
237
|
"types": "./dist/sqlalchemy.d.ts",
|
|
214
238
|
"import": "./dist/sqlalchemy.js"
|
|
@@ -220,6 +244,10 @@
|
|
|
220
244
|
"./ts-rest": {
|
|
221
245
|
"types": "./dist/ts-rest.d.ts",
|
|
222
246
|
"import": "./dist/ts-rest.js"
|
|
247
|
+
},
|
|
248
|
+
"./typeorm": {
|
|
249
|
+
"types": "./dist/typeorm.d.ts",
|
|
250
|
+
"import": "./dist/typeorm.js"
|
|
223
251
|
}
|
|
224
252
|
},
|
|
225
253
|
"files": [
|
|
@@ -238,15 +266,16 @@
|
|
|
238
266
|
"ts-morph": "^23.0.0"
|
|
239
267
|
},
|
|
240
268
|
"dependencies": {
|
|
241
|
-
"@
|
|
242
|
-
"@suss/adapter-
|
|
243
|
-
"@suss/adapter-
|
|
244
|
-
"@suss/
|
|
245
|
-
"@suss/
|
|
246
|
-
"@suss/
|
|
247
|
-
"@suss/
|
|
248
|
-
"@suss/
|
|
249
|
-
"@suss/
|
|
269
|
+
"@mrleebo/prisma-ast": "^0.15.0",
|
|
270
|
+
"@suss/adapter-python": "0.34.0",
|
|
271
|
+
"@suss/adapter-ruby": "0.34.0",
|
|
272
|
+
"@suss/adapter-typescript": "0.34.0",
|
|
273
|
+
"@suss/behavioral-ir": "0.34.0",
|
|
274
|
+
"@suss/contract-graphql": "0.34.0",
|
|
275
|
+
"@suss/extractor": "0.34.0",
|
|
276
|
+
"@suss/manifest-aws": "0.34.0",
|
|
277
|
+
"@suss/recognize": "0.34.0",
|
|
278
|
+
"@suss/sql": "0.34.0",
|
|
250
279
|
"zod": "^4.0.0"
|
|
251
280
|
},
|
|
252
281
|
"devDependencies": {
|
|
@@ -288,16 +317,23 @@
|
|
|
288
317
|
"@suss/framework-package-exports": "*",
|
|
289
318
|
"@suss/framework-pg": "*",
|
|
290
319
|
"@suss/framework-pg-ruby": "*",
|
|
320
|
+
"@suss/framework-rspec": "*",
|
|
321
|
+
"@suss/framework-factory-bot": "*",
|
|
322
|
+
"@suss/framework-fabrication": "*",
|
|
323
|
+
"@suss/framework-minitest": "*",
|
|
291
324
|
"@suss/framework-prisma": "*",
|
|
325
|
+
"@suss/framework-pytest": "*",
|
|
292
326
|
"@suss/framework-rails": "*",
|
|
293
327
|
"@suss/framework-react": "*",
|
|
294
328
|
"@suss/framework-react-query": "*",
|
|
295
329
|
"@suss/framework-zustand": "*",
|
|
330
|
+
"@suss/framework-vitest": "*",
|
|
296
331
|
"@suss/framework-react-router": "*",
|
|
297
332
|
"@suss/framework-redis": "*",
|
|
298
333
|
"@suss/framework-sqlalchemy": "*",
|
|
299
334
|
"@suss/framework-sqlmodel": "*",
|
|
300
335
|
"@suss/framework-ts-rest": "*",
|
|
336
|
+
"@suss/framework-typeorm": "*",
|
|
301
337
|
"@suss/runtime-node": "*",
|
|
302
338
|
"tsup": "*",
|
|
303
339
|
"typescript": "*",
|