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.
- package/dist/cjs/cli.cjs +4 -0
- package/dist/cjs/cli.js +4 -0
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/cli.native.js +7 -2
- package/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.cjs +4 -3
- package/dist/cjs/helpers/createMutators.js +12 -9
- package/dist/cjs/helpers/createMutators.js.map +1 -1
- package/dist/cjs/helpers/createMutators.native.js +25 -21
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/mutations.cjs +34 -4
- package/dist/cjs/mutations.js +29 -4
- package/dist/cjs/mutations.js.map +1 -1
- package/dist/cjs/mutations.native.js +36 -4
- package/dist/cjs/mutations.native.js.map +1 -1
- package/dist/cjs/vite-plugin.cjs +168 -0
- package/dist/cjs/vite-plugin.js +145 -0
- package/dist/cjs/vite-plugin.js.map +6 -0
- package/dist/cjs/vite-plugin.native.js +209 -0
- package/dist/cjs/vite-plugin.native.js.map +1 -0
- package/dist/esm/cli.js +4 -0
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/cli.mjs +4 -0
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/cli.native.js +7 -2
- package/dist/esm/cli.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.js +12 -9
- package/dist/esm/helpers/createMutators.js.map +1 -1
- package/dist/esm/helpers/createMutators.mjs +4 -3
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js +25 -21
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/mutations.js +29 -4
- package/dist/esm/mutations.js.map +1 -1
- package/dist/esm/mutations.mjs +34 -4
- package/dist/esm/mutations.mjs.map +1 -1
- package/dist/esm/mutations.native.js +35 -3
- package/dist/esm/mutations.native.js.map +1 -1
- package/dist/esm/vite-plugin.js +131 -0
- package/dist/esm/vite-plugin.js.map +6 -0
- package/dist/esm/vite-plugin.mjs +143 -0
- package/dist/esm/vite-plugin.mjs.map +1 -0
- package/dist/esm/vite-plugin.native.js +181 -0
- package/dist/esm/vite-plugin.native.js.map +1 -0
- package/package.json +7 -2
- package/readme.md +42 -3
- package/src/cli.ts +9 -1
- package/src/helpers/createMutators.ts +14 -8
- package/src/mutations.ts +57 -4
- package/src/vite-plugin.ts +238 -0
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/mutations.d.ts.map +1 -1
- package/types/vite-plugin.d.ts +39 -0
- 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":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "on-zero",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
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
|
-
|
|
291
|
-
queries, and types.
|
|
290
|
+
on-zero auto-generates glue files that wire up your models, queries, and types.
|
|
292
291
|
|
|
293
|
-
###
|
|
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
|
-
|
|
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
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
172
|
+
withValidation(
|
|
173
|
+
moduleName,
|
|
174
|
+
name,
|
|
175
|
+
withContext((...args: any[]) => getDynamicFn()(...args))
|
|
170
176
|
)
|
|
171
177
|
)
|
|
172
|
-
|
|
178
|
+
)
|
|
173
179
|
}
|
|
174
180
|
}
|
|
175
181
|
|