@deessejs/collections 0.0.48 → 0.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/index.d.ts +2 -3
- package/dist/config/index.js +39 -7
- package/dist/drizzle/generate.js +21 -2
- package/dist/worker/index.js +21 -18
- package/package.json +1 -1
package/dist/config/index.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
+
import { drizzle } from "drizzle-orm/node-postgres";
|
|
1
2
|
import { Config } from "./types";
|
|
2
|
-
export declare const defineConfig: (config: Config) =>
|
|
3
|
-
$client: import("pg").Pool;
|
|
4
|
-
};
|
|
3
|
+
export declare const defineConfig: (config: Config) => ReturnType<typeof drizzle<any>>;
|
package/dist/config/index.js
CHANGED
|
@@ -1,19 +1,51 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
6
|
exports.defineConfig = void 0;
|
|
4
|
-
// src/core/index.ts (ou là où est défini defineConfig)
|
|
5
7
|
const node_postgres_1 = require("drizzle-orm/node-postgres");
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
// Fonction utilitaire pour charger le schéma de manière "lazy"
|
|
10
|
+
const loadGeneratedSchema = () => {
|
|
11
|
+
try {
|
|
12
|
+
// 1. Essayer via l'alias Webpack (fonctionne dans Next.js)
|
|
13
|
+
// On utilise un require dynamique pour éviter que le bundler ne râle à la compilation
|
|
14
|
+
// si le fichier n'est pas là.
|
|
15
|
+
return require("@deesse/schema");
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
try {
|
|
19
|
+
// 2. Fallback : Essayer le chemin physique (si on est hors contexte webpack, ex: scripts)
|
|
20
|
+
const localPath = path_1.default.join(process.cwd(), ".deesse", "shadow", "schema.ts");
|
|
21
|
+
// Note: require de fichier .ts natif nécessite jiti ou ts-node,
|
|
22
|
+
// mais en prod Next.js ce sera compilé.
|
|
23
|
+
// En dev, Next.js gère le TS.
|
|
24
|
+
return require(localPath);
|
|
25
|
+
}
|
|
26
|
+
catch (e2) {
|
|
27
|
+
// 3. Premier lancement : le schéma n'existe pas encore
|
|
28
|
+
console.warn("[Deesse] ⚠️ Schema not found. 'db.query' will be empty until schema generation completes.");
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
6
33
|
const defineConfig = (config) => {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
//
|
|
34
|
+
// 1. Charger le schéma généré
|
|
35
|
+
const schema = loadGeneratedSchema();
|
|
36
|
+
// 2. Initialiser Drizzle AVEC le schéma
|
|
37
|
+
const db = (0, node_postgres_1.drizzle)(config.databaseUrl, {
|
|
38
|
+
schema,
|
|
39
|
+
// logger: true // utile pour debug
|
|
40
|
+
});
|
|
41
|
+
// 3. Attacher la config pour le worker (votre code existant)
|
|
10
42
|
Object.defineProperty(db, '_config', {
|
|
11
43
|
value: config,
|
|
12
|
-
enumerable: false,
|
|
44
|
+
enumerable: false,
|
|
13
45
|
writable: false
|
|
14
46
|
});
|
|
15
|
-
//
|
|
16
|
-
//
|
|
47
|
+
// 4. On caste le retour pour faire croire à TS qu'on a le bon typage
|
|
48
|
+
// (Voir section Typage ci-dessous)
|
|
17
49
|
return db;
|
|
18
50
|
};
|
|
19
51
|
exports.defineConfig = defineConfig;
|
package/dist/drizzle/generate.js
CHANGED
|
@@ -11,12 +11,14 @@ const SHADOW_DIR = path_1.default.join(process.cwd(), ".deesse", "shadow");
|
|
|
11
11
|
const SCHEMA_PATH = path_1.default.join(SHADOW_DIR, "schema.ts");
|
|
12
12
|
const generateShadowSchema = (collections) => {
|
|
13
13
|
fs_1.default.mkdirSync(SHADOW_DIR, { recursive: true });
|
|
14
|
+
// 1. Générer le code des tables
|
|
14
15
|
const tablesCode = collections.map((col) => {
|
|
15
16
|
const columns = Object.entries(col.fields)
|
|
16
17
|
.map(([name, field]) => {
|
|
17
18
|
const kind = field.type.dsl.kind;
|
|
18
19
|
const drizzleType = Object.keys(_1.DrizzleTypes).includes(kind)
|
|
19
|
-
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
? `p.${kind}()` // TODO: gérer les params (varchar(255), etc.)
|
|
20
22
|
: `p.text()`;
|
|
21
23
|
return ` ${name}: ${drizzleType},`;
|
|
22
24
|
})
|
|
@@ -26,12 +28,29 @@ export const ${col.slug} = p.pgTable("${col.slug}", {
|
|
|
26
28
|
${columns}
|
|
27
29
|
});`;
|
|
28
30
|
});
|
|
31
|
+
// 2. Générer le code des relations (Pour l'instant vide ou basique)
|
|
32
|
+
// Drizzle a besoin de "relations" importé de "drizzle-orm"
|
|
33
|
+
const relationsCode = `
|
|
34
|
+
import { relations } from "drizzle-orm";
|
|
35
|
+
|
|
36
|
+
// Placeholder pour les relations futures
|
|
37
|
+
export const schemaRelations = relations(posts, ({ one, many }) => ({
|
|
38
|
+
// Logique à implémenter plus tard en lisant les champs "relationship" de vos collections
|
|
39
|
+
}));
|
|
40
|
+
`;
|
|
41
|
+
// 3. Assembler le fichier
|
|
29
42
|
const schemaFileContent = `
|
|
30
43
|
import * as p from "drizzle-orm/pg-core";
|
|
44
|
+
import { relations } from "drizzle-orm";
|
|
31
45
|
|
|
46
|
+
// --- Tables ---
|
|
32
47
|
${tablesCode.join("\n")}
|
|
48
|
+
|
|
49
|
+
// --- Relations ---
|
|
50
|
+
// (Note: Pour l'instant on ne génère pas de relations complexes automatiquement,
|
|
51
|
+
// mais on prépare le terrain)
|
|
33
52
|
`;
|
|
34
53
|
fs_1.default.writeFileSync(SCHEMA_PATH, schemaFileContent);
|
|
35
|
-
console.log("[Deesse] Shadow schema generated at", SCHEMA_PATH);
|
|
54
|
+
console.log("[Deesse] ✅ Shadow schema generated at", SCHEMA_PATH);
|
|
36
55
|
};
|
|
37
56
|
exports.generateShadowSchema = generateShadowSchema;
|
package/dist/worker/index.js
CHANGED
|
@@ -12,8 +12,9 @@ const PROJECT_ROOT = process.cwd();
|
|
|
12
12
|
const CONFIG_PATH = path_1.default.join(PROJECT_ROOT, "src", "api", "index.ts");
|
|
13
13
|
const COLLECTIONS_DIR = path_1.default.join(PROJECT_ROOT, "src", "collections");
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Utilise Jiti pour lire le tsconfig.json.
|
|
16
|
+
* Jiti gère nativement le JSONC (commentaires, trailing commas)
|
|
17
|
+
* que JSON.parse ne supporte pas.
|
|
17
18
|
*/
|
|
18
19
|
function getTsConfigAliases(root) {
|
|
19
20
|
const tsConfigPath = path_1.default.join(root, "tsconfig.json");
|
|
@@ -21,60 +22,62 @@ function getTsConfigAliases(root) {
|
|
|
21
22
|
return {};
|
|
22
23
|
}
|
|
23
24
|
try {
|
|
24
|
-
//
|
|
25
|
-
const
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
// 1. On crée une instance temporaire de Jiti juste pour lire la config
|
|
26
|
+
const tempJiti = (0, jiti_1.createJiti)(root, { requireCache: false });
|
|
27
|
+
// 2. On charge le fichier. Jiti va le parser correctement.
|
|
28
|
+
// Note: selon la version de jiti, pour du JSON, il retourne l'objet directement
|
|
29
|
+
// ou un module avec export default.
|
|
30
|
+
const loaded = tempJiti(tsConfigPath);
|
|
31
|
+
const tsConfig = loaded.default || loaded;
|
|
29
32
|
const paths = tsConfig?.compilerOptions?.paths;
|
|
30
33
|
if (!paths)
|
|
31
34
|
return {};
|
|
32
35
|
const aliases = {};
|
|
33
36
|
for (const [key, values] of Object.entries(paths)) {
|
|
34
37
|
const value = Array.isArray(values) ? values[0] : values;
|
|
35
|
-
// Conversion
|
|
38
|
+
// Conversion: "@/*" -> "src/*" ===> "@" -> "/abs/path/to/src"
|
|
36
39
|
const aliasKey = key.replace("/*", "");
|
|
37
40
|
const aliasValue = String(value).replace("/*", "");
|
|
38
|
-
// Jiti a besoin de chemins absolus pour les alias
|
|
39
41
|
aliases[aliasKey] = path_1.default.resolve(root, aliasValue);
|
|
40
42
|
}
|
|
41
43
|
return aliases;
|
|
42
44
|
}
|
|
43
45
|
catch (error) {
|
|
44
|
-
console.warn("[Deesse] ⚠️ Failed to
|
|
46
|
+
console.warn("[Deesse] ⚠️ Failed to load aliases from tsconfig.json", error);
|
|
45
47
|
return {};
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
|
-
//
|
|
50
|
+
// --- Initialisation ---
|
|
51
|
+
// 1. Récupération des alias (ex: { "@": "C:/.../src" })
|
|
49
52
|
const aliases = getTsConfigAliases(PROJECT_ROOT);
|
|
50
|
-
// 2.
|
|
53
|
+
// 2. Initialisation de l'instance principale de Jiti avec les alias
|
|
51
54
|
const jiti = (0, jiti_1.createJiti)(PROJECT_ROOT, {
|
|
52
55
|
interopDefault: true,
|
|
53
56
|
requireCache: false,
|
|
54
|
-
alias: aliases, //
|
|
57
|
+
alias: aliases, // Injection des alias pour que "@/collections/posts" fonctionne
|
|
55
58
|
});
|
|
56
59
|
async function runGenerator() {
|
|
57
60
|
try {
|
|
58
61
|
if (!fs_1.default.existsSync(CONFIG_PATH)) {
|
|
59
62
|
return;
|
|
60
63
|
}
|
|
61
|
-
// Importation de la config
|
|
64
|
+
// Importation de la config utilisateur
|
|
65
|
+
// Grâce à l'étape précédente, les imports avec "@/" fonctionnent maintenant
|
|
62
66
|
const mod = await jiti.import(CONFIG_PATH);
|
|
63
67
|
const dbInstance = mod.db || mod.default;
|
|
64
68
|
if (!dbInstance || !dbInstance._config) {
|
|
65
69
|
return;
|
|
66
70
|
}
|
|
67
71
|
const collections = dbInstance._config.collections;
|
|
68
|
-
// Génération
|
|
72
|
+
// Génération du schéma
|
|
69
73
|
(0, generate_1.generateShadowSchema)(collections);
|
|
70
|
-
// Feedback visuel discret (optionnel)
|
|
71
|
-
// console.log("[Deesse] Schema synced");
|
|
72
74
|
}
|
|
73
75
|
catch (error) {
|
|
76
|
+
// On log l'erreur proprement pour le debugging
|
|
74
77
|
console.error("[Deesse] ❌ Worker Error:", error);
|
|
75
78
|
}
|
|
76
79
|
}
|
|
77
|
-
// ---
|
|
80
|
+
// --- Exécution ---
|
|
78
81
|
runGenerator();
|
|
79
82
|
console.log(`[Deesse] 👀 Watching collections...`);
|
|
80
83
|
const watcher = chokidar_1.default.watch([CONFIG_PATH, COLLECTIONS_DIR], {
|