on-zero 0.1.21 → 0.1.22

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 (54) hide show
  1. package/dist/cjs/cli.cjs +4 -0
  2. package/dist/cjs/cli.js +4 -0
  3. package/dist/cjs/cli.js.map +1 -1
  4. package/dist/cjs/cli.native.js +7 -2
  5. package/dist/cjs/cli.native.js.map +1 -1
  6. package/dist/cjs/helpers/createMutators.cjs +4 -3
  7. package/dist/cjs/helpers/createMutators.js +12 -9
  8. package/dist/cjs/helpers/createMutators.js.map +1 -1
  9. package/dist/cjs/helpers/createMutators.native.js +25 -21
  10. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  11. package/dist/cjs/mutations.cjs +34 -4
  12. package/dist/cjs/mutations.js +29 -4
  13. package/dist/cjs/mutations.js.map +1 -1
  14. package/dist/cjs/mutations.native.js +36 -4
  15. package/dist/cjs/mutations.native.js.map +1 -1
  16. package/dist/cjs/vite-plugin.cjs +168 -0
  17. package/dist/cjs/vite-plugin.js +145 -0
  18. package/dist/cjs/vite-plugin.js.map +6 -0
  19. package/dist/cjs/vite-plugin.native.js +209 -0
  20. package/dist/cjs/vite-plugin.native.js.map +1 -0
  21. package/dist/esm/cli.js +4 -0
  22. package/dist/esm/cli.js.map +1 -1
  23. package/dist/esm/cli.mjs +4 -0
  24. package/dist/esm/cli.mjs.map +1 -1
  25. package/dist/esm/cli.native.js +7 -2
  26. package/dist/esm/cli.native.js.map +1 -1
  27. package/dist/esm/helpers/createMutators.js +12 -9
  28. package/dist/esm/helpers/createMutators.js.map +1 -1
  29. package/dist/esm/helpers/createMutators.mjs +4 -3
  30. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  31. package/dist/esm/helpers/createMutators.native.js +25 -21
  32. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  33. package/dist/esm/mutations.js +29 -4
  34. package/dist/esm/mutations.js.map +1 -1
  35. package/dist/esm/mutations.mjs +34 -4
  36. package/dist/esm/mutations.mjs.map +1 -1
  37. package/dist/esm/mutations.native.js +35 -3
  38. package/dist/esm/mutations.native.js.map +1 -1
  39. package/dist/esm/vite-plugin.js +131 -0
  40. package/dist/esm/vite-plugin.js.map +6 -0
  41. package/dist/esm/vite-plugin.mjs +143 -0
  42. package/dist/esm/vite-plugin.mjs.map +1 -0
  43. package/dist/esm/vite-plugin.native.js +181 -0
  44. package/dist/esm/vite-plugin.native.js.map +1 -0
  45. package/package.json +7 -2
  46. package/readme.md +42 -3
  47. package/src/cli.ts +9 -1
  48. package/src/helpers/createMutators.ts +14 -8
  49. package/src/mutations.ts +57 -4
  50. package/src/vite-plugin.ts +238 -0
  51. package/types/helpers/createMutators.d.ts.map +1 -1
  52. package/types/mutations.d.ts.map +1 -1
  53. package/types/vite-plugin.d.ts +39 -0
  54. package/types/vite-plugin.d.ts.map +1 -0
