@ghentcdh/create-crouton 0.0.1-alpha.42 → 0.0.1-alpha.44

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 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({ upsertOn: external_exports.union([external_exports.string(), external_exports.array(external_exports.string())]) })
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: external_exports.boolean().default(true),
18876
+ findAll: OpEntry.default(true),
18864
18877
  // default: true — only explicit `false` disables it
18865
- findOne: external_exports.boolean().default(true),
18878
+ findOne: OpEntry.default(true),
18866
18879
  // default: true
18867
- create: external_exports.boolean().default(true),
18880
+ create: OpEntry.default(true),
18868
18881
  // default: true
18869
- update: external_exports.boolean().default(true),
18882
+ update: OpEntry.default(true),
18870
18883
  // default: true
18871
- patch: external_exports.boolean().default(true),
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: external_exports.boolean().default(true)
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({})),
@@ -19816,21 +19831,30 @@ var runCreate = async (name, opts) => {
19816
19831
  M2.info(`Using pnpm ${pnpmVersion}`);
19817
19832
  }
19818
19833
  const dbUrl = await resolveDbUrl(opts);
19834
+ const postgres = opts.docker !== false ? await resolvePostgres(opts) : false;
19819
19835
  const dbName = name.replace(/[^a-zA-Z0-9]/g, "_");
19836
+ const appName = prefix || name;
19820
19837
  const tokens = {
19821
19838
  name,
19822
19839
  Name: toTitle(name),
19823
- version: true ? "0.0.1-alpha.42" : "latest",
19840
+ version: true ? "0.0.1-alpha.44" : "latest",
19824
19841
  year: String((/* @__PURE__ */ new Date()).getFullYear()),
19825
19842
  pmRun: pm === "npm" ? "npm run" : pm,
19826
19843
  urlEnv: "DATABASE_URL",
19827
19844
  dbUrl: dbUrl || `postgresql://crouton:crouton@localhost:5432/${dbName}?schema=public`,
19828
- dbName
19845
+ dbName,
19846
+ appName,
19847
+ frontendPort: "4200",
19848
+ backendPort: "3000"
19829
19849
  };
