@deessejs/collections 0.0.49 → 0.0.51

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.
@@ -1,4 +1,2 @@
1
1
  import { Config } from "./types";
2
- export declare const defineConfig: (config: Config) => import("drizzle-orm/node-postgres").NodePgDatabase<Record<string, never>> & {
3
- $client: import("pg").Pool;
4
- };
2
+ export declare const defineConfig: (config: Config) => any;
@@ -1,19 +1,45 @@
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 pour charger le schéma généré sans faire planter le build
10
+ const loadGeneratedSchema = () => {
11
+ try {
12
+ // 1. Essai via l'alias Webpack/Turbopack (Client/Server Next.js)
13
+ return require("@deesse/schema");
14
+ }
15
+ catch (e) {
16
+ try {
17
+ // 2. Essai via chemin système (Scripts/Worker)
18
+ return require(path_1.default.join(process.cwd(), ".deesse", "shadow", "schema.ts"));
19
+ }
20
+ catch (e2) {
21
+ // 3. Pas encore généré (Premier boot)
22
+ return {};
23
+ }
24
+ }
25
+ };
6
26
  const defineConfig = (config) => {
7
- const db = (0, node_postgres_1.drizzle)(config.databaseUrl);
8
- // Attacher la config cachée pour que le worker puisse la lire
9
- // sans avoir besoin de parser l'AST manuellement
27
+ // Charger le schéma dynamiquement
28
+ const schema = loadGeneratedSchema();
29
+ // Initialiser Drizzle avec le schéma
30
+ const db = (0, node_postgres_1.drizzle)(config.databaseUrl, {
31
+ schema,
32
+ // logger: true // Décommentez pour debug
33
+ });
34
+ // Attacher la config brute pour que le Worker puisse la lire via Jiti
10
35
  Object.defineProperty(db, '_config', {
11
36
  value: config,
12
- enumerable: false, // Pour ne pas polluer les logs de console.log(db)
37
+ enumerable: false,
13
38
  writable: false
14
39
  });
15
- // Optionnel : Génération initiale synchrone si on veut bloquer le démarrage
16
- // generateShadowSchema(config.collections);
40
+ // On retourne "any" ici au niveau du runtime de la lib.
41
+ // La vraie magie se passe dans .deesse/types.d.ts qui surcharge ce type
42
+ // pour l'utilisateur final.
17
43
  return db;
18
44
  };
