@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.
- package/dist/config/index.d.ts +1 -2
- package/dist/config/index.js +12 -18
- package/dist/drizzle/generate.js +13 -20
- package/dist/next/index.js +10 -13
- package/dist/worker/index.js +35 -23
- package/package.json +1 -1
package/dist/config/index.d.ts
CHANGED
package/dist/config/index.js
CHANGED
|
@@ -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
|
|
9
|
+
// Fonction pour charger le schéma généré sans faire planter le build
|
|
10
10
|
const loadGeneratedSchema = () => {
|
|
11
11
|
try {
|
|
12
|
-
// 1.
|
|
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.
|
|
20
|
-
|
|
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.
|
|
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
|
-
//
|
|
27
|
+
// Charger le schéma dynamiquement
|
|
35
28
|
const schema = loadGeneratedSchema();
|
|
36
|
-
//
|
|
29
|
+
// Initialiser Drizzle avec le schéma
|
|
37
30
|
const db = (0, node_postgres_1.drizzle)(config.databaseUrl, {
|
|
38
31
|
schema,
|
|
39
|
-
// logger: true //
|
|
32
|
+
// logger: true // Décommentez pour debug
|
|
40
33
|
});
|
|
41
|
-
//
|
|
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
|
-
//
|
|
48
|
-
//
|
|
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;
|
package/dist/drizzle/generate.js
CHANGED
|
@@ -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
|
-
//
|
|
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
|
-
//
|
|
32
|
-
//
|
|
33
|
-
const
|
|
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
|
-
//
|
|
51
|
-
|
|
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] ✅
|
|
47
|
+
// console.log("[Deesse] ✅ Schema generated at", SCHEMA_PATH);
|
|
55
48
|
};
|
|
56
49
|
exports.generateShadowSchema = generateShadowSchema;
|
package/dist/next/index.js
CHANGED
|
@@ -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.
|
|
12
|
+
// 1. Lancement du Worker
|
|
13
13
|
if (isDev && !global.__collections_worker_started) {
|
|
14
14
|
global.__collections_worker_started = true;
|
|
15
|
-
//
|
|
16
|
-
const workerPath = path_1.default.
|
|
17
|
-
console.log("[Deesse] Spawning background worker
|
|
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.
|
|
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.
|
|
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
|
-
//
|
|
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
|
|
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",
|
|
54
|
-
"@deessejs/collections",
|
|
50
|
+
"jiti",
|
|
51
|
+
"@deessejs/collections",
|
|
55
52
|
],
|
|
56
53
|
};
|
|
57
54
|
};
|
package/dist/worker/index.js
CHANGED
|
@@ -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
|
-
*
|
|
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
|
-
|
|
51
|
-
|
|
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,
|
|
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
|
-
//
|
|
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
|
-
//
|
|
92
|
+
// Lancement
|
|
81
93
|
runGenerator();
|
|
82
94
|
console.log(`[Deesse] 👀 Watching collections...`);
|
|
83
95
|
const watcher = chokidar_1.default.watch([CONFIG_PATH, COLLECTIONS_DIR], {
|