19830
19850
  if (layout === "nx") {
19831
19851
  tokens["nx"] = "true";
19832
- tokens["backendApp"] = "backend";
19833
- tokens["frontendApp"] = "frontend";
19852
+ tokens["backendApp"] = `${appName}-backend`;
19853
+ tokens["frontendApp"] = `${appName}-frontend`;
19854
+ tokens["workspaceRoot"] = prefix || ".";
19855
+ tokens["dockerfileDev"] = prefix ? `${prefix}/Dockerfile.dev` : "Dockerfile.dev";
19856
+ tokens["envFile"] = prefix ? `${prefix}/.env` : ".env";
19857
+ tokens["generatedGlob"] = prefix ? `${prefix}/generated/default` : "generated/default";
19834
19858
  if (prefix) {
19835
19859
  tokens["prefix"] = prefix;
19836
19860
  tokens["appsRoot"] = `${prefix}/apps`;
@@ -19846,10 +19870,23 @@ var runCreate = async (name, opts) => {
19846
19870
  tokens["generatedTypesPath"] = "generated/default/types/src";
19847
19871
  tokens["generatedClientPath"] = "generated/default/client";
19848
19872
  }
19873
+ } else {
19874
+ tokens["regular"] = "true";
19875
+ tokens["dockerfileDev"] = "Dockerfile.dev";
19876
+ tokens["envFile"] = ".env";
19849
19877
  }
19850
19878
  if (frontend) {
19851
19879
  tokens["frontend"] = "true";
19852
19880
  }
19881
+ if (layout === "nx" && frontend) {
19882
+ tokens["nxFrontend"] = "true";
19883
+ }
19884
+ if (layout === "nx" && !frontend) {
19885
+ tokens["nxBackendOnly"] = "true";
19886
+ }
19887
+ if (postgres) {
19888
+ tokens["postgres"] = "true";
19889
+ }
19853
19890
  const templateRoot = resolveTemplateDir();
19854
19891
  const skipPaths = !frontend ? ["apps/frontend"] : [];
19855
19892
  if (layout === "nx") {
@@ -19872,12 +19909,12 @@ var runCreate = async (name, opts) => {
19872
19909
  );
19873
19910
  files.push(...workspaceFiles);
19874
19911
  if (opts.docker !== false) {
19875
- const dockerDir = resolve2(templateRoot, "docker");
19876
- const dockerFiles = await loadAndRenderTemplates(
19877
- dockerDir,
19878
- "",
19912
+ const dockerFiles = await renderDockerTemplates(
19913
+ templateRoot,
19879
19914
  tokens,
19880
- targetDir
19915
+ targetDir,
19916
+ workspaceTarget,
19917
+ { postgres }
19881
19918
  );
19882
19919
  files.push(...dockerFiles);
19883
19920
  }
@@ -19914,13 +19951,12 @@ var runCreate = async (name, opts) => {
19914
19951
  skipPaths
19915
19952
  );
19916
19953
  if (opts.docker !== false) {
19917
- const dockerTokens = { ...tokens, regular: "true" };
19918
- const dockerDir = resolve2(templateRoot, "docker");
19919
- const dockerFiles = await loadAndRenderTemplates(
19920
- dockerDir,
19921
- "",
19922
- dockerTokens,
19923
- targetDir
19954
+ const dockerFiles = await renderDockerTemplates(
19955
+ templateRoot,
19956
+ tokens,
19957
+ targetDir,
19958
+ targetDir,
19959
+ { postgres }
19924
19960
  );
19925
19961
  files.push(...dockerFiles);
19926
19962
  }
@@ -19949,7 +19985,7 @@ var runCreate = async (name, opts) => {
19949
19985
  const prefixFlag = prefix ? ` --prefix ${prefix}` : "";
19950
19986
  Me(
19951
19987
  [
19952
- opts.docker !== false ? "docker compose up -d # start postgres" : null,
19988
+ opts.docker !== false && postgres ? "docker compose up -d # start postgres" : null,
19953
19989
  `${pmRun} prisma:migrate # create initial migration`,
19954
19990
  `crouton update resources${prefixFlag} # generate resource CRUD`,
19955
19991
  `${pmRun} dev # start dev server`
@@ -19965,6 +20001,78 @@ var runCreate = async (name, opts) => {
19965
20001
  throw err;
19966
20002
  }
19967
20003
  };
20004
+ var renderDockerTemplates = async (templateRoot, tokens, targetDir, workspaceTarget, opts) => {
20005
+ const dockerDir = resolve2(templateRoot, "docker");
20006
+ const files = [];
20007
+ const composeYml = render(
20008
+ await loadTemplate(dockerDir, "compose.yml.tmpl"),
20009
+ tokens
20010
+ );
20011
+ files.push({ path: resolve2(targetDir, "compose.yml"), contents: composeYml });
20012
+ const composeApp = render(
20013
+ await loadTemplate(dockerDir, "compose.app.tmpl"),
20014
+ tokens
20015
+ );
20016
+ files.push({
20017
+ path: resolve2(targetDir, `compose.app.${tokens["appName"]}.yml`),
20018
+ contents: composeApp
20019
+ });
20020
+ if (opts.postgres) {
20021
+ const composeInfra = render(
20022
+ await loadTemplate(dockerDir, "compose.infra.yml.tmpl"),
20023
+ tokens
20024
+ );
20025
+ files.push({
20026
+ path: resolve2(targetDir, "compose.infra.yml"),
20027
+ contents: composeInfra
20028
+ });
20029
+ const envInfra = render(
20030
+ await loadTemplate(dockerDir, ".env.infra.tmpl"),
20031
+ tokens
20032
+ );
20033
+ files.push({
20034
+ path: resolve2(targetDir, ".env.infra"),
20035
+ contents: envInfra
20036
+ });
20037
+ const envInfraExample = render(
20038
+ await loadTemplate(dockerDir, ".env.infra.example.tmpl"),
20039
+ tokens
20040
+ );
20041
+ files.push({
20042
+ path: resolve2(targetDir, ".env.infra.example"),
20043
+ contents: envInfraExample
20044
+ });
20045
+ files.push({
20046
+ path: resolve2(targetDir, "docker/init-data/.gitkeep"),
20047
+ contents: ""
20048
+ });
20049
+ }
20050
+ const dockerfileDev = render(
20051
+ await loadTemplate(dockerDir, "Dockerfile.dev.tmpl"),
20052
+ tokens
20053
+ );
20054
+ files.push({
20055
+ path: resolve2(workspaceTarget, "Dockerfile.dev"),
20056
+ contents: dockerfileDev
20057
+ });
20058
+ const dockerfileProd = render(
20059
+ await loadTemplate(dockerDir, "Dockerfile.prod.tmpl"),
20060
+ tokens
20061
+ );
20062
+ files.push({
20063
+ path: resolve2(workspaceTarget, "Dockerfile.prod"),
20064
+ contents: dockerfileProd
20065
+ });
20066
+ const dockerignore = render(
20067
+ await loadTemplate(dockerDir, ".dockerignore.tmpl"),
20068
+ tokens
20069
+ );
20070
+ files.push({
20071
+ path: resolve2(targetDir, ".dockerignore"),
20072
+ contents: dockerignore
20073
+ });
20074
+ return files;
20075
+ };
19968
20076
  var postScaffold = async (opts, targetDir, pm, dbUrl, prefix) => {
19969
20077
  if (opts.git !== false) {
19970
20078
  const s = Y2();
@@ -20077,6 +20185,16 @@ var resolveDbUrl = async (opts) => {
20077
20185
  );
20078
20186
  return url2.trim();
20079
20187
  };
20188
+ var resolvePostgres = async (opts) => {
20189
+ if (opts.yes) return opts.postgres;
20190
+ if (!opts.postgres) return false;
20191
+ return assertNotCancel(
20192
+ await ye({
20193
+ message: "Run PostgreSQL in Docker?",
20194
+ initialValue: true
20195
+ })
20196
+ );
20197
+ };
20080
20198
  var loadAndRenderTemplates = async (templateDir, subPath, tokens, targetDir, skipPaths = []) => {
20081
20199
  const files = [];
20082
20200
  const dir = subPath ? resolve2(templateDir, subPath) : templateDir;
@@ -20105,7 +20223,7 @@ var loadAndRenderTemplates = async (templateDir, subPath, tokens, targetDir, ski
20105
20223
  };
20106
20224
 
20107
20225
  // 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) => {
20226
+ 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
20227
  try {
20110
20228
  await runCreate(name, opts);
20111
20229
  } catch (err) {