19
45
  exports.defineConfig = defineConfig;
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.generateShadowSchema = void 0;
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
- const _1 = require(".");
9
+ const _1 = require("."); // Assurez-vous que cet import est correct dans votre structure
10
10
  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) => {
@@ -14,9 +14,10 @@ const generateShadowSchema = (collections) => {
14
14
  const tablesCode = collections.map((col) => {
15
15
  const columns = Object.entries(col.fields)
16
16
  .map(([name, field]) => {
17
+ // @ts-ignore - TODO: typer proprement l'accès au DSL
17
18
  const kind = field.type.dsl.kind;
18
19
  const drizzleType = Object.keys(_1.DrizzleTypes).includes(kind)
19
- ? `p.${kind}()`
20
+ ? `p.${kind}()` // TODO: Ajouter params (ex: varchar(255))
20
21
  : `p.text()`;
21
22
  return ` ${name}: ${drizzleType},`;
22
23
  })
@@ -26,12 +27,23 @@ export const ${col.slug} = p.pgTable("${col.slug}", {
26
27
  ${columns}
27
28
  });`;
28
29
  });
30
+ // On prépare la section relations (vide pour l'instant, mais requise pour db.query)
31
+ // On liste les tables dans l'objet relations
32
+ const tableNames = collections.map(c => c.slug).join(", ");
29
33
  const schemaFileContent = `
30
34
  import * as p from "drizzle-orm/pg-core";
35
+ import { relations } from "drizzle-orm";
31
36
 
37
+ // --- Tables Generated ---
32
38
  ${tablesCode.join("\n")}
39
+
40
+ // --- Relations Placeholder ---
41
+ // Nécessaire pour que db.query fonctionne, même vide
42
+ export const schemaRelations = relations({ ${tableNames} }, (helpers) => ({
43
+ // TODO: Implémenter la logique de relations basée sur les champs de collection
44
+ }));
33
45
  `;
34
46
  fs_1.default.writeFileSync(SCHEMA_PATH, schemaFileContent);
35
- console.log("[Deesse] Shadow schema generated at", SCHEMA_PATH);
47
+ // console.log("[Deesse] Schema generated at", SCHEMA_PATH);
36
48
  };
37
49
  exports.generateShadowSchema = generateShadowSchema;
@@ -9,12 +9,12 @@ const constants_1 = require("next/constants");
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const withCollections = (phase, config) => {
11
11
  const isDev = phase === constants_1.PHASE_DEVELOPMENT_SERVER;
12
- // 1. Lancer le worker en arrière-plan (votre code actuel)
12
+ // 1. Lancement du Worker
13
13
  if (isDev && !global.__collections_worker_started) {
14
14
  global.__collections_worker_started = true;
15
- // Assurez-vous que ce chemin pointe vers le JS compilé de votre lib
16
- const workerPath = path_1.default.resolve(__dirname, "../worker/index.js");
17
- console.log("[Deesse] Spawning background worker:", workerPath);
15
+ // Chemin vers le fichier JS compilé du worker dans node_modules
16
+ const workerPath = path_1.default.join(__dirname, "../worker/index.js");
17
+ console.log("[Deesse] Spawning background worker");
18
18
  (0, child_process_1.spawn)("node", [workerPath], {
19
19
  stdio: "inherit",
20
20
  env: { ...process.env },
@@ -24,34 +24,31 @@ const withCollections = (phase, config) => {
24
24
  const shadowSchemaPath = path_1.default.join(process.cwd(), ".deesse", "shadow", "schema.ts");
25
25
  return {
26
26
  ...config,
27
- // 2. Configuration pour Turbopack (Next.js 16+)
27
+ // 2. Config Turbopack (Next 16+)
28
28
  turbopack: {
29
29
  ...(config.turbopack || {}),
30
30
  resolveAlias: {
31
31
  ...(config.turbopack?.resolveAlias || {}),
32
- // Création de l'alias pour Turbopack
33
32
  "@deesse/schema": shadowSchemaPath,
34
33
  },
35
34
  },
36
- // 3. Configuration pour Webpack (Next.js < 16 ou --webpack)
35
+ // 3. Config Webpack (Next <16 ou fallback)
37
36
  webpack: (webpackConfig, options) => {
38
- // Appliquer la config utilisateur existante s'il y en a une
39
37
  if (typeof config.webpack === "function") {
40
38
  webpackConfig = config.webpack(webpackConfig, options);
41
39
  }
42
- // Création de l'alias pour Webpack
40
+ // Alias pour que require("@deesse/schema") fonctionne dans defineConfig
43
41
  webpackConfig.resolve.alias["@deesse/schema"] = shadowSchemaPath;
44
42
  return webpackConfig;
45
43
  },
46
- // 4. Empêcher le bundling des paquets serveur (Drizzle, PG, etc.)
47
- // C'est crucial pour éviter les erreurs de compilation côté Next
44
+ // 4. Empêcher le bundling des dépendances serveur
48
45
  serverExternalPackages: [
49
46
  ...(config.serverExternalPackages || []),
50
47
  "drizzle-orm",
51
48
  "drizzle-kit",
52
49
  "pg",
53
- "jiti", // Important pour que Jiti ne soit pas bundlé si utilisé côté serveur
54
- "@deessejs/collections", // Votre lib
50
+ "jiti",
51
+ "@deessejs/collections",
55
52
  ],
56
53
  };
57
54
  };
@@ -11,22 +11,17 @@ const generate_1 = require("../drizzle/generate");
11
11
  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
+ const DEESSE_DIR = path_1.default.join(PROJECT_ROOT, ".deesse");
15
+ const TYPES_PATH = path_1.default.join(DEESSE_DIR, "types.d.ts");
14
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
+ * Charge les alias depuis tsconfig.json pour que jiti puisse résoudre "@/..."
18
18
  */
19
19
  function getTsConfigAliases(root) {
20
20
  const tsConfigPath = path_1.default.join(root, "tsconfig.json");
21
- if (!fs_1.default.existsSync(tsConfigPath)) {
21
+ if (!fs_1.default.existsSync(tsConfigPath))
22
22
  return {};
23
- }
24
23
  try {
25
- // 1. On crée une instance temporaire de Jiti juste pour lire la config
26
24
  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
25
  const loaded = tempJiti(tsConfigPath);
31
26
  const tsConfig = loaded.default || loaded;
32
27
  const paths = tsConfig?.compilerOptions?.paths;
@@ -35,7 +30,6 @@ function getTsConfigAliases(root) {
35
30
  const aliases = {};
36
31
  for (const [key, values] of Object.entries(paths)) {
37
32
  const value = Array.isArray(values) ? values[0] : values;
38
- // Conversion: "@/*" -> "src/*" ===> "@" -> "/abs/path/to/src"
39
33
  const aliasKey = key.replace("/*", "");
40
34
  const aliasValue = String(value).replace("/*", "");
41
35
  aliases[aliasKey] = path_1.default.resolve(root, aliasValue);
@@ -47,37 +41,55 @@ function getTsConfigAliases(root) {
47
41
  return {};
48
42
  }
49
43
  }
50
- // --- Initialisation ---
51
- // 1. Récupération des alias (ex: { "@": "C:/.../src" })
44
+ /**
45
+ * Génère le fichier de définition de types (.d.ts) pour surcharger defineConfig
46
+ */
47
+ function generateTypeDefinitions() {
48
+ // On s'assure que le dossier existe
49
+ if (!fs_1.default.existsSync(DEESSE_DIR)) {
50
+ fs_1.default.mkdirSync(DEESSE_DIR, { recursive: true });
51
+ }
52
+ const typeDefContent = `
53
+ // Ce fichier est généré automatiquement par Deesse.
54
+ // Il permet d'avoir le typage strict sur db.query.*
55
+
56
+ import type * as Schema from "./shadow/schema";
57
+ import type { NodePgDatabase } from "drizzle-orm/node-postgres";
58
+ import type { Config } from "@deessejs/collections";
59
+
60
+ declare module "@deessejs/collections" {
61
+ export function defineConfig(config: Config): NodePgDatabase<typeof Schema> & { _config: Config };
62
+ }
63
+ `;
64
+ fs_1.default.writeFileSync(TYPES_PATH, typeDefContent);
65
+ }
66
+ // Initialisation Jiti
52
67
  const aliases = getTsConfigAliases(PROJECT_ROOT);
53
- // 2. Initialisation de l'instance principale de Jiti avec les alias
54
68
  const jiti = (0, jiti_1.createJiti)(PROJECT_ROOT, {
55
69
  interopDefault: true,
56
70
  requireCache: false,
57
- alias: aliases, // Injection des alias pour que "@/collections/posts" fonctionne
71
+ alias: aliases,
58
72
  });
59
73
  async function runGenerator() {
60
74
  try {
61
- if (!fs_1.default.existsSync(CONFIG_PATH)) {
75
+ if (!fs_1.default.existsSync(CONFIG_PATH))
62
76
  return;
63
- }
64
- // Importation de la config utilisateur
65
- // Grâce à l'étape précédente, les imports avec "@/" fonctionnent maintenant
77
+ // Charger la config utilisateur
66
78
  const mod = await jiti.import(CONFIG_PATH);
67
79
  const dbInstance = mod.db || mod.default;
68
- if (!dbInstance || !dbInstance._config) {
80
+ if (!dbInstance || !dbInstance._config)
69
81
  return;
70
- }
71
82
  const collections = dbInstance._config.collections;
72
- // Génération du schéma
83
+ // 1. Générer le schéma Drizzle (schema.ts)
73
84
  (0, generate_1.generateShadowSchema)(collections);
85
+ // 2. Générer les définitions TypeScript (types.d.ts)
86
+ generateTypeDefinitions();
74
87
  }
75
88
  catch (error) {
76
- // On log l'erreur proprement pour le debugging
77
89
  console.error("[Deesse] ❌ Worker Error:", error);
78
90
  }
79
91
  }
80
- // --- Exécution ---
92
+ // Lancement
81
93
  runGenerator();
82
94
  console.log(`[Deesse] 👀 Watching collections...`);
83
95
  const watcher = chokidar_1.default.watch([CONFIG_PATH, COLLECTIONS_DIR], {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deessejs/collections",
3
- "version": "0.0.49",
3
+ "version": "0.0.51",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",