@@ -0,0 +1,131 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { basename, resolve } from "node:path";
4
+ const hash = (s) => createHash("sha256").update(s).digest("hex");
5
+ let generateCache = {};
6
+ function writeFileIfChanged(filePath, content) {
7
+ const contentHash = hash(content);
8
+ return generateCache[filePath] === contentHash && existsSync(filePath) ? !1 : (writeFileSync(filePath, content, "utf-8"), generateCache[filePath] = contentHash, !0);
9
+ }
10
+ function generateModelsFile(modelFiles) {
11
+ const modelNames = modelFiles.map((f) => basename(f, ".ts")).sort(), getImportName = (name) => name === "user" ? "userPublic" : name, imports = modelNames.map((name) => `import * as ${getImportName(name)} from '../models/${name}'`).join(`
12
+ `), modelsObj = `export const models = {
13
+ ${[...modelNames].sort(
14
+ (a, b) => getImportName(a).localeCompare(getImportName(b))
15
+ ).map((name) => ` ${getImportName(name)},`).join(`
16
+ `)}
17
+ }`;
18
+ return `// auto-generated by on-zero vite plugin
19
+ ${imports}
20
+
21
+ ${modelsObj}
22
+
23
+ if (import.meta.hot) {
24
+ import.meta.hot.accept()
25
+ }
26
+ `;
27
+ }
28
+ function generateTypesFile(modelFiles) {
29
+ const modelNames = modelFiles.map((f) => basename(f, ".ts")).sort(), getSchemaName = (name) => name === "user" ? "userPublic" : name;
30
+ return `import type { TableInsertRow, TableUpdateRow } from 'on-zero'
31
+ import type * as schema from './tables'
32
+
33
+ ${modelNames.map((name) => {
34
+ const pascalName = name.charAt(0).toUpperCase() + name.slice(1), schemaName = getSchemaName(name);
35
+ return `export type ${pascalName} = TableInsertRow<typeof schema.${schemaName}>
36
+ export type ${pascalName}Update = TableUpdateRow<typeof schema.${schemaName}>`;
37
+ }).join(`
38
+
39
+ `)}
40
+ `;
41
+ }
42
+ function generateTablesFile(modelFiles) {
43
+ const modelNames = modelFiles.map((f) => basename(f, ".ts")).sort(), getExportName = (name) => name === "user" ? "userPublic" : name;
44
+ return `// auto-generated by on-zero vite plugin
45
+
46
+ ${modelNames.map((name) => `export { schema as ${getExportName(name)} } from '../models/${name}'`).join(`
47
+ `)}
48
+ `;
49
+ }
50
+ async function runGenerate(options) {
51
+ const { modelsDir, generatedDir, silent } = options;
52
+ existsSync(generatedDir) || mkdirSync(generatedDir, { recursive: !0 });
53
+ const allModelFiles = readdirSync(modelsDir).filter((f) => f.endsWith(".ts")).sort(), filesWithSchema = allModelFiles.filter(
54
+ (f) => readFileSync(resolve(modelsDir, f), "utf-8").includes("export const schema = table(")
55
+ ), filesChanged = [
56
+ writeFileIfChanged(
57
+ resolve(generatedDir, "models.ts"),
58
+ generateModelsFile(allModelFiles)
59
+ ),
60
+ writeFileIfChanged(
61
+ resolve(generatedDir, "types.ts"),
62
+ generateTypesFile(filesWithSchema)
63
+ ),
64
+ writeFileIfChanged(
65
+ resolve(generatedDir, "tables.ts"),
66
+ generateTablesFile(filesWithSchema)
67
+ )
68
+ ].filter(Boolean).length;
69
+ return filesChanged > 0 && !silent && console.info(`[on-zero] generated ${filesChanged} file(s)`), filesChanged;
70
+ }
71
+ function onZeroPlugin(options = {}) {
72
+ const dataDir = options.dataDir || "src/data", hmrPaths = ["/models/", "/generated/", ...options.hmrInclude || []];
73
+ let modelsDir, generatedDir;
74
+ return [
75
+ // generation plugin
76
+ {
77
+ name: "on-zero:generate",
78
+ apply: "serve",
79
+ configResolved(config) {
80
+ modelsDir = resolve(config.root, dataDir, "models"), generatedDir = resolve(config.root, dataDir, "generated");
81
+ },
82
+ async buildStart() {
83
+ options.disableGenerate || await runGenerate({ modelsDir, generatedDir, silent: !1 });
84
+ },
85
+ configureServer(server) {
86
+ options.disableGenerate || (server.watcher.on("change", async (file) => {
87
+ file.includes(modelsDir) && await runGenerate({ modelsDir, generatedDir, silent: !1 });
88
+ }), server.watcher.on("add", async (file) => {
89
+ file.includes(modelsDir) && await runGenerate({ modelsDir, generatedDir, silent: !1 });
90
+ }), server.watcher.on("unlink", async (file) => {
91
+ file.includes(modelsDir) && await runGenerate({ modelsDir, generatedDir, silent: !1 });
92
+ }));
93
+ }
94
+ },
95
+ // HMR plugin - removes invalidate calls to prevent cascade
96
+ {
97
+ name: "on-zero:hmr",
98
+ apply: "serve",
99
+ enforce: "post",
100
+ transform(code, id) {
101
+ if (hmrPaths.some((p) => id.includes(p)) && /\.tsx?$/.test(id) && code.includes("import.meta.hot.invalidate"))
102
+ return {
103
+ code: code.replace(
104
+ /if\s*\(invalidateMessage\)\s*import\.meta\.hot\.invalidate\(invalidateMessage\);?/g,
105
+ "/* on-zero: HMR invalidate disabled */"
106
+ ),
107
+ map: null
108
+ };
109
+ }
110
+ },
111
+ // build plugin - generate once before build
112
+ {
113
+ name: "on-zero:build",
114
+ apply: "build",
115
+ configResolved(config) {
116
+ modelsDir = resolve(config.root, dataDir, "models"), generatedDir = resolve(config.root, dataDir, "generated");
117
+ },
118
+ async buildStart() {
119
+ options.disableGenerate || await runGenerate({ modelsDir, generatedDir, silent: !0 });
120
+ }
121
+ }
122
+ ];
123
+ }
124
+ const onZeroHmrPlugin = (options) => onZeroPlugin({ hmrInclude: options?.include, disableGenerate: !0 })[1];
125
+ var vite_plugin_default = onZeroPlugin;
126
+ export {
127
+ vite_plugin_default as default,
128
+ onZeroHmrPlugin,
129
+ onZeroPlugin
130
+ };
131
+ //# sourceMappingURL=vite-plugin.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/vite-plugin.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,143 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import { basename, resolve } from "node:path";
4
+ const hash = s => createHash("sha256").update(s).digest("hex");
5
+ let generateCache = {};
6
+ function writeFileIfChanged(filePath, content) {
7
+ const contentHash = hash(content);
8
+ return generateCache[filePath] === contentHash && existsSync(filePath) ? !1 : (writeFileSync(filePath, content, "utf-8"), generateCache[filePath] = contentHash, !0);
9
+ }
10
+ function generateModelsFile(modelFiles) {
11
+ const modelNames = modelFiles.map(f => basename(f, ".ts")).sort(),
12
+ getImportName = name => name === "user" ? "userPublic" : name,
13
+ imports = modelNames.map(name => `import * as ${getImportName(name)} from '../models/${name}'`).join(`
14
+ `),
15
+ modelsObj = `export const models = {
16
+ ${[...modelNames].sort((a, b) => getImportName(a).localeCompare(getImportName(b))).map(name => ` ${getImportName(name)},`).join(`
17
+ `)}
18
+ }`;
19
+ return `// auto-generated by on-zero vite plugin
20
+ ${imports}
21
+
22
+ ${modelsObj}
23
+
24
+ if (import.meta.hot) {
25
+ import.meta.hot.accept()
26
+ }
27
+ `;
28
+ }
29
+ function generateTypesFile(modelFiles) {
30
+ const modelNames = modelFiles.map(f => basename(f, ".ts")).sort(),
31
+ getSchemaName = name => name === "user" ? "userPublic" : name;
32
+ return `import type { TableInsertRow, TableUpdateRow } from 'on-zero'
33
+ import type * as schema from './tables'
34
+
35
+ ${modelNames.map(name => {
36
+ const pascalName = name.charAt(0).toUpperCase() + name.slice(1),
37
+ schemaName = getSchemaName(name);
38
+ return `export type ${pascalName} = TableInsertRow<typeof schema.${schemaName}>
39
+ export type ${pascalName}Update = TableUpdateRow<typeof schema.${schemaName}>`;
40
+ }).join(`
41
+
42
+ `)}
43
+ `;
44
+ }
45
+ function generateTablesFile(modelFiles) {
46
+ const modelNames = modelFiles.map(f => basename(f, ".ts")).sort(),
47
+ getExportName = name => name === "user" ? "userPublic" : name;
48
+ return `// auto-generated by on-zero vite plugin
49
+
50
+ ${modelNames.map(name => `export { schema as ${getExportName(name)} } from '../models/${name}'`).join(`
51
+ `)}
52
+ `;
53
+ }
54
+ async function runGenerate(options) {
55
+ const {
56
+ modelsDir,
57
+ generatedDir,
58
+ silent
59
+ } = options;
60
+ existsSync(generatedDir) || mkdirSync(generatedDir, {
61
+ recursive: !0
62
+ });
63
+ const allModelFiles = readdirSync(modelsDir).filter(f => f.endsWith(".ts")).sort(),
64
+ filesWithSchema = allModelFiles.filter(f => readFileSync(resolve(modelsDir, f), "utf-8").includes("export const schema = table(")),
65
+ filesChanged = [writeFileIfChanged(resolve(generatedDir, "models.ts"), generateModelsFile(allModelFiles)), writeFileIfChanged(resolve(generatedDir, "types.ts"), generateTypesFile(filesWithSchema)), writeFileIfChanged(resolve(generatedDir, "tables.ts"), generateTablesFile(filesWithSchema))].filter(Boolean).length;
66
+ return filesChanged > 0 && !silent && console.info(`[on-zero] generated ${filesChanged} file(s)`), filesChanged;
67
+ }
68
+ function onZeroPlugin(options = {}) {
69
+ const dataDir = options.dataDir || "src/data",
70
+ hmrPaths = ["/models/", "/generated/", ...(options.hmrInclude || [])];
71
+ let modelsDir, generatedDir;
72
+ return [
73
+ // generation plugin
74
+ {
75
+ name: "on-zero:generate",
76
+ apply: "serve",
77
+ configResolved(config) {
78
+ modelsDir = resolve(config.root, dataDir, "models"), generatedDir = resolve(config.root, dataDir, "generated");
79
+ },
80
+ async buildStart() {
81
+ options.disableGenerate || (await runGenerate({
82
+ modelsDir,
83
+ generatedDir,
84
+ silent: !1
85
+ }));
86
+ },
87
+ configureServer(server) {
88
+ options.disableGenerate || (server.watcher.on("change", async file => {
89
+ file.includes(modelsDir) && (await runGenerate({
90
+ modelsDir,
91
+ generatedDir,
92
+ silent: !1
93
+ }));
94
+ }), server.watcher.on("add", async file => {
95
+ file.includes(modelsDir) && (await runGenerate({
96
+ modelsDir,
97
+ generatedDir,
98
+ silent: !1
99
+ }));
100
+ }), server.watcher.on("unlink", async file => {
101
+ file.includes(modelsDir) && (await runGenerate({
102
+ modelsDir,
103
+ generatedDir,
104
+ silent: !1
105
+ }));
106
+ }));
107
+ }
108
+ },
109
+ // HMR plugin - removes invalidate calls to prevent cascade
110
+ {
111
+ name: "on-zero:hmr",
112
+ apply: "serve",
113
+ enforce: "post",
114
+ transform(code, id) {
115
+ if (hmrPaths.some(p => id.includes(p)) && /\.tsx?$/.test(id) && code.includes("import.meta.hot.invalidate")) return {
116
+ code: code.replace(/if\s*\(invalidateMessage\)\s*import\.meta\.hot\.invalidate\(invalidateMessage\);?/g, "/* on-zero: HMR invalidate disabled */"),
117
+ map: null
118
+ };
119
+ }
120
+ },
121
+ // build plugin - generate once before build
122
+ {
123
+ name: "on-zero:build",
124
+ apply: "build",
125
+ configResolved(config) {
126
+ modelsDir = resolve(config.root, dataDir, "models"), generatedDir = resolve(config.root, dataDir, "generated");
127
+ },
128
+ async buildStart() {
129
+ options.disableGenerate || (await runGenerate({
130
+ modelsDir,
131
+ generatedDir,
132
+ silent: !0
133
+ }));
134
+ }
135
+ }];
136
+ }
137
+ const onZeroHmrPlugin = options => onZeroPlugin({
138
+ hmrInclude: options?.include,
139
+ disableGenerate: !0
140
+ })[1];
141
+ var vite_plugin_default = onZeroPlugin;
142
+ export { vite_plugin_default as default, onZeroHmrPlugin, onZeroPlugin };
143
+ //# sourceMappingURL=vite-plugin.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createHash","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","basename","resolve","hash","s","update","digest","generateCache","writeFileIfChanged","filePath","content","contentHash","generateModelsFile","modelFiles","modelNames","map","f","sort","getImportName","name","imports","join","modelsObj","a","b","localeCompare","generateTypesFile","getSchemaName","pascalName","charAt","toUpperCase","slice","schemaName","generateTablesFile","getExportName","runGenerate","options","modelsDir","generatedDir","silent","recursive","allModelFiles","filter","endsWith","filesWithSchema","includes","filesChanged","Boolean","length","console","info","onZeroPlugin","dataDir","hmrPaths","hmrInclude","apply","configResolved","config","root","buildStart","disableGenerate","configureServer","server","watcher","on","file","enforce","transform","code","id","some","p","test","replace","onZeroHmrPlugin","include","vite_plugin_default"],"sources":["../../src/vite-plugin.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,181 @@
1
+ import { createHash } from "crypto";
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "fs";
3
+ import { basename, resolve } from "path";
4
+ var hash = function (s) {
5
+ return createHash("sha256").update(s).digest("hex");
6
+ },
7
+ generateCache = {};
8
+ function writeFileIfChanged(filePath, content) {
9
+ var contentHash = hash(content);
10
+ return generateCache[filePath] === contentHash && existsSync(filePath) ? !1 : (writeFileSync(filePath, content, "utf-8"), generateCache[filePath] = contentHash, !0);
11
+ }
12
+ function generateModelsFile(modelFiles) {
13
+ var modelNames = modelFiles.map(function (f) {
14
+ return basename(f, ".ts");
15
+ }).sort(),
16
+ getImportName = function (name) {
17
+ return name === "user" ? "userPublic" : name;
18
+ },
19
+ imports = modelNames.map(function (name) {
20
+ return `import * as ${getImportName(name)} from '../models/${name}'`;
21
+ }).join(`
22
+ `),
23
+ sortedByImportName = [...modelNames].sort(function (a, b) {
24
+ return getImportName(a).localeCompare(getImportName(b));
25
+ }),
26
+ modelsObj = `export const models = {
27
+ ${sortedByImportName.map(function (name) {
28
+ return ` ${getImportName(name)},`;
29
+ }).join(`
30
+ `)}
31
+ }`,
32
+ hmrBoundary = `
33
+ if (import.meta.hot) {
34
+ import.meta.hot.accept()
35
+ }
36
+ `;
37
+ return `// auto-generated by on-zero vite plugin
38
+ ${imports}
39
+
40
+ ${modelsObj}
41
+ ${hmrBoundary}`;
42
+ }
43
+ function generateTypesFile(modelFiles) {
44
+ var modelNames = modelFiles.map(function (f) {
45
+ return basename(f, ".ts");
46
+ }).sort(),
47
+ getSchemaName = function (name) {
48
+ return name === "user" ? "userPublic" : name;
49
+ },
50
+ typeExports = modelNames.map(function (name) {
51
+ var pascalName = name.charAt(0).toUpperCase() + name.slice(1),
52
+ schemaName = getSchemaName(name);
53
+ return `export type ${pascalName} = TableInsertRow<typeof schema.${schemaName}>
54
+ export type ${pascalName}Update = TableUpdateRow<typeof schema.${schemaName}>`;
55
+ }).join(`
56
+
57
+ `);
58
+ return `import type { TableInsertRow, TableUpdateRow } from 'on-zero'
59
+ import type * as schema from './tables'
60
+
61
+ ${typeExports}
62
+ `;
63
+ }
64
+ function generateTablesFile(modelFiles) {
65
+ var modelNames = modelFiles.map(function (f) {
66
+ return basename(f, ".ts");
67
+ }).sort(),
68
+ getExportName = function (name) {
69
+ return name === "user" ? "userPublic" : name;
70
+ },
71
+ exports = modelNames.map(function (name) {
72
+ return `export { schema as ${getExportName(name)} } from '../models/${name}'`;
73
+ }).join(`
74
+ `);
75
+ return `// auto-generated by on-zero vite plugin
76
+
77
+ ${exports}
78
+ `;
79
+ }
80
+ async function runGenerate(options) {
81
+ var {
82
+ modelsDir,
83
+ generatedDir,
84
+ silent
85
+ } = options;
86
+ existsSync(generatedDir) || mkdirSync(generatedDir, {
87
+ recursive: !0
88
+ });
89
+ var allModelFiles = readdirSync(modelsDir).filter(function (f) {
90
+ return f.endsWith(".ts");
91
+ }).sort(),
92
+ filesWithSchema = allModelFiles.filter(function (f) {
93
+ return readFileSync(resolve(modelsDir, f), "utf-8").includes("export const schema = table(");
94
+ }),
95
+ writeResults = [writeFileIfChanged(resolve(generatedDir, "models.ts"), generateModelsFile(allModelFiles)), writeFileIfChanged(resolve(generatedDir, "types.ts"), generateTypesFile(filesWithSchema)), writeFileIfChanged(resolve(generatedDir, "tables.ts"), generateTablesFile(filesWithSchema))],
96
+ filesChanged = writeResults.filter(Boolean).length;
97
+ return filesChanged > 0 && !silent && console.info(`[on-zero] generated ${filesChanged} file(s)`), filesChanged;
98
+ }
99
+ function onZeroPlugin() {
100
+ var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {},
101
+ dataDir = options.dataDir || "src/data",
102
+ hmrPaths = ["/models/", "/generated/", ...(options.hmrInclude || [])],
103
+ modelsDir,
104
+ generatedDir;
105
+ return [
106
+ // generation plugin
107
+ {
108
+ name: "on-zero:generate",
109
+ apply: "serve",
110
+ configResolved(config) {
111
+ modelsDir = resolve(config.root, dataDir, "models"), generatedDir = resolve(config.root, dataDir, "generated");
112
+ },
113
+ async buildStart() {
114
+ options.disableGenerate || (await runGenerate({
115
+ modelsDir,
116
+ generatedDir,
117
+ silent: !1
118
+ }));
119
+ },
120
+ configureServer(server) {
121
+ options.disableGenerate || (server.watcher.on("change", async function (file) {
122
+ file.includes(modelsDir) && (await runGenerate({
123
+ modelsDir,
124
+ generatedDir,
125
+ silent: !1
126
+ }));
127
+ }), server.watcher.on("add", async function (file) {
128
+ file.includes(modelsDir) && (await runGenerate({
129
+ modelsDir,
130
+ generatedDir,
131
+ silent: !1
132
+ }));
133
+ }), server.watcher.on("unlink", async function (file) {
134
+ file.includes(modelsDir) && (await runGenerate({
135
+ modelsDir,
136
+ generatedDir,
137
+ silent: !1
138
+ }));
139
+ }));
140
+ }
141
+ },
142
+ // HMR plugin - removes invalidate calls to prevent cascade
143
+ {
144
+ name: "on-zero:hmr",
145
+ apply: "serve",
146
+ enforce: "post",
147
+ transform(code, id) {
148
+ var shouldTransform = hmrPaths.some(function (p) {
149
+ return id.includes(p);
150
+ }) && /\.tsx?$/.test(id);
151
+ if (shouldTransform && code.includes("import.meta.hot.invalidate")) return {
152
+ code: code.replace(/if\s*\(invalidateMessage\)\s*import\.meta\.hot\.invalidate\(invalidateMessage\);?/g, "/* on-zero: HMR invalidate disabled */"),
153
+ map: null
154
+ };
155
+ }
156
+ },
157
+ // build plugin - generate once before build
158
+ {
159
+ name: "on-zero:build",
160
+ apply: "build",
161
+ configResolved(config) {
162
+ modelsDir = resolve(config.root, dataDir, "models"), generatedDir = resolve(config.root, dataDir, "generated");
163
+ },
164
+ async buildStart() {
165
+ options.disableGenerate || (await runGenerate({
166
+ modelsDir,
167
+ generatedDir,
168
+ silent: !0
169
+ }));
170
+ }
171
+ }];
172
+ }
173
+ var onZeroHmrPlugin = function (options) {
174
+ return onZeroPlugin({
175
+ hmrInclude: options?.include,
176
+ disableGenerate: !0
177
+ })[1];
178
+ },
179
+ vite_plugin_default = onZeroPlugin;
180
+ export { vite_plugin_default as default, onZeroHmrPlugin, onZeroPlugin };
181
+ //# sourceMappingURL=vite-plugin.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createHash","existsSync","mkdirSync","readdirSync","readFileSync","writeFileSync","basename","resolve","hash","s","update","digest","generateCache","writeFileIfChanged","filePath","content","contentHash","generateModelsFile","modelFiles","modelNames","map","f","sort","getImportName","name","imports","join","sortedByImportName","a","b","localeCompare","modelsObj","hmrBoundary","generateTypesFile","getSchemaName","typeExports","pascalName","charAt","toUpperCase","slice","schemaName","generateTablesFile","getExportName","exports","runGenerate","options","modelsDir","generatedDir","silent","recursive","allModelFiles","filter","endsWith","filesWithSchema","includes","writeResults","filesChanged","Boolean","length","console","info","onZeroPlugin","arguments","dataDir","hmrPaths","hmrInclude","apply","configResolved","config","root","buildStart","disableGenerate","configureServer","server","watcher","on","file"],"sources":["../../src/vite-plugin.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,QAAkB;AAC3B,SAASC,UAAA,EAAYC,SAAA,EAAWC,WAAA,EAAaC,YAAA,EAAcC,aAAA,QAAqB;AAChF,SAASC,QAAA,EAAUC,OAAA,QAAe;AAIlC,IAAAC,IAAM,YAAAA,CAAsBC,CAAA;IAG5B,OAAIT,UAAA,CAAwC,QAAC,EAAAU,MAAA,CAAAD,CAAA,EAAAE,MAAA;EAE7C;EAAAC,aAAS;AACP,SAAMC,kBAAmBA,CAAAC,QAAO,EAAAC,OAAA;EAChC,IAAAC,WAAI,GAAAR,IAAc,CAAAO,OAAQ;EAM5B,OAAAH,aAAA,CAAAE,QAAA,MAAAE,WAAA,IAAAf,UAAA,CAAAa,QAAA,UAAAT,aAAA,CAAAS,QAAA,EAAAC,OAAA,YAAAH,aAAA,CAAAE,QAAA,IAAAE,WAAA;AAEA;AACE,SAAMC,kBAAaA,CAAAC,UAAgB;EAKvB,IAKNC,UAAY,GAAAD,UAAA,CAAAE,GAAA,WAAAC,CAAA;MAHU,OAAGf,QAAY,CAAAe,CAAA;IAAA,EAAK,CAACC,IAAG;IAAAC,aAClD,GAAe,SAAAA,CAAEC,IAAA;MAE8C,OAAKA,IAAA,KAAS,MAAK,eAAkB,GAACA,IAAK;IAAU;IAAAC,OAAA,GAAAN,UAAA,CAAAC,GAAA,WAAAI,IAAA;MAAA,sBAAAD,aAAA,CAAAC,IAAA,qBAAAA,IAAA;IAQtH,GAAAE,IAAO;AAAA,EAA6C;IAAAC,kBAAO,OAAAR,UAAA,CAAO,CAAAG,IAAA,WAASM,CAAA,EAAAC,CAAA;MAAA,OAAAN,aAAA,CAAAK,CAAA,EAAAE,aAAA,CAAAP,aAAA,CAAAM,CAAA;IAAA;IAAAE,SAAA;AAAA,EAAAJ,kBAAA,CAAAP,GAAA,WAAAI,IAAA;MAAA,YAAAD,aAAA,CAAAC,IAAA;IAAA,GAAAE,IAAA;AAC7E;AAEA;IAAAM,WAAS;AACP;AAWA;AAAO;AAAA;EARa;AAEhB,EAAAP,OAAA;AAEA;AAA6E,EAAAM,SAAA;AAA+E,EAC9JC,WACM;AAAA;AAAA,SAEuHC,kBAAAf,UAAA;EAAA,IAAAC,UAAA,GAAAD,UAAA,CAAAE,GAAA,WAAAC,CAAA;MACjI,OAAAf,QAAA,CAAAe,CAAA;IAEA,GAAAC,IAAS;IAAAY,aAAA,GAAmB,SAAAA,CAAAV,IAAsB;MAChD,OAAMA,IAAA,WAAa,eAAgB,GAAMA,IAAA;IAOzC;IAAAW,WAAO,GAAAhB,UAAA,CAAAC,GAAA,WAAAI,IAAA;MAAA,IAAAY,UAAA,GAAAZ,IAAA,CAAAa,MAAA,IAAAC,WAAA,KAAAd,IAAA,CAAAe,KAAA;QAAAC,UAAA,GAAAN,aAAA,CAAAV,IAAA;MAJS,sBACRY,UAAS,mCAAyCI,UAAA;AAClD,cAEqDJ,UAAA,yCAAAI,UAAA;IAAA,GAAAd,IAAA;AAC/D;AAEA;EAKE,OAAM;AAEN;AAIA;AAIsC,EAAAS,WACpC;AAAoF;AAGjE;AACnB,SACEM,kBAAQA,CAAcvB,UAAA,EAAW;EAAA,IACjCC,UAAA,GAAAD,UAAmB,CAAAE,GAAA,WAAaC,CAAA;MAClC,OAAAf,QAAA,CAAAe,CAAA;IAAA,EACA,CAAAC,IAAA;IAAAoB,aAAA,YAAAA,CAAAlB,IAAA;MAAA,OACEA,IAAQ,cAAc,YAAU,GAAAA,IAAA;IAAA;IAAAmB,OAChC,GAAAxB,UAAkB,CAAAC,GAAA,WAAeI,IAAA;MACnC,6BAAAkB,aAAA,CAAAlB,IAAA,uBAAAA,IAAA;IAAA,EACA,CAAAE,IAAA;AAAA;EACmC,OACjC;AAAkC;AACpC,EACFiB,OAEkC;AAClC;AAKF;AAqCO,eAASC,WAAaA,CAAAC,OAAgC,EAAa;EACxE;IAAMC,SAAA;IAAUC,YAAQ;IAAAC;EAAW,IAAAH,OAC7B;EAEN5C,UAAI,CAAA8C,YACA,KAAA7C,SAAA,CAAA6C,YAAA;IAEJE,SAAO;EAAA;EAAA,IAELC,aAAA,GAAA/C,WAAA,CAAA2C,SAAA,EAAAK,MAAA,WAAA9B,CAAA;MAAA,OACEA,CAAM,CAAA+B,QAAA;IAAA,GAAA9B,IACN;IAAO+B,eAAA,GAAAH,aAAA,CAAAC,MAAA,WAAA9B,CAAA;MAAA,OAEPjB,YAAe,CAAAG,OAAQ,CAAAuC,SAAA,EAAAzB,CAAA,YAAAiC,QAAA;IACrB;IAAAC,YAAA,GAAY,CAC4C1C,kBAC1D,CAAAN,OAAA,CAAAwC,YAAA,gBAAA9B,kBAAA,CAAAiC,aAAA,IAAArC,kBAEM,CAAAN,OAAa,CAAAwC,YAAA,eAAAd,iBAAA,CAAAoB,eAAA,IACjBxC,kBAAY,CAAAN,OAAA,CAAAwC,YACN,aAAc,GAAAN,kBAAW,CAAAY,eAA6B;IAAAG,YAC9D,GAAAD,YAAA,CAAAJ,MAAA,CAAAM,OAAA,EAAAC,MAAA;EAAA,OAEAF,YAAA,GAAgB,MAAQR,MAAA,IAAAW,OAAA,CAAAC,IAAA,wBAAAJ,YAAA,aAAAA,YAAA;AACtB;AAIE,SAAAK,YAASA,CAAA,EAAS;EAC4C,IAAAhB,OAIhE,GAAAiB,SAAO,CAAAJ,MAAW,QAAOI,SAAO,QAAS,SAAAA,SAAA;IAAAC,OAAA,GAAAlB,OAAA,CAAAkB,OAAA;IAAAC,QAAA,IACvC,UAAI,EAC0D,aAIhE,EACE,IAAAnB,OAAI,CAAKoB,UAAS,QAC4C;IAAAnB,SAE/D;IAAAC,YAAA;EAAA,OACH;EACF;EAAA;IAGAvB,IAAA;IACE0C,KAAA,EAAM;IACNC,cAAOA,CAAAC,MAAA;MACPtB,SAAS,GAAAvC,OAAA,CAAA6D,MAAA,CAAAC,IAAA,EAAAN,OAAA,aAAAhB,YAAA,GAAAxC,OAAA,CAAA6D,MAAA,CAAAC,IAAA,EAAAN,OAAA;IAET;IAGE,MAFwBO,UAASA,CAAA;MAG/BzB,OAAA,CAAA0B,eAAO,WAAA3B,WAAA;QAAAE,SACC;QAAKC,YACT;QAAAC,MACA;MAAA;IACF;IACKwB,eACPA,CAAAC,MAAA;MAEJ5B,OAAA,CAAA0B,eAAA,KAAAE,MAAA,CAAAC,OAAA,CAAAC,EAAA,2BAAAC,IAAA;QACFA,IAAA,CAAAtB,QAAA,CAAAR,SAAA,YAAAF,WAAA;UAAAE,SAAA;UAGAC,YAAA;UACQC,MAAA;QACN;MAEA,IAAAyB,MAAA,CAAAC,OAAe,CAAAC,EAAQ,wBAAAC,IAAA;QACrBA,IAAA,CAAAtB,QAAY,CAAAR,SAAQ,MAAO,MAAMF,WAAS;UAE5CE,SAAA;UAEMC,YAAA;UACAC,MAAQ;QAEd;MACF,IAAAyB,MAAA,CAAAC,OAAA,CAAAC,EAAA,2BAAAC,IAAA;QACFA,IAAA,CAAAtB,QAAA,CAAAR,SAAA,YAAAF,WAAA;UACFE,SAAA;UAGaC,YAAkB;UAIxBC,MAAA","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "on-zero",
3
- "version": "0.1.21",
3
+ "version": "0.1.22",
4
4
  "description": "A typed layer over @rocicorp/zero with queries, mutations, and permissions",
