@deessejs/collections 0.0.50 → 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,3 +1,2 @@
1
- import { drizzle } from "drizzle-orm/node-postgres";
2
1
  import { Config } from "./types";
3
- export declare const defineConfig: (config: Config) => ReturnType<typeof drizzle<any>>;
2
+ export declare const defineConfig: (config: Config) => any;
@@ -6,46 +6,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.defineConfig = void 0;
7
7
  const node_postgres_1 = require("drizzle-orm/node-postgres");
8
8
  const path_1 = __importDefault(require("path"));
9
- // Fonction utilitaire pour charger le schéma de manière "lazy"
9
+ // Fonction pour charger le schéma généré sans faire planter le build
10
10
  const loadGeneratedSchema = () => {
11
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à.
12
+ // 1. Essai via l'alias Webpack/Turbopack (Client/Server Next.js)
15
13
  return require("@deesse/schema");
16
14
  }
17
15
  catch (e) {
18
16
  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);
17
+ // 2. Essai via chemin système (Scripts/Worker)
18
+ return require(path_1.default.join(process.cwd(), ".deesse", "shadow", "schema.ts"));
25
19
  }
26
20
  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.");
21
+ // 3. Pas encore généré (Premier boot)
29
22
  return {};
30
23
  }
31
24
  }
32
25
  };
33
26
  const defineConfig = (config) => {
34
- // 1. Charger le schéma généré
27
+ // Charger le schéma dynamiquement
35
28
  const schema = loadGeneratedSchema();
36
- // 2. Initialiser Drizzle AVEC le schéma
29
+ // Initialiser Drizzle avec le schéma
37
30
  const db = (0, node_postgres_1.drizzle)(config.databaseUrl, {
38
31
  schema,
39
- // logger: true // utile pour debug
32
+ // logger: true // Décommentez pour debug
40
33
  });
41
- // 3. Attacher la config pour le worker (votre code existant)
34
+ // Attacher la config brute pour que le Worker puisse la lire via Jiti
42
35
  Object.defineProperty(db, '_config', {
43
36
  value: config,
44
37
  enumerable: false,
45
38
  writable: false
46
39
  });
47
- // 4. On caste le retour pour faire croire à TS qu'on a le bon typage
48
- // (Voir section Typage ci-dessous)
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.
49
43
  return db;
50
44
  };
51
45
  exports.defineConfig = defineConfig;
@@ -6,19 +6,18 @@ 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) => {
13
13
  fs_1.default.mkdirSync(SHADOW_DIR, { recursive: true });
14
- // 1. Générer le code des tables
15
14
  const tablesCode = collections.map((col) => {
16
15
  const columns = Object.entries(col.fields)
17
16
  .map(([name, field]) => {
17
+ // @ts-ignore - TODO: typer proprement l'accès au DSL
18
18
  const kind = field.type.dsl.kind;
19
19
  const drizzleType = Object.keys(_1.DrizzleTypes).includes(kind)
20
- // @ts-ignore
21
- ? `p.${kind}()` // TODO: gérer les params (varchar(255), etc.)
20
+ ? `p.${kind}()` // TODO: Ajouter params (ex: varchar(255))
22
21
  : `p.text()`;
23
22
  return ` ${name}: ${drizzleType},`;
24
23
  })
@@ -28,29 +27,23 @@ export const ${col.slug} = p.pgTable("${col.slug}", {
28
27
  ${columns}
29
28
  });`;
30
29
  });
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
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(", ");
42
33
  const schemaFileContent = `
43
34
  import * as p from "drizzle-orm/pg-core";
44
35
  import { relations } from "drizzle-orm";
45
36
 
46
- // --- Tables ---
37
+ // --- Tables Generated ---
47
38
  ${tablesCode.join("\n")}
48
39
 
49
- // --- Relations ---
50
- // (Note: Pour l'instant on ne génère pas de relations complexes automatiquement,
51
- // mais on prépare le terrain)
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
+ }));
52
45
  `;
53
46
  fs_1.default.writeFileSync(SCHEMA_PATH, schemaFileContent);
54
- console.log("[Deesse] ✅ Shadow schema generated at", SCHEMA_PATH);
47
+ // console.log("[Deesse] ✅ Schema generated at", SCHEMA_PATH);
55
48
  };
56
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.50",
3
+ "version": "0.0.51",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",