@ghentcdh/create-crouton 0.0.1-alpha.42 → 0.0.1-alpha.46
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/index.js +151 -27
- package/dist/index.js.map +1 -1
- package/dist/templates/docker/.dockerignore.tmpl +4 -1
- package/dist/templates/docker/.env.infra.example.tmpl +5 -0
- package/dist/templates/docker/.env.infra.tmpl +5 -0
- package/dist/templates/docker/Dockerfile.dev.tmpl +14 -13
- package/dist/templates/docker/Dockerfile.prod.tmpl +107 -17
- package/dist/templates/docker/compose.app.tmpl +53 -0
- package/dist/templates/docker/compose.infra.yml.tmpl +24 -0
- package/dist/templates/docker/compose.yml.tmpl +4 -27
- package/dist/templates/nx/workspace/.env.example.tmpl +2 -0
- package/dist/templates/nx/workspace/.env.tmpl +2 -3
- package/dist/templates/regular/.env.example.tmpl +1 -0
- package/dist/templates/regular/.env.tmpl +1 -0
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -18854,25 +18854,38 @@ var transformDataSource = (data) => {
|
|
|
18854
18854
|
};
|
|
18855
18855
|
var DataSourceSchema = DataSourceShape.transform(transformDataSource);
|
|
18856
18856
|
|
|
18857
|
+
// ../crouton-core/src/lib/data-source/Security.schema.ts
|
|
18858
|
+
var SecuritySchema = external_exports.union([
|
|
18859
|
+
external_exports.object({ public: external_exports.literal(true) }),
|
|
18860
|
+
external_exports.object({ guard: external_exports.union([external_exports.string(), external_exports.array(external_exports.string()).min(1)]) })
|
|
18861
|
+
]);
|
|
18862
|
+
|
|
18857
18863
|
// ../crouton-core/src/lib/data-source/Operations.schema.ts
|
|
18864
|
+
var OpEntry = external_exports.union([
|
|
18865
|
+
external_exports.boolean(),
|
|
18866
|
+
external_exports.object({ security: SecuritySchema.optional() })
|
|
18867
|
+
]);
|
|
18858
18868
|
var BoolOrUpsertSchema = external_exports.union([
|
|
18859
18869
|
external_exports.boolean(),
|
|
18860
|
-
external_exports.object({
|
|
18870
|
+
external_exports.object({
|
|
18871
|
+
upsertOn: external_exports.union([external_exports.string(), external_exports.array(external_exports.string())]),
|
|
18872
|
+
security: SecuritySchema.optional()
|
|
18873
|
+
})
|
|
18861
18874
|
]);
|
|
18862
18875
|
var JsonOperationsSchema = external_exports.object({
|
|
18863
|
-
findAll:
|
|
18876
|
+
findAll: OpEntry.default(true),
|
|
18864
18877
|
// default: true — only explicit `false` disables it
|
|
18865
|
-
findOne:
|
|
18878
|
+
findOne: OpEntry.default(true),
|
|
18866
18879
|
// default: true
|
|
18867
|
-
create:
|
|
18880
|
+
create: OpEntry.default(true),
|
|
18868
18881
|
// default: true
|
|
18869
|
-
update:
|
|
18882
|
+
update: OpEntry.default(true),
|
|
18870
18883
|
// default: true
|
|
18871
|
-
patch:
|
|
18884
|
+
patch: OpEntry.default(true),
|
|
18872
18885
|
// default: true
|
|
18873
18886
|
upsert: BoolOrUpsertSchema.default(false),
|
|
18874
18887
|
// default: disabled; `true` throws at load time — must be `{ upsertOn }`
|
|
18875
|
-
delete:
|
|
18888
|
+
delete: OpEntry.default(true)
|
|
18876
18889
|
// default: true
|
|
18877
18890
|
});
|
|
18878
18891
|
|
|
@@ -19374,6 +19387,8 @@ var ResourceJsonShape = external_exports.object({
|
|
|
19374
19387
|
// default: shown, alphabetically ordered, ungrouped
|
|
19375
19388
|
display: JsonDisplaySchema.default(JsonDisplaySchema.parse({})),
|
|
19376
19389
|
// default: { mode: 'modal', customComponent: null }
|
|
19390
|
+
/** Global security block — applies to every operation unless overridden per-operation. */
|
|
19391
|
+
security: SecuritySchema.optional(),
|
|
19377
19392
|
operations: JsonOperationsSchema,
|
|
19378
19393
|
// required key — but every sub-field defaults to enabled
|
|
19379
19394
|
columns: ColumnsSchema.default(ColumnsSchema.parse({})),
|
|
@@ -19523,11 +19538,17 @@ var ViewColumnConfigSchema = external_exports.object({
|
|
|
19523
19538
|
fieldInput: FieldInputSchema.optional()
|
|
19524
19539
|
});
|
|
19525
19540
|
var ViewConfigSchema = external_exports.object({
|
|
19526
|
-
|
|
19527
|
-
|
|
19541
|
+
// TODO why we have both?
|
|
19542
|
+
json_schema: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
|
|
19543
|
+
ui_schema: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
|
|
19544
|
+
// TODO why we have both?
|
|
19545
|
+
ui: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
|
|
19546
|
+
data: external_exports.record(external_exports.string(), external_exports.unknown()).optional(),
|
|
19528
19547
|
columns: external_exports.array(ViewColumnConfigSchema),
|
|
19529
19548
|
defaultSort: external_exports.string().optional()
|
|
19530
19549
|
});
|
|
19550
|
+
var viewDefList = ["table", "view", "form"];
|
|
19551
|
+
var ViewDefEnum = external_exports.enum(viewDefList);
|
|
19531
19552
|
|
|
19532
19553
|
// ../crouton-core/src/lib/i18n/Translations.schema.ts
|
|
19533
19554
|
var NestedStringRecord = external_exports.lazy(
|
|
@@ -19816,21 +19837,30 @@ var runCreate = async (name, opts) => {
|
|
|
19816
19837
|
M2.info(`Using pnpm ${pnpmVersion}`);
|
|
19817
19838
|
}
|
|
19818
19839
|
const dbUrl = await resolveDbUrl(opts);
|
|
19840
|
+
const postgres = opts.docker !== false ? await resolvePostgres(opts) : false;
|
|
19819
19841
|
const dbName = name.replace(/[^a-zA-Z0-9]/g, "_");
|
|
19842
|
+
const appName = prefix || name;
|
|
19820
19843
|
const tokens = {
|
|
19821
19844
|
name,
|
|
19822
19845
|
Name: toTitle(name),
|
|
19823
|
-
version: true ? "0.0.1-alpha.
|
|
19846
|
+
version: true ? "0.0.1-alpha.46" : "latest",
|
|
19824
19847
|
year: String((/* @__PURE__ */ new Date()).getFullYear()),
|
|
19825
19848
|
pmRun: pm === "npm" ? "npm run" : pm,
|
|
19826
19849
|
urlEnv: "DATABASE_URL",
|
|
19827
19850
|
dbUrl: dbUrl || `postgresql://crouton:crouton@localhost:5432/${dbName}?schema=public`,
|
|
19828
|
-
dbName
|
|
19851
|
+
dbName,
|
|
19852
|
+
appName,
|
|
19853
|
+
frontendPort: "4200",
|
|
19854
|
+
backendPort: "3000"
|
|
19829
19855
|
};
|
|
19830
19856
|
if (layout === "nx") {
|
|
19831
19857
|
tokens["nx"] = "true";
|
|
19832
|
-
tokens["backendApp"] =
|
|
19833
|
-
tokens["frontendApp"] =
|
|
19858
|
+
tokens["backendApp"] = `${appName}-backend`;
|
|
19859
|
+
tokens["frontendApp"] = `${appName}-frontend`;
|
|
19860
|
+
tokens["workspaceRoot"] = prefix || ".";
|
|
19861
|
+
tokens["dockerfileDev"] = prefix ? `${prefix}/Dockerfile.dev` : "Dockerfile.dev";
|
|
19862
|
+
tokens["envFile"] = prefix ? `${prefix}/.env` : ".env";
|
|
19863
|
+
tokens["generatedGlob"] = prefix ? `${prefix}/generated/default` : "generated/default";
|
|
19834
19864
|
if (prefix) {
|
|
19835
19865
|
tokens["prefix"] = prefix;
|
|
19836
19866
|
tokens["appsRoot"] = `${prefix}/apps`;
|
|
@@ -19846,10 +19876,23 @@ var runCreate = async (name, opts) => {
|
|
|
19846
19876
|
tokens["generatedTypesPath"] = "generated/default/types/src";
|
|
19847
19877
|
tokens["generatedClientPath"] = "generated/default/client";
|
|
19848
19878
|
}
|
|
19879
|
+
} else {
|
|
19880
|
+
tokens["regular"] = "true";
|
|
19881
|
+
tokens["dockerfileDev"] = "Dockerfile.dev";
|
|
19882
|
+
tokens["envFile"] = ".env";
|
|
19849
19883
|
}
|
|
19850
19884
|
if (frontend) {
|
|
19851
19885
|
tokens["frontend"] = "true";
|
|
19852
19886
|
}
|
|
19887
|
+
if (layout === "nx" && frontend) {
|
|
19888
|
+
tokens["nxFrontend"] = "true";
|
|
19889
|
+
}
|
|
19890
|
+
if (layout === "nx" && !frontend) {
|
|
19891
|
+
tokens["nxBackendOnly"] = "true";
|
|
19892
|
+
}
|
|
19893
|
+
if (postgres) {
|
|
19894
|
+
tokens["postgres"] = "true";
|
|
19895
|
+
}
|
|
19853
19896
|
const templateRoot = resolveTemplateDir();
|
|
19854
19897
|
const skipPaths = !frontend ? ["apps/frontend"] : [];
|
|
19855
19898
|
if (layout === "nx") {
|
|
@@ -19872,12 +19915,12 @@ var runCreate = async (name, opts) => {
|
|
|
19872
19915
|
);
|
|
19873
19916
|
files.push(...workspaceFiles);
|
|
19874
19917
|
if (opts.docker !== false) {
|
|
19875
|
-
const
|
|
19876
|
-
|
|
19877
|
-
dockerDir,
|
|
19878
|
-
"",
|
|
19918
|
+
const dockerFiles = await renderDockerTemplates(
|
|
19919
|
+
templateRoot,
|
|
19879
19920
|
tokens,
|
|
19880
|
-
targetDir
|
|
19921
|
+
targetDir,
|
|
19922
|
+
workspaceTarget,
|
|
19923
|
+
{ postgres }
|
|
19881
19924
|
);
|
|
19882
19925
|
files.push(...dockerFiles);
|
|
19883
19926
|
}
|
|
@@ -19914,13 +19957,12 @@ var runCreate = async (name, opts) => {
|
|
|
19914
19957
|
skipPaths
|
|
19915
19958
|
);
|
|
19916
19959
|
if (opts.docker !== false) {
|
|
19917
|
-
const
|
|
19918
|
-
|
|
19919
|
-
|
|
19920
|
-
|
|
19921
|
-
|
|
19922
|
-
|
|
19923
|
-
targetDir
|
|
19960
|
+
const dockerFiles = await renderDockerTemplates(
|
|
19961
|
+
templateRoot,
|
|
19962
|
+
tokens,
|
|
19963
|
+
targetDir,
|
|
19964
|
+
targetDir,
|
|
19965
|
+
{ postgres }
|
|
19924
19966
|
);
|
|
19925
19967
|
files.push(...dockerFiles);
|
|
19926
19968
|
}
|
|
@@ -19949,7 +19991,7 @@ var runCreate = async (name, opts) => {
|
|
|
19949
19991
|
const prefixFlag = prefix ? ` --prefix ${prefix}` : "";
|
|
19950
19992
|
Me(
|
|
19951
19993
|
[
|
|
19952
|
-
opts.docker !== false ? "docker compose up -d # start postgres" : null,
|
|
19994
|
+
opts.docker !== false && postgres ? "docker compose up -d # start postgres" : null,
|
|
19953
19995
|
`${pmRun} prisma:migrate # create initial migration`,
|
|
19954
19996
|
`crouton update resources${prefixFlag} # generate resource CRUD`,
|
|
19955
19997
|
`${pmRun} dev # start dev server`
|
|
@@ -19965,6 +20007,78 @@ var runCreate = async (name, opts) => {
|
|
|
19965
20007
|
throw err;
|
|
19966
20008
|
}
|
|
19967
20009
|
};
|
|
20010
|
+
var renderDockerTemplates = async (templateRoot, tokens, targetDir, workspaceTarget, opts) => {
|
|
20011
|
+
const dockerDir = resolve2(templateRoot, "docker");
|
|
20012
|
+
const files = [];
|
|
20013
|
+
const composeYml = render(
|
|
20014
|
+
await loadTemplate(dockerDir, "compose.yml.tmpl"),
|
|
20015
|
+
tokens
|
|
20016
|
+
);
|
|
20017
|
+
files.push({ path: resolve2(targetDir, "compose.yml"), contents: composeYml });
|
|
20018
|
+
const composeApp = render(
|
|
20019
|
+
await loadTemplate(dockerDir, "compose.app.tmpl"),
|
|
20020
|
+
tokens
|
|
20021
|
+
);
|
|
20022
|
+
files.push({
|
|
20023
|
+
path: resolve2(targetDir, `compose.app.${tokens["appName"]}.yml`),
|
|
20024
|
+
contents: composeApp
|
|
20025
|
+
});
|
|
20026
|
+
if (opts.postgres) {
|
|
20027
|
+
const composeInfra = render(
|
|
20028
|
+
await loadTemplate(dockerDir, "compose.infra.yml.tmpl"),
|
|
20029
|
+
tokens
|
|
20030
|
+
);
|
|
20031
|
+
files.push({
|
|
20032
|
+
path: resolve2(targetDir, "compose.infra.yml"),
|
|
20033
|
+
contents: composeInfra
|
|
20034
|
+
});
|
|
20035
|
+
const envInfra = render(
|
|
20036
|
+
await loadTemplate(dockerDir, ".env.infra.tmpl"),
|
|
20037
|
+
tokens
|
|
20038
|
+
);
|
|
20039
|
+
files.push({
|
|
20040
|
+
path: resolve2(targetDir, ".env.infra"),
|
|
20041
|
+
contents: envInfra
|
|
20042
|
+
});
|
|
20043
|
+
const envInfraExample = render(
|
|
20044
|
+
await loadTemplate(dockerDir, ".env.infra.example.tmpl"),
|
|
20045
|
+
tokens
|
|
20046
|
+
);
|
|
20047
|
+
files.push({
|
|
20048
|
+
path: resolve2(targetDir, ".env.infra.example"),
|
|
20049
|
+
contents: envInfraExample
|
|
20050
|
+
});
|
|
20051
|
+
files.push({
|
|
20052
|
+
path: resolve2(targetDir, "docker/init-data/.gitkeep"),
|
|
20053
|
+
contents: ""
|
|
20054
|
+
});
|
|
20055
|
+
}
|
|
20056
|
+
const dockerfileDev = render(
|
|
20057
|
+
await loadTemplate(dockerDir, "Dockerfile.dev.tmpl"),
|
|
20058
|
+
tokens
|
|
20059
|
+
);
|
|
20060
|
+
files.push({
|
|
20061
|
+
path: resolve2(workspaceTarget, "Dockerfile.dev"),
|
|
20062
|
+
contents: dockerfileDev
|
|
20063
|
+
});
|
|
20064
|
+
const dockerfileProd = render(
|
|
20065
|
+
await loadTemplate(dockerDir, "Dockerfile.prod.tmpl"),
|
|
20066
|
+
tokens
|
|
20067
|
+
);
|
|
20068
|
+
files.push({
|
|
20069
|
+
path: resolve2(workspaceTarget, "Dockerfile.prod"),
|
|
20070
|
+
contents: dockerfileProd
|
|
20071
|
+
});
|
|
20072
|
+
const dockerignore = render(
|
|
20073
|
+
await loadTemplate(dockerDir, ".dockerignore.tmpl"),
|
|
20074
|
+
tokens
|
|
20075
|
+
);
|
|
20076
|
+
files.push({
|
|
20077
|
+
path: resolve2(targetDir, ".dockerignore"),
|
|
20078
|
+
contents: dockerignore
|
|
20079
|
+
});
|
|
20080
|
+
return files;
|
|
20081
|
+
};
|
|
19968
20082
|
var postScaffold = async (opts, targetDir, pm, dbUrl, prefix) => {
|
|
19969
20083
|
if (opts.git !== false) {
|
|
19970
20084
|
const s = Y2();
|
|
@@ -20077,6 +20191,16 @@ var resolveDbUrl = async (opts) => {
|
|
|
20077
20191
|
);
|
|
20078
20192
|
return url2.trim();
|
|
20079
20193
|
};
|
|
20194
|
+
var resolvePostgres = async (opts) => {
|
|
20195
|
+
if (opts.yes) return opts.postgres;
|
|
20196
|
+
if (!opts.postgres) return false;
|
|
20197
|
+
return assertNotCancel(
|
|
20198
|
+
await ye({
|
|
20199
|
+
message: "Run PostgreSQL in Docker?",
|
|
20200
|
+
initialValue: true
|
|
20201
|
+
})
|
|
20202
|
+
);
|
|
20203
|
+
};
|
|
20080
20204
|
var loadAndRenderTemplates = async (templateDir, subPath, tokens, targetDir, skipPaths = []) => {
|
|
20081
20205
|
const files = [];
|
|
20082
20206
|
const dir = subPath ? resolve2(templateDir, subPath) : templateDir;
|
|
@@ -20105,7 +20229,7 @@ var loadAndRenderTemplates = async (templateDir, subPath, tokens, targetDir, ski
|
|
|
20105
20229
|
};
|
|
20106
20230
|
|
|
20107
20231
|
// src/index.ts
|
|
20108
|
-
var program2 = new Command("create-crouton").description("Scaffold a new crouton project").version("0.0.1").argument("[name]", "project name", "my-crouton-app").option("--nx", "use Nx monorepo layout").option("--no-nx", "use regular (non-Nx) layout").option("--no-frontend", "skip frontend app generation").option("--sample", "include sample resource").option("--pm <manager>", "package manager (pnpm | npm | yarn | bun)").option("--no-install", "skip dependency installation").option("--no-git", "skip git init").option("--prefix <name>", "nest apps/config under a subfolder (Nx only)").option("--no-docker", "skip Docker file generation").option("-y, --yes", "accept all defaults (non-interactive)").option("--force", "overwrite existing files").option("--db-url <url>", "database connection URL (e.g. postgresql://user:pass@localhost:5432/db)").action(async (name, opts) => {
|
|
20232
|
+
var program2 = new Command("create-crouton").description("Scaffold a new crouton project").version("0.0.1").argument("[name]", "project name", "my-crouton-app").option("--nx", "use Nx monorepo layout").option("--no-nx", "use regular (non-Nx) layout").option("--no-frontend", "skip frontend app generation").option("--sample", "include sample resource").option("--pm <manager>", "package manager (pnpm | npm | yarn | bun)").option("--no-install", "skip dependency installation").option("--no-git", "skip git init").option("--prefix <name>", "nest apps/config under a subfolder (Nx only)").option("--no-docker", "skip Docker file generation").option("--no-postgres", "skip PostgreSQL in Docker (use external DB)").option("-y, --yes", "accept all defaults (non-interactive)").option("--force", "overwrite existing files").option("--db-url <url>", "database connection URL (e.g. postgresql://user:pass@localhost:5432/db)").action(async (name, opts) => {
|
|
20109
20233
|
try {
|
|
20110
20234
|
await runCreate(name, opts);
|
|
20111
20235
|
} catch (err) {
|