5
5
  "sideEffects": false,
6
6
  "source": "src/index.ts",
@@ -61,10 +61,15 @@
61
61
  "types": "./types/server.d.ts",
62
62
  "import": "./dist/esm/server.mjs",
63
63
  "require": "./dist/cjs/server.cjs"
64
+ },
65
+ "./vite": {
66
+ "types": "./types/vite-plugin.d.ts",
67
+ "import": "./dist/esm/vite-plugin.mjs",
68
+ "require": "./dist/cjs/vite-plugin.cjs"
64
69
  }
65
70
  },
66
71
  "dependencies": {
67
- "@take-out/helpers": "0.1.21",
72
+ "@take-out/helpers": "0.1.22",
68
73
  "@sinclair/typebox-codegen": "^0.11.1",
69
74
  "chokidar": "^4.0.3",
70
75
  "citty": "^0.1.6",
package/readme.md CHANGED
@@ -287,10 +287,49 @@ export const channelMessages = (props: { channelId: string }) => {
287
287
 
288
288
  ## generation
289
289
 
290
- `on-zero` has a CLI that auto-generates glue files that wire up your models,
291
- queries, and types.
290
+ on-zero auto-generates glue files that wire up your models, queries, and types.
292
291
 
293
- ### cli commands
292
+ ### vite plugin (recommended)
293
+
294
+ the vite plugin handles generation and HMR automatically:
295
+
296
+ ```ts
297
+ // vite.config.ts
298
+ import { onZeroPlugin } from 'on-zero/vite'
299
+
300
+ export default {
301
+ plugins: [
302
+ onZeroPlugin(),
303
+ // ... other plugins
304
+ ]
305
+ }
306
+ ```
307
+
308
+ **features:**
309
+
310
+ - generates on dev server start
311
+ - watches for model changes and regenerates
312
+ - enables HMR for mutations (no page reload when editing models)
313
+ - generates before production builds
314
+
315
+ **options:**
316
+
317
+ ```ts
318
+ onZeroPlugin({
319
+ // path to data directory (default: 'src/data')
320
+ dataDir: 'src/data',
321
+
322
+ // additional paths to apply HMR fix to
323
+ hmrInclude: ['/src/zero/'],
324
+
325
+ // disable generation (HMR only)
326
+ disableGenerate: false,
327
+ })
328
+ ```
329
+
330
+ ### cli (alternative)
331
+
332
+ if you prefer CLI over the vite plugin:
294
333
 
295
334
  **`on-zero generate [dir]`**
296
335
 
package/src/cli.ts CHANGED
@@ -445,7 +445,15 @@ function generateModelsFile(modelFiles: string[]) {
445
445
  )
446
446
  const modelsObj = `export const models = {\n${sortedByImportName.map((name) => ` ${getImportName(name)},`).join('\n')}\n}`
447
447
 
448
- return `// auto-generated by: on-zero generate\n${imports}\n\n${modelsObj}\n`
448
+ // HMR boundary - accept updates without cascading
449
+ // mutations use dynamic lookup so updates take effect immediately
450
+ const hmrBoundary = `
451
+ if (import.meta.hot) {
452
+ import.meta.hot.accept()
453
+ }
454
+ `
455
+
456
+ return `// auto-generated by: on-zero generate\n${imports}\n\n${modelsObj}\n${hmrBoundary}`
449
457
  }
450
458
 
451
459
  function generateTypesFile(modelFiles: string[]) {
@@ -159,17 +159,23 @@ export function createMutators<Models extends GenericModels>({
159
159
 
160
160
  for (const [moduleName, moduleExports] of Object.entries(modules)) {
161
161
  result[moduleName] = {}
162
- for (const [name, exportValue] of Object.entries(moduleExports)) {
163
- if (typeof exportValue === 'function') {
164
- const fullName = `${moduleName}.${name}`
165
- result[moduleName][name] = withDevelopmentLogging(
162
+ for (const [name] of Object.entries(moduleExports)) {
163
+ const fullName = `${moduleName}.${name}`
164
+ // look up function dynamically to support HMR
165
+ // modules[moduleName] is a proxy that returns updated implementations
166
+ const getDynamicFn = () => modules[moduleName][name]
167
+
168
+ result[moduleName][name] = withDevelopmentLogging(
169
+ fullName,
170
+ withTimeoutGuard(
166
171
  fullName,
167
- withTimeoutGuard(
168
- fullName,
169
- withValidation(moduleName, name, withContext(exportValue))
172
+ withValidation(
173
+ moduleName,
174
+ name,
175
+ withContext((...args: any[]) => getDynamicFn()(...args))
170
176
  )
171
177
  )
172
- }
178
+ )
173
179
  }
174
180
  }
175
181