@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 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({})),
@@ -19523,11 +19538,17 @@ var ViewColumnConfigSchema = external_exports.object({
19523
19538
  fieldInput: FieldInputSchema.optional()
19524
19539
  });
19525
19540
  var ViewConfigSchema = external_exports.object({
19526
- json_schema: external_exports.record(external_exports.string(), external_exports.unknown()),
19527
- ui_schema: external_exports.record(external_exports.string(), external_exports.unknown()),
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.42" : "latest",
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"] = "backend";
19833
- tokens["frontendApp"] = "frontend";
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 dockerDir = resolve2(templateRoot, "docker");
19876
- const dockerFiles = await loadAndRenderTemplates(
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 dockerTokens = { ...tokens, regular: "true" };
19918
- const dockerDir = resolve2(templateRoot, "docker");
19919
- const dockerFiles = await loadAndRenderTemplates(
19920
- dockerDir,
19921
- "",
19922
- dockerTokens,
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) {