@deessejs/collections 0.0.50 → 0.1.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.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -0
  3. package/dist/index.js +868 -22
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +821 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +66 -72
  8. package/dist/collections/define.d.ts +0 -43
  9. package/dist/collections/define.js +0 -13
  10. package/dist/collections/extend-fields.d.ts +0 -3
  11. package/dist/collections/extend-fields.js +0 -13
  12. package/dist/collections/index.d.ts +0 -1
  13. package/dist/collections/index.js +0 -17
  14. package/dist/collections/types.d.ts +0 -29
  15. package/dist/collections/types.js +0 -2
  16. package/dist/config/index.d.ts +0 -3
  17. package/dist/config/index.js +0 -51
  18. package/dist/config/orchestrator.d.ts +0 -8
  19. package/dist/config/orchestrator.js +0 -70
  20. package/dist/config/types.d.ts +0 -14
  21. package/dist/config/types.js +0 -2
  22. package/dist/database/types.d.ts +0 -10
  23. package/dist/database/types.js +0 -2
  24. package/dist/drizzle/generate.d.ts +0 -2
  25. package/dist/drizzle/generate.js +0 -56
  26. package/dist/drizzle/index.d.ts +0 -31
  27. package/dist/drizzle/index.js +0 -24
  28. package/dist/drizzle/types.js +0 -1
  29. package/dist/dsl/collections.d.ts +0 -13
  30. package/dist/dsl/collections.js +0 -14
  31. package/dist/dsl/index.d.ts +0 -1
  32. package/dist/dsl/index.js +0 -17
  33. package/dist/dsl/types.d.ts +0 -1
  34. package/dist/dsl/types.js +0 -2
  35. package/dist/esm/collections/define.d.ts +0 -43
  36. package/dist/esm/collections/define.js +0 -9
  37. package/dist/esm/collections/extend-fields.d.ts +0 -3
  38. package/dist/esm/collections/extend-fields.js +0 -9
  39. package/dist/esm/collections/index.d.ts +0 -1
  40. package/dist/esm/collections/index.js +0 -1
  41. package/dist/esm/collections/types.d.ts +0 -29
  42. package/dist/esm/collections/types.js +0 -1
  43. package/dist/esm/config/index.d.ts +0 -5
  44. package/dist/esm/config/index.js +0 -13
  45. package/dist/esm/config/orchestrator.d.ts +0 -8
  46. package/dist/esm/config/orchestrator.js +0 -66
  47. package/dist/esm/config/types.d.ts +0 -14
  48. package/dist/esm/config/types.js +0 -1
  49. package/dist/esm/database/types.d.ts +0 -10
  50. package/dist/esm/database/types.js +0 -1
  51. package/dist/esm/drizzle/generate.d.ts +0 -2
  52. package/dist/esm/drizzle/generate.js +0 -30
  53. package/dist/esm/drizzle/index.d.ts +0 -31
  54. package/dist/esm/drizzle/index.js +0 -20
  55. package/dist/esm/drizzle/types.d.ts +0 -0
  56. package/dist/esm/drizzle/types.js +0 -1
  57. package/dist/esm/dsl/collections.d.ts +0 -13
  58. package/dist/esm/dsl/collections.js +0 -10
  59. package/dist/esm/dsl/index.d.ts +0 -1
  60. package/dist/esm/dsl/index.js +0 -1
  61. package/dist/esm/fields/constraints.d.ts +0 -6
  62. package/dist/esm/fields/constraints.js +0 -59
  63. package/dist/esm/fields/core.d.ts +0 -71
  64. package/dist/esm/fields/core.js +0 -27
  65. package/dist/esm/fields/field.d.ts +0 -24
  66. package/dist/esm/fields/field.js +0 -33
  67. package/dist/esm/fields/index.d.ts +0 -4
  68. package/dist/esm/fields/index.js +0 -4
  69. package/dist/esm/fields/types.d.ts +0 -48
  70. package/dist/esm/fields/types.js +0 -1
  71. package/dist/esm/index.d.ts +0 -8
  72. package/dist/esm/index.js +0 -8
  73. package/dist/esm/next/index.d.ts +0 -5
  74. package/dist/esm/next/index.js +0 -17
  75. package/dist/esm/plugins/index.d.ts +0 -2
  76. package/dist/esm/plugins/index.js +0 -3
  77. package/dist/esm/plugins/types.d.ts +0 -1
  78. package/dist/esm/plugins/types.js +0 -1
  79. package/dist/esm/providers/index.d.ts +0 -2
  80. package/dist/esm/providers/index.js +0 -53
  81. package/dist/esm/providers/types.d.ts +0 -8
  82. package/dist/esm/providers/types.js +0 -1
  83. package/dist/esm/utils/deep-partial.d.ts +0 -3
  84. package/dist/esm/utils/deep-partial.js +0 -1
  85. package/dist/esm/utils/exact.d.ts +0 -1
  86. package/dist/esm/utils/exact.js +0 -1
  87. package/dist/esm/utils/union-intersection.d.ts +0 -1
  88. package/dist/esm/utils/union-intersection.js +0 -1
  89. package/dist/esm/worker/index.d.ts +0 -2
  90. package/dist/esm/worker/index.js +0 -32
  91. package/dist/fields/constraints.d.ts +0 -6
  92. package/dist/fields/constraints.js +0 -67
  93. package/dist/fields/core.d.ts +0 -71
  94. package/dist/fields/core.js +0 -33
  95. package/dist/fields/field.d.ts +0 -24
  96. package/dist/fields/field.js +0 -38
  97. package/dist/fields/index.d.ts +0 -4
  98. package/dist/fields/index.js +0 -20
  99. package/dist/fields/types.d.ts +0 -48
  100. package/dist/fields/types.js +0 -2
  101. package/dist/index.d.ts +0 -8
  102. package/dist/next/index.d.ts +0 -5
  103. package/dist/next/index.js +0 -58
  104. package/dist/plugins/index.d.ts +0 -2
  105. package/dist/plugins/index.js +0 -7
  106. package/dist/plugins/types.d.ts +0 -1
  107. package/dist/plugins/types.js +0 -2
  108. package/dist/providers/index.d.ts +0 -2
  109. package/dist/providers/index.js +0 -57
  110. package/dist/providers/types.d.ts +0 -8
  111. package/dist/providers/types.js +0 -2
  112. package/dist/utils/deep-partial.d.ts +0 -3
  113. package/dist/utils/deep-partial.js +0 -2
  114. package/dist/utils/exact.d.ts +0 -1
  115. package/dist/utils/exact.js +0 -1
  116. package/dist/utils/union-intersection.d.ts +0 -1
  117. package/dist/utils/union-intersection.js +0 -2
  118. package/dist/worker/index.d.ts +0 -1
  119. package/dist/worker/index.js +0 -89
  120. /package/{dist/drizzle/types.d.ts → public/.gitkeep} +0 -0
@@ -1,20 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
- };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./field"), exports);
18
- __exportStar(require("./types"), exports);
19
- __exportStar(require("./core"), exports);
20
- __exportStar(require("./constraints"), exports);
@@ -1,48 +0,0 @@
1
- import { z } from "zod";
2
- export type FieldKind = "integer" | "serial" | "boolean" | "text" | "varchar" | "char" | "numeric" | "decimal" | "json" | "uuid" | "timestamp";
3
- export type FieldTypeConfig<TParams extends z.ZodType = z.ZodType> = {
4
- schema?: TParams;
5
- dsl: {
6
- kind: FieldKind;
7
- };
8
- admin: {
9
- component: any;
10
- };
11
- };
12
- export type FieldTypeFinal<TParams extends z.ZodType = z.ZodType, TOutput = any> = {
13
- kind: string;
14
- params: z.infer<TParams>;
15
- dsl: {
16
- kind: string;
17
- isPrimary: boolean;
18
- isUnique: boolean;
19
- canBeNull: boolean;
20
- };
21
- admin: {
22
- component: any;
23
- };
24
- _output?: TOutput;
25
- };
26
- export type FieldPermissions = {
27
- create: (ctx: any) => Promise<boolean>;
28
- read: (ctx: any) => Promise<boolean>;
29
- update: (ctx: any) => Promise<boolean>;
30
- delete: (ctx: any) => Promise<boolean>;
31
- };
32
- export type FieldConfig<TType extends FieldTypeFinal> = {
33
- type: TType;
34
- permissions?: Partial<FieldPermissions>;
35
- };
36
- export type Field<TType extends FieldTypeFinal = FieldTypeFinal> = {
37
- type: TType;
38
- permissions: FieldPermissions;
39
- };
40
- export type InferSchema<F extends Record<string, Field>> = {
41
- [K in keyof F]: F[K] extends Field<infer FT> ? FT extends FieldTypeFinal<any, infer TVal> ? TVal : never : never;
42
- };
43
- export type FieldChain<TType extends FieldTypeFinal> = Field<TType> & {
44
- unique(): FieldChain<TType>;
45
- required(): FieldChain<TType>;
46
- optional(): FieldChain<TType>;
47
- primary(): FieldChain<TType>;
48
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
package/dist/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export * from "./collections";
2
- export * from "./config";
3
- export * from "./drizzle";
4
- export * from "./dsl";
5
- export * from "./fields";
6
- export * from "./next";
7
- export * from "./plugins";
8
- export * from "./providers";
@@ -1,5 +0,0 @@
1
- import type { NextConfig } from "next";
2
- declare global {
3
- var __collections_worker_started: boolean | undefined;
4
- }
5
- export declare const withCollections: (phase: string, config: NextConfig) => NextConfig;
@@ -1,58 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.withCollections = void 0;
7
- const child_process_1 = require("child_process");
8
- const constants_1 = require("next/constants");
9
- const path_1 = __importDefault(require("path"));
10
- const withCollections = (phase, config) => {
11
- const isDev = phase === constants_1.PHASE_DEVELOPMENT_SERVER;
12
- // 1. Lancer le worker en arrière-plan (votre code actuel)
13
- if (isDev && !global.__collections_worker_started) {
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);
18
- (0, child_process_1.spawn)("node", [workerPath], {
19
- stdio: "inherit",
20
- env: { ...process.env },
21
- });
22
- }
23
- // Chemin absolu vers le schéma généré
24
- const shadowSchemaPath = path_1.default.join(process.cwd(), ".deesse", "shadow", "schema.ts");
25
- return {
26
- ...config,
27
- // 2. Configuration pour Turbopack (Next.js 16+)
28
- turbopack: {
29
- ...(config.turbopack || {}),
30
- resolveAlias: {
31
- ...(config.turbopack?.resolveAlias || {}),
32
- // Création de l'alias pour Turbopack
33
- "@deesse/schema": shadowSchemaPath,
34
- },
35
- },
36
- // 3. Configuration pour Webpack (Next.js < 16 ou --webpack)
37
- webpack: (webpackConfig, options) => {
38
- // Appliquer la config utilisateur existante s'il y en a une
39
- if (typeof config.webpack === "function") {
40
- webpackConfig = config.webpack(webpackConfig, options);
41
- }
42
- // Création de l'alias pour Webpack
43
- webpackConfig.resolve.alias["@deesse/schema"] = shadowSchemaPath;
44
- return webpackConfig;
45
- },
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
48
- serverExternalPackages: [
49
- ...(config.serverExternalPackages || []),
50
- "drizzle-orm",
51
- "drizzle-kit",
52
- "pg",
53
- "jiti", // Important pour que Jiti ne soit pas bundlé si utilisé côté serveur
54
- "@deessejs/collections", // Votre lib
55
- ],
56
- };
57
- };
58
- exports.withCollections = withCollections;
@@ -1,2 +0,0 @@
1
- import { Plugin } from "./types";
2
- export declare const plugin: () => Plugin;
@@ -1,7 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.plugin = void 0;
4
- const plugin = () => {
5
- return {};
6
- };
7
- exports.plugin = plugin;
@@ -1 +0,0 @@
1
- export type Plugin = {};
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +0,0 @@
1
- import { Provider } from "./types";
2
- export declare const inAppProvider: () => Provider;
@@ -1,57 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.inAppProvider = void 0;
4
- const inAppProvider = () => {
5
- // Stockage en mémoire : { "posts": { "id_1": { ...data }, "id_2": { ...data } } }
6
- const storage = {};
7
- return {
8
- // L'init reçoit maintenant la liste des collections pour préparer le "schéma"
9
- init: (collections) => {
10
- console.log("Initializing in-app provider");
11
- for (const col of collections) {
12
- // On initialise un "bucket" vide pour chaque collection si pas déjà fait
13
- if (!storage[col.slug]) {
14
- storage[col.slug] = {};
15
- }
16
- }
17
- },
18
- create: async (collectionSlug, data) => {
19
- // Simulation d'un ID (dans une vraie DB, c'est géré par le moteur ou UUID)
20
- const id = Math.random().toString(36).substring(2, 15);
21
- const record = { ...data, id };
22
- // Sécurité au cas où on écrit dans une collection non initialisée
23
- if (!storage[collectionSlug])
24
- storage[collectionSlug] = {};
25
- storage[collectionSlug][id] = record;
26
- return record;
27
- },
28
- read: async (collectionSlug, id) => {
29
- const record = storage[collectionSlug]?.[id];
30
- if (!record) {
31
- throw new Error(`Record with ID "${id}" not found in "${collectionSlug}".`);
32
- }
33
- return record;
34
- },
35
- update: async (collectionSlug, id, data) => {
36
- const existing = storage[collectionSlug]?.[id];
37
- if (!existing) {
38
- throw new Error(`Cannot update: Record with ID "${id}" not found in "${collectionSlug}".`);
39
- }
40
- // Fusion des données (Partial update)
41
- const updated = { ...existing, ...data };
42
- storage[collectionSlug][id] = updated;
43
- return updated;
44
- },
45
- delete: async (collectionSlug, id) => {
46
- if (storage[collectionSlug] && storage[collectionSlug][id]) {
47
- delete storage[collectionSlug][id];
48
- }
49
- else {
50
- // Optionnel : Throw une erreur si l'item n'existe pas,
51
- // ou juste ignorer comme le ferait une requête SQL "DELETE WHERE ID=..."
52
- console.warn(`Attempted to delete non-existent record "${id}" in "${collectionSlug}"`);
53
- }
54
- }
55
- };
56
- };
57
- exports.inAppProvider = inAppProvider;
@@ -1,8 +0,0 @@
1
- import { Collection } from "../collections/types";
2
- export type Provider = {
3
- init: (collections: readonly Collection[]) => Promise<void> | void;
4
- create: (collectionSlug: string, data: any) => Promise<any>;
5
- read: (collectionSlug: string, id: string) => Promise<any>;
6
- update: (collectionSlug: string, id: string, data: any) => Promise<any>;
7
- delete: (collectionSlug: string, id: string) => Promise<void>;
8
- };
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +0,0 @@
1
- export type DeepPartial<T> = T extends (infer U)[] ? DeepPartial<U>[] : T extends object ? {
2
- [K in keyof T]?: DeepPartial<T[K]>;
3
- } : T;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +0,0 @@
1
- type Exact<A, B> = A extends B ? Exclude<keyof A, keyof B> extends never ? A : never : never;
@@ -1 +0,0 @@
1
- "use strict";
@@ -1 +0,0 @@
1
- export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +0,0 @@
1
- export {};
@@ -1,89 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const jiti_1 = require("jiti");
7
- const path_1 = __importDefault(require("path"));
8
- const chokidar_1 = __importDefault(require("chokidar"));
9
- const fs_1 = __importDefault(require("fs"));
10
- const generate_1 = require("../drizzle/generate");
11
- const PROJECT_ROOT = process.cwd();
12
- const CONFIG_PATH = path_1.default.join(PROJECT_ROOT, "src", "api", "index.ts");
13
- const COLLECTIONS_DIR = path_1.default.join(PROJECT_ROOT, "src", "collections");
14
- /**
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.
18
- */
19
- function getTsConfigAliases(root) {
20
- const tsConfigPath = path_1.default.join(root, "tsconfig.json");
21
- if (!fs_1.default.existsSync(tsConfigPath)) {
22
- return {};
23
- }
24
- try {
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;
32
- const paths = tsConfig?.compilerOptions?.paths;
33
- if (!paths)
34
- return {};
35
- const aliases = {};
36
- for (const [key, values] of Object.entries(paths)) {
37
- const value = Array.isArray(values) ? values[0] : values;
38
- // Conversion: "@/*" -> "src/*" ===> "@" -> "/abs/path/to/src"
39
- const aliasKey = key.replace("/*", "");
40
- const aliasValue = String(value).replace("/*", "");
41
- aliases[aliasKey] = path_1.default.resolve(root, aliasValue);
42
- }
43
- return aliases;
44
- }
45
- catch (error) {
46
- console.warn("[Deesse] ⚠️ Failed to load aliases from tsconfig.json", error);
47
- return {};
48
- }
49
- }
50
- // --- Initialisation ---
51
- // 1. Récupération des alias (ex: { "@": "C:/.../src" })
52
- const aliases = getTsConfigAliases(PROJECT_ROOT);
53
- // 2. Initialisation de l'instance principale de Jiti avec les alias
54
- const jiti = (0, jiti_1.createJiti)(PROJECT_ROOT, {
55
- interopDefault: true,
56
- requireCache: false,
57
- alias: aliases, // Injection des alias pour que "@/collections/posts" fonctionne
58
- });
59
- async function runGenerator() {
60
- try {
61
- if (!fs_1.default.existsSync(CONFIG_PATH)) {
62
- return;
63
- }
64
- // Importation de la config utilisateur
65
- // Grâce à l'étape précédente, les imports avec "@/" fonctionnent maintenant
66
- const mod = await jiti.import(CONFIG_PATH);
67
- const dbInstance = mod.db || mod.default;
68
- if (!dbInstance || !dbInstance._config) {
69
- return;
70
- }
71
- const collections = dbInstance._config.collections;
72
- // Génération du schéma
73
- (0, generate_1.generateShadowSchema)(collections);
74
- }
75
- catch (error) {
76
- // On log l'erreur proprement pour le debugging
77
- console.error("[Deesse] ❌ Worker Error:", error);
78
- }
79
- }
80
- // --- Exécution ---
81
- runGenerator();
82
- console.log(`[Deesse] 👀 Watching collections...`);
83
- const watcher = chokidar_1.default.watch([CONFIG_PATH, COLLECTIONS_DIR], {
84
- ignoreInitial: true,
85
- ignored: /(^|[\/\\])\../,
86
- });
87
- watcher.on("all", () => {
88
- runGenerator();
89
- });
File without changes