primate 0.37.0 → 0.38.0

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 (43) hide show
  1. package/lib/bin.js +3 -2
  2. package/lib/commands/Command.d.ts +4 -0
  3. package/lib/commands/Command.js +2 -0
  4. package/lib/commands/build.d.ts +3 -2
  5. package/lib/commands/build.js +19 -16
  6. package/lib/commands/dev.d.ts +3 -2
  7. package/lib/commands/dev.js +4 -2
  8. package/lib/commands/index.d.ts +1 -4
  9. package/lib/commands/index.js +2 -5
  10. package/lib/commands/init.d.ts +3 -1
  11. package/lib/commands/init.js +48 -44
  12. package/lib/commands/migrate-apply.d.ts +3 -1
  13. package/lib/commands/migrate-apply.js +6 -8
  14. package/lib/commands/migrate-create.d.ts +3 -1
  15. package/lib/commands/migrate-create.js +10 -12
  16. package/lib/commands/migrate-status.d.ts +3 -1
  17. package/lib/commands/migrate-status.js +6 -9
  18. package/lib/commands/serve.d.ts +3 -1
  19. package/lib/commands/serve.js +7 -6
  20. package/lib/public/http/Status.d.ts +65 -1
  21. package/lib/public/http/Status.js +2 -1
  22. package/lib/public/{db.d.ts → memorydb.d.ts} +1 -1
  23. package/lib/public/{db.js → memorydb.js} +1 -1
  24. package/lib/public/response.d.ts +2 -2
  25. package/lib/public/store.d.ts +2 -0
  26. package/lib/public/store.js +2 -0
  27. package/package.json +12 -12
  28. package/lib/commands/get-flag.d.ts +0 -2
  29. package/lib/commands/get-flag.js +0 -5
  30. package/lib/commands/test.d.ts +0 -3
  31. package/lib/commands/test.js +0 -132
  32. package/lib/init.d.ts +0 -3
  33. package/lib/init.js +0 -9
  34. package/lib/private/test.d.ts +0 -31
  35. package/lib/private/test.js +0 -8
  36. package/lib/public/orm/key.d.ts +0 -2
  37. package/lib/public/orm/key.js +0 -2
  38. package/lib/public/orm/relation.d.ts +0 -2
  39. package/lib/public/orm/relation.js +0 -2
  40. package/lib/public/orm/store.d.ts +0 -2
  41. package/lib/public/orm/store.js +0 -2
  42. package/lib/public/test.d.ts +0 -2
  43. package/lib/public/test.js +0 -2
package/lib/bin.js CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import runtime from "@rcompat/runtime";
3
- import init from "./init.js";
4
- await init(...runtime.args);
3
+ import find from "./commands/index.js";
4
+ const [command] = runtime.args;
5
+ find(command)();
5
6
  //# sourceMappingURL=bin.js.map
@@ -0,0 +1,4 @@
1
+ import type { Mode } from "@primate/core";
2
+ type Command = (mode?: Mode) => any;
3
+ export type { Command as default };
4
+ //# sourceMappingURL=Command.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Command.js.map
@@ -1,3 +1,4 @@
1
- import type { Mode } from "@primate/core";
2
- export default function command_build(flags: string[], mode?: Mode): Promise<true | undefined>;
1
+ import type Command from "./Command.js";
2
+ declare const command_build: Command;
3
+ export default command_build;
3
4
  //# sourceMappingURL=build.d.ts.map
@@ -1,21 +1,24 @@
1
+ import core from "@primate/core";
1
2
  import build from "@primate/core/build";
2
- import c from "@rcompat/cli/color";
3
- import print from "@rcompat/cli/print";
4
- import fs from "@rcompat/fs";
5
- import get_flag from "./get-flag.js";
3
+ import Flags from "@primate/core/Flags";
4
+ import cli from "@rcompat/cli";
5
+ import runtime from "@rcompat/runtime";
6
6
  function orange(x) {
7
7
  return `\x1b[38;2;255;165;0m${x}\x1b[0m`;
8
8
  }
9
- export default async function command_build(flags, mode) {
10
- const { name, version, } = await (await fs.project.package(import.meta.dirname)).json();
11
- print(c.bold(orange((name.toUpperCase()))), orange(version), "\n\n");
12
- const root = await fs.project.root();
13
- const build_flags = {
14
- mode: mode ?? "production",
15
- target: get_flag(flags, "target"),
16
- dir: get_flag(flags, "dir"),
17
- };
18
- return build(root, build_flags);
19
- }
20
- ;
9
+ const command_build = async (mode) => {
10
+ const { name, version } = await runtime.packageJSON(import.meta.dirname);
11
+ cli.print(cli.fg.bold(orange((name.toUpperCase()))), orange(version), "\n\n");
12
+ const root = await runtime.projectRoot();
13
+ core.try(async () => {
14
+ const flags = Flags.parse({
15
+ mode: mode,
16
+ target: runtime.flags.try("--target"),
17
+ outdir: runtime.flags.try("--outdir"),
18
+ log: runtime.flags.try("--log"),
19
+ });
20
+ await build(root, flags);
21
+ });
22
+ };
23
+ export default command_build;
21
24
  //# sourceMappingURL=build.js.map
@@ -1,3 +1,4 @@
1
- declare const _default: () => Promise<true | undefined>;
2
- export default _default;
1
+ import type Command from "./Command.js";
2
+ declare const command_dev: Command;
3
+ export default command_dev;
3
4
  //# sourceMappingURL=dev.d.ts.map
@@ -1,4 +1,6 @@
1
1
  import build from "./build.js";
2
- // build for development
3
- export default () => build([], "development");
2
+ const command_dev = () => {
3
+ build("development");
4
+ };
5
+ export default command_dev;
4
6
  //# sourceMappingURL=dev.js.map
@@ -1,5 +1,2 @@
1
- import build from "./build.js";
2
- import migrate_create from "./migrate-create.js";
3
- import serve from "./serve.js";
4
- export default function run_command(command_flag?: string): typeof build | typeof serve | typeof migrate_create | (() => void);
1
+ export default function run_command(command_flag?: string): import("./Command.js").default;
5
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,4 @@
1
- import c from "@rcompat/cli/color";
2
- import print from "@rcompat/cli/print";
1
+ import cli from "@rcompat/cli";
3
2
  import build from "./build.js";
4
3
  import dev from "./dev.js";
5
4
  import init from "./init.js";
@@ -7,20 +6,18 @@ import migrate_apply from "./migrate-apply.js";
7
6
  import migrate_create from "./migrate-create.js";
8
7
  import migrate_status from "./migrate-status.js";
9
8
  import serve from "./serve.js";
10
- import test from "./test.js";
11
9
  const commands = {
12
10
  build,
13
11
  dev,
14
12
  init,
15
13
  serve,
16
- test,
17
14
  migrate_apply,
18
15
  migrate_create,
19
16
  migrate_status,
20
17
  };
21
18
  function unknown(command) {
22
19
  return () => {
23
- print(`Unknown command ${c.dim(command)}\n`);
20
+ cli.print(`Unknown command ${cli.fg.dim(command)}\n`);
24
21
  };
25
22
  }
26
23
  ;
@@ -1,2 +1,4 @@
1
- export default function init(): Promise<symbol>;
1
+ import type Command from "./Command.js";
2
+ declare const command_init: Command;
3
+ export default command_init;
2
4
  //# sourceMappingURL=init.d.ts.map
@@ -1,15 +1,8 @@
1
- import color from "@rcompat/cli/color";
2
- import cancel from "@rcompat/cli/prompts/cancel";
3
- import intro from "@rcompat/cli/prompts/intro";
4
- import is_cancel from "@rcompat/cli/prompts/is-cancel";
5
- import multiselect from "@rcompat/cli/prompts/multiselect";
6
- import outro from "@rcompat/cli/prompts/outro";
7
- import select from "@rcompat/cli/prompts/select";
8
- import text from "@rcompat/cli/prompts/text";
1
+ import core from "@primate/core";
2
+ import cli from "@rcompat/cli";
9
3
  import fs from "@rcompat/fs";
10
- function abort() {
11
- return cancel("Aborted");
12
- }
4
+ import is from "@rcompat/is";
5
+ import runtime_mod from "@rcompat/runtime";
13
6
  const FRONTEND_OPTIONS = [
14
7
  { label: "Angular", value: "angular" },
15
8
  { label: "Eta", value: "eta" },
@@ -29,13 +22,13 @@ const BACKEND_OPTIONS = [
29
22
  { label: "Go", value: "go" },
30
23
  { label: "Python", value: "python" },
31
24
  { label: "Ruby", value: "ruby" },
32
- { label: "Grain", value: "grain" },
33
25
  ];
34
26
  const DATABASE_OPTIONS = [
35
27
  { label: "SQLite", value: "sqlite" },
36
28
  { label: "PostgreSQL", value: "postgresql" },
37
29
  { label: "MySQL", value: "mysql" },
38
30
  { label: "MongoDB", value: "mongodb" },
31
+ { label: "Oracle", value: "oracledb" },
39
32
  ];
40
33
  // peer deps per frontend (npm names)
41
34
  const FRONTEND_PEER_DEPS = {
@@ -53,15 +46,23 @@ const FRONTEND_PEER_DEPS = {
53
46
  vue: ["vue"],
54
47
  "webc": [],
55
48
  };
56
- export default async function init() {
57
- intro("Create a new Primate app");
49
+ function abort() {
50
+ return cli.prompt.cancel("Aborted");
51
+ }
52
+ function is_cancel(x) {
53
+ return is.symbol(x) || prompt.isCancel(x);
54
+ }
55
+ const { prompt } = cli;
56
+ const command_init = async () => {
57
+ prompt.intro("Create a new Primate app");
58
58
  let directory;
59
59
  let target;
60
+ const log = core.logger(runtime_mod.flags.try("--log") ?? "warn");
60
61
  while (true) {
61
- const ans = await text({
62
+ const ans = await prompt.text({
62
63
  message: "Directory to create app?", initial: ".",
63
64
  });
64
- if (typeof ans === "symbol" || is_cancel(ans))
65
+ if (is.symbol(ans) || prompt.isCancel(ans))
65
66
  return abort();
66
67
  target = fs.ref(ans);
67
68
  if (await empty(target)) {
@@ -69,23 +70,23 @@ export default async function init() {
69
70
  break; // valid directory found, exit loop
70
71
  }
71
72
  // directory not empty, show error but continue loop
72
- console.log("Directory not empty, choose another.");
73
+ log.error("Directory not empty, choose another.");
73
74
  }
74
- const frontends = await multiselect({
75
+ const frontends = await prompt.multiselect({
75
76
  message: "Choose frontend (press Enter to skip)",
76
77
  options: FRONTEND_OPTIONS,
77
78
  initial: [],
78
79
  });
79
- if (typeof frontends === "symbol" || is_cancel(frontends))
80
+ if (is_cancel(frontends))
80
81
  return abort();
81
- const backends = await multiselect({
82
+ const backends = await prompt.multiselect({
82
83
  message: "Choose backend (press Enter to skip)",
83
84
  options: BACKEND_OPTIONS,
84
85
  initial: [],
85
86
  });
86
- if (typeof backends === "symbol" || is_cancel(backends))
87
+ if (is_cancel(backends))
87
88
  return abort();
88
- const runtime = await select({
89
+ const runtime = await prompt.select({
89
90
  message: "Choose runtime",
90
91
  options: [
91
92
  { label: "Node", value: "node" },
@@ -94,17 +95,17 @@ export default async function init() {
94
95
  ],
95
96
  initial: 0,
96
97
  });
97
- if (typeof runtime === "symbol" || is_cancel(runtime))
98
+ if (is_cancel(runtime))
98
99
  return abort();
99
- const dbs = await multiselect({
100
+ const dbs = await prompt.multiselect({
100
101
  message: "Choose a database (press Enter to skip)",
101
102
  options: DATABASE_OPTIONS,
102
103
  initial: [],
103
104
  });
104
- if (typeof dbs === "symbol" || is_cancel(dbs))
105
+ if (is_cancel(dbs))
105
106
  return abort();
106
107
  const db = dbs[0];
107
- const i18n = await select({
108
+ const i18n = await prompt.select({
108
109
  message: "Enable i18n?",
109
110
  options: [
110
111
  { label: "Yes", value: "yes" },
@@ -112,10 +113,10 @@ export default async function init() {
112
113
  ],
113
114
  initial: 1,
114
115
  });
115
- if (typeof i18n === "symbol" || is_cancel(i18n))
116
+ if (is_cancel(i18n))
116
117
  return abort();
117
118
  const with_i18n = i18n === "yes";
118
- const sessions = await select({
119
+ const sessions = await prompt.select({
119
120
  message: "Configure sessions?",
120
121
  options: [
121
122
  { label: "Yes", value: "yes" },
@@ -123,30 +124,30 @@ export default async function init() {
123
124
  ],
124
125
  initial: 1,
125
126
  });
126
- if (typeof sessions === "symbol" || is_cancel(sessions))
127
+ if (is_cancel(sessions))
127
128
  return abort();
128
- const withSessions = sessions === "yes";
129
+ const with_sessions = sessions === "yes";
129
130
  await target.create();
130
131
  await target.join("routes").create();
131
132
  await target.join("views").create();
132
- if (db !== undefined)
133
+ if (is.defined(db))
133
134
  await target.join("stores").create();
134
135
  // files
135
136
  await gitignore(target);
136
137
  await tsconfig_json(target, { frontends });
137
- await app_config(target, { frontends: frontends, backends: backends, runtime });
138
+ await app_config(target, { frontends, backends, runtime });
138
139
  if (with_i18n)
139
140
  await i18n_config(target);
140
- if (withSessions)
141
+ if (with_sessions)
141
142
  await session_config(target);
142
- if (db)
143
+ if (is.defined(db))
143
144
  await database_config(target, db);
144
- await package_json(target, { directory, runtime });
145
- const packages = compute_packages({ frontends: frontends, backends: backends, db });
145
+ await package_json(target, { directory, runtime: runtime });
146
+ const packages = compute_packages({ frontends, backends, db });
146
147
  const install = build_install_command(runtime, packages, directory);
147
- outro(`${color.green("done, now run")} ${color.dim(install.print)}`);
148
+ prompt.outro(`${cli.fg.green("done, now run")} ${cli.fg.dim(install.print)}`);
148
149
  process.exit();
149
- }
150
+ };
150
151
  async function empty(directory) {
151
152
  try {
152
153
  if (!(await directory.exists()))
@@ -259,7 +260,9 @@ async function package_json(root, c) {
259
260
  await pkgFile.writeJSON(pkg);
260
261
  }
261
262
  function safe(s) {
262
- return s.trim().toLowerCase().replace(/\s+/g, "-")
263
+ return s
264
+ .trim()
265
+ .toLowerCase().replace(/\s+/g, "-")
263
266
  .replace(/[^a-z0-9._-]/g, "") || "primate-app";
264
267
  }
265
268
  function to_ident(token) {
@@ -286,7 +289,7 @@ function compute_packages(args) {
286
289
  for (const b of args.backends)
287
290
  deps.add(`@primate/${b}`);
288
291
  // database → @primate/<token>, if selected
289
- if (args.db)
292
+ if (is.defined(args.db))
290
293
  deps.add(`@primate/${args.db}`);
291
294
  return {
292
295
  dependencies: Array.from(deps),
@@ -336,7 +339,7 @@ function build_install_command(runtime, packages, dir) {
336
339
  async function tsconfig_json(root, opts) {
337
340
  const is_react = opts.frontends.includes("react");
338
341
  const is_svelte = opts.frontends.includes("svelte");
339
- const tsconfig = {
342
+ const ts_config = {
340
343
  extends: "primate/tsconfig",
341
344
  compilerOptions: {
342
345
  baseUrl: "${configDir}",
@@ -364,9 +367,10 @@ async function tsconfig_json(root, opts) {
364
367
  exclude: ["node_modules"],
365
368
  };
366
369
  if (is_react)
367
- tsconfig.compilerOptions.jsx = "react-jsx";
370
+ ts_config.compilerOptions.jsx = "react-jsx";
368
371
  if (is_svelte)
369
- tsconfig.compilerOptions.plugins = [{ name: "@plsp/svelte" }];
370
- await root.join("tsconfig.json").writeJSON(tsconfig);
372
+ ts_config.compilerOptions.plugins = [{ name: "@plsp/svelte" }];
373
+ await root.join("tsconfig.json").writeJSON(ts_config);
371
374
  }
375
+ export default command_init;
372
376
  //# sourceMappingURL=init.js.map
@@ -1,2 +1,4 @@
1
- export default function command_migrate_apply(): Promise<void>;
1
+ import type Command from "./Command.js";
2
+ declare const command_migrate_apply: Command;
3
+ export default command_migrate_apply;
2
4
  //# sourceMappingURL=migrate-apply.d.ts.map
@@ -1,12 +1,10 @@
1
+ import core from "@primate/core";
1
2
  import migrate from "@primate/core/db/migrate";
2
- import log from "@primate/core/log";
3
- export default async function command_migrate_apply() {
4
- try {
3
+ const command_migrate_apply = async () => {
4
+ core.try(async () => {
5
5
  await migrate.apply();
6
- }
7
- catch (cause) {
8
- log.error(cause);
9
- }
10
- }
6
+ });
7
+ };
11
8
  ;
9
+ export default command_migrate_apply;
12
10
  //# sourceMappingURL=migrate-apply.js.map
@@ -1,2 +1,4 @@
1
- export default function command_migrate_create(flags: string[]): Promise<void>;
1
+ import type Command from "./Command.js";
2
+ declare const command_migrate_create: Command;
3
+ export default command_migrate_create;
2
4
  //# sourceMappingURL=migrate-create.d.ts.map
@@ -1,23 +1,21 @@
1
+ import core from "@primate/core";
1
2
  import migrate from "@primate/core/db/migrate";
2
- import log from "@primate/core/log";
3
3
  import error from "@rcompat/error";
4
- const n = "--name";
4
+ import runtime from "@rcompat/runtime";
5
+ const name_flag = "--name";
5
6
  function create_requires_name_flag() {
6
- return error.template `migrate:create requires a ${n} flag`;
7
+ return error.template `migrate:create requires a ${name_flag} flag`;
7
8
  }
8
9
  const errors = error.coded({
9
10
  create_requires_name_flag,
10
11
  });
11
- export default async function command_migrate_create(flags) {
12
- const name = flags.find(f => f.startsWith(`${n}=`))?.slice(`${n}=`.length);
13
- try {
12
+ const command_migrate_create = async () => {
13
+ const name = runtime.flags.try(name_flag);
14
+ core.try(async () => {
14
15
  if (name === undefined)
15
16
  throw errors.create_requires_name_flag();
16
17
  await migrate.create(name);
17
- }
18
- catch (cause) {
19
- log.error(cause);
20
- }
21
- }
22
- ;
18
+ });
19
+ };
20
+ export default command_migrate_create;
23
21
  //# sourceMappingURL=migrate-create.js.map
@@ -1,2 +1,4 @@
1
- export default function command_migrate_status(): Promise<void>;
1
+ import type Command from "./Command.js";
2
+ declare const command_migrate_status: Command;
3
+ export default command_migrate_status;
2
4
  //# sourceMappingURL=migrate-status.d.ts.map
@@ -1,12 +1,9 @@
1
+ import core from "@primate/core";
1
2
  import migrate from "@primate/core/db/migrate";
2
- import log from "@primate/core/log";
3
- export default async function command_migrate_status() {
4
- try {
3
+ const command_migrate_status = async () => {
4
+ core.try(async () => {
5
5
  await migrate.status();
6
- }
7
- catch (cause) {
8
- log.error(cause);
9
- }
10
- }
11
- ;
6
+ });
7
+ };
8
+ export default command_migrate_status;
12
9
  //# sourceMappingURL=migrate-status.js.map
@@ -1,2 +1,4 @@
1
- export default function app(flags?: string[]): Promise<any>;
1
+ import type Command from "./Command.js";
2
+ declare const command_serve: Command;
3
+ export default command_serve;
2
4
  //# sourceMappingURL=serve.d.ts.map
@@ -1,16 +1,17 @@
1
1
  import fs from "@rcompat/fs";
2
- import get_flag from "./get-flag.js";
2
+ import runtime from "@rcompat/runtime";
3
3
  const load = async () => {
4
4
  try {
5
- return await fs.project.root();
5
+ return await runtime.projectRoot();
6
6
  }
7
7
  catch {
8
8
  return fs.resolve();
9
9
  }
10
10
  };
11
+ const command_serve = async () => {
12
+ const outdir = runtime.flags.try("--outdir") ?? "build";
13
+ return (await load()).join(`./${outdir}/server.js`).import();
14
+ };
11
15
  // serve from build directory
12
- export default async function app(flags = []) {
13
- const dir = get_flag(flags, "dir") ?? "build";
14
- return (await load()).join(`./${dir}/server.js`).import();
15
- }
16
+ export default command_serve;
16
17
  //# sourceMappingURL=serve.js.map
@@ -1,2 +1,66 @@
1
- export { Status as default } from "@rcompat/http";
1
+ declare const _default: Readonly<{
2
+ ACCEPTED: 202;
3
+ ALREADY_REPORTED: 208;
4
+ BAD_GATEWAY: 502;
5
+ BAD_REQUEST: 400;
6
+ CONFLICT: 409;
7
+ CONTINUE: 100;
8
+ CREATED: 201;
9
+ EARLY_HINTS: 103;
10
+ EXPECTATION_FAILED: 417;
11
+ FAILED_DEPENDENCY: 424;
12
+ FORBIDDEN: 403;
13
+ FOUND: 302;
14
+ GATEWAY_TIMEOUT: 504;
15
+ GONE: 410;
16
+ HTTP_VERSION_NOT_SUPPORTED: 505;
17
+ IM_A_TEAPOT: 418;
18
+ IM_USED: 226;
19
+ INSUFFICIENT_STORAGE: 507;
20
+ INTERNAL_SERVER_ERROR: 500;
21
+ LENGTH_REQUIRED: 411;
22
+ LOCKED: 423;
23
+ LOOP_DETECTED: 508;
24
+ METHOD_NOT_ALLOWED: 405;
25
+ MISDIRECTED_REQUEST: 421;
26
+ MOVED_PERMANENTLY: 301;
27
+ MULTIPLE_CHOICES: 300;
28
+ NETWORK_AUTHENTICATION_REQUIRED: 511;
29
+ NO_CONTENT: 204;
30
+ NON_AUTHORITATIVE_INFORMATION: 203;
31
+ NOT_ACCEPTABLE: 406;
32
+ NOT_EXTENDED: 510;
33
+ NOT_FOUND: 404;
34
+ NOT_IMPLEMENTED: 501;
35
+ NOT_MODIFIED: 304;
36
+ OK: 200;
37
+ PARTIAL_CONTENT: 206;
38
+ PAYLOAD_TOO_LARGE: 413;
39
+ PAYMENT_REQUIRED: 402;
40
+ PERMANENT_REDIRECT: 308;
41
+ PRECONDITION_FAILED: 412;
42
+ PRECONDITION_REQUIRED: 428;
43
+ PROCESS: 102;
44
+ PROXY_AUTHENTICATION_REQUIRED: 407;
45
+ RANGE_NOT_SATISFIABLE: 416;
46
+ REQUEST_HEADER_FIELDS_TOO_LARGE: 431;
47
+ REQUEST_TIMEOUT: 408;
48
+ RESET_CONTENT: 205;
49
+ SEE_OTHER: 303;
50
+ SERVICE_UNAVAILABLE: 503;
51
+ SWITCH_PROXY: 306;
52
+ SWITCHING_PROTOCOLS: 101;
53
+ TEMPORARY_REDIRECT: 307;
54
+ TOO_EARLY: 425;
55
+ TOO_MANY_REQUESTS: 429;
56
+ UNAUTHORIZED: 401;
57
+ UNAVAILABLE_FOR_LEGAL_REASONS: 451;
58
+ UNPROCESSABLE_ENTITY: 422;
59
+ UNSUPPORTED_MEDIA_TYPE: 415;
60
+ UPGRADE_REQUIRED: 426;
61
+ URI_TOO_LONG: 414;
62
+ USE_PROXY: 305;
63
+ VARIANT_ALSO_NEGOTIATES: 506;
64
+ }>;
65
+ export default _default;
2
66
  //# sourceMappingURL=Status.d.ts.map
@@ -1,2 +1,3 @@
1
- export { Status as default } from "@rcompat/http";
1
+ import http from "@rcompat/http";
2
+ export default http.Status;
2
3
  //# sourceMappingURL=Status.js.map
@@ -1,4 +1,4 @@
1
1
  import MemoryDB from "@primate/core/db/MemoryDB";
2
2
  declare const _default: () => MemoryDB;
3
3
  export default _default;
4
- //# sourceMappingURL=db.d.ts.map
4
+ //# sourceMappingURL=memorydb.d.ts.map
@@ -1,3 +1,3 @@
1
1
  import MemoryDB from "@primate/core/db/MemoryDB";
2
2
  export default () => new MemoryDB();
3
- //# sourceMappingURL=db.js.map
3
+ //# sourceMappingURL=memorydb.js.map
@@ -1,4 +1,4 @@
1
- export type { ServeApp } from "@primate/core";
1
+ export type { ServeApp, ResponseFunction } from "@primate/core";
2
2
  export type { ViewResponse } from "@primate/core/client";
3
- export { default, type ResponseFunction } from "@primate/core/response";
3
+ export { default } from "@primate/core/response";
4
4
  //# sourceMappingURL=response.d.ts.map
@@ -0,0 +1,2 @@
1
+ export { default } from "@primate/core/store";
2
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1,2 @@
1
+ export { default } from "@primate/core/store";
2
+ //# sourceMappingURL=store.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "primate",
3
- "version": "0.37.0",
3
+ "version": "0.38.0",
4
4
  "description": "The universal web framework",
5
5
  "homepage": "https://primate.run",
6
6
  "bugs": "https://github.com/primate-run/primate/issues",
@@ -20,17 +20,18 @@
20
20
  "bin": "lib/bin.js",
21
21
  "types": "lib/index.d.ts",
22
22
  "dependencies": {
23
- "@rcompat/cli": "^0.18.1",
24
- "@rcompat/dict": "^0.5.1",
25
- "@rcompat/error": "^0.3.1",
26
- "@rcompat/fs": "^0.28.1",
27
- "@rcompat/http": "~0.25.1",
28
- "@rcompat/runtime": "^0.11.1",
29
- "@rcompat/test": "^0.12.2",
30
- "@primate/core": "^0.6.0"
23
+ "@rcompat/cli": "^0.24.0",
24
+ "@rcompat/dict": "^0.10.0",
25
+ "@rcompat/error": "^0.8.0",
26
+ "@rcompat/fs": "^0.33.2",
27
+ "@rcompat/http": "~0.30.0",
28
+ "@rcompat/is": "^0.11.0",
29
+ "@rcompat/runtime": "^0.16.0",
30
+ "@rcompat/test": "^0.17.0",
31
+ "@primate/core": "^0.7.0"
31
32
  },
32
33
  "devDependencies": {
33
- "@rcompat/type": "^0.11.1"
34
+ "@rcompat/type": "^0.17.0"
34
35
  },
35
36
  "engines": {
36
37
  "node": ">=24"
@@ -60,7 +61,6 @@
60
61
  "scripts": {
61
62
  "build": "npm run clean && tsc && cp src/app.tsconfig.json lib && cp src/types/app.d.ts lib && cp src/types/index.d.ts lib",
62
63
  "clean": "rm -rf ./lib",
63
- "lint": "eslint .",
64
- "test": "npx proby"
64
+ "lint": "eslint ."
65
65
  }
66
66
  }
@@ -1,2 +0,0 @@
1
- export default function get_flag(flags: string[], option: string): string | undefined;
2
- //# sourceMappingURL=get-flag.d.ts.map
@@ -1,5 +0,0 @@
1
- export default function get_flag(flags, option) {
2
- const flag = `--${option}=`;
3
- return flags.find(f => f.startsWith(flag))?.slice(flag.length);
4
- }
5
- //# sourceMappingURL=get-flag.js.map
@@ -1,3 +0,0 @@
1
- declare const _default: () => Promise<void>;
2
- export default _default;
3
- //# sourceMappingURL=test.d.ts.map
@@ -1,132 +0,0 @@
1
- import { tests } from "#test";
2
- import build from "@primate/core/build";
3
- import color from "@rcompat/cli/color";
4
- import entries from "@rcompat/dict/entries";
5
- import fs from "@rcompat/fs";
6
- import equals from "@rcompat/test/equals";
7
- import includes from "@rcompat/test/includes";
8
- import serve from "./serve.js";
9
- const directory = "test";
10
- const fetch_options = { redirect: "manual" };
11
- const first_error = (left, right) => {
12
- const length = left.length > right.length ? right.length : left.length;
13
- for (let i = 0; i < length; i++) {
14
- if (left[i] !== right[i]) {
15
- return i;
16
- }
17
- }
18
- };
19
- export default async () => {
20
- await build(await fs.project.root(), { mode: "testing" });
21
- const app = (await serve()).default;
22
- const files = await (await fs.project.root()).join(directory)
23
- .list({ filter: f => f.path.endsWith(".ts") || f.path.endsWith(".js") });
24
- // side effects
25
- await Promise.all(files.map(file => file.import()));
26
- for (const test of tests) {
27
- let init;
28
- let path;
29
- const route = test.route;
30
- if (typeof route === "string") {
31
- path = route;
32
- init = new Request(`${app.url}${route}`);
33
- }
34
- else {
35
- path = route.url.replace(app.url, "");
36
- init = new Request(route.url, {
37
- body: route.body,
38
- // @ts-expect-error nonsense
39
- duplex: "half",
40
- headers: route.headers,
41
- method: route.method,
42
- });
43
- }
44
- const response = await fetch(init, fetch_options);
45
- const checks = [];
46
- const mocked_response = {
47
- body: {
48
- equals(expected) {
49
- checks.push(async () => {
50
- const actual = await (typeof expected === "string"
51
- ? response.text()
52
- : response.json());
53
- return [equals(actual, expected), expected, actual];
54
- });
55
- },
56
- includes(expected) {
57
- checks.push(async () => {
58
- const actual = await (typeof expected === "string"
59
- ? response.text()
60
- : response.json());
61
- const $expected = typeof expected === "string"
62
- ? expected.replaceAll("\n", "").replaceAll(" ", "")
63
- : expected;
64
- return [includes(actual, $expected), $expected, actual];
65
- });
66
- },
67
- },
68
- headers: {
69
- get(name) {
70
- const actual = response.headers.get(name);
71
- return {
72
- equals(expected) {
73
- checks.push(() => {
74
- return [equals(actual, expected), expected, actual];
75
- });
76
- },
77
- includes(expected) {
78
- checks.push(() => {
79
- return [includes(actual, expected), expected, actual];
80
- });
81
- },
82
- };
83
- },
84
- includes(expected) {
85
- checks.push(() => {
86
- const actual = Object.fromEntries(response.headers.entries());
87
- const lowercased = entries(expected)
88
- .keymap(([key]) => key.toLowerCase()).get();
89
- return [includes(actual, lowercased), lowercased, actual];
90
- });
91
- },
92
- },
93
- status: {
94
- equals(status) {
95
- checks.push(() => {
96
- return [response.status === status, status, response.status];
97
- });
98
- },
99
- },
100
- };
101
- test.tester(mocked_response);
102
- const results = await Promise.all(checks.map(async (check) => {
103
- try {
104
- return await check();
105
- }
106
- catch (error) {
107
- console.log(error);
108
- return [
109
- false, "()", "test execution failed",
110
- ];
111
- }
112
- }));
113
- const failed = results.find(result => !result[0]);
114
- const verb = test.verb.toUpperCase();
115
- if (failed !== undefined) {
116
- const route_text = typeof test.route === "string"
117
- ? test.route
118
- : new URL(test.route.url).pathname;
119
- console.log(color.red(`${verb} ${route_text}`));
120
- const expected = JSON.stringify(failed[1]);
121
- const actual = JSON.stringify(failed[2]);
122
- const n = first_error(expected, actual);
123
- console.log(`expected: ${expected.slice(0, n)}${color.green(expected[n])}${expected.slice(n + 1)}`);
124
- console.log(`actual: ${actual.slice(0, n)}${color.red(actual[n])}${actual.slice(n + 1)}`);
125
- }
126
- else {
127
- console.log(color.green(`${verb} ${path}`));
128
- }
129
- }
130
- await app.stop();
131
- };
132
- //# sourceMappingURL=test.js.map
package/lib/init.d.ts DELETED
@@ -1,3 +0,0 @@
1
- declare const _default: (...args: string[]) => Promise<void>;
2
- export default _default;
3
- //# sourceMappingURL=init.d.ts.map
package/lib/init.js DELETED
@@ -1,9 +0,0 @@
1
- import find from "./commands/index.js";
2
- function orange(x) {
3
- return `\x1b[38;2;255;165;0m${x}\x1b[0m`;
4
- }
5
- export default async (...args) => {
6
- const [command, ...flags] = args;
7
- find(command)(flags);
8
- };
9
- //# sourceMappingURL=init.js.map
@@ -1,31 +0,0 @@
1
- import verbs from "@primate/core/request/verbs";
2
- import type { Dict, JSONValue } from "@rcompat/type";
3
- export type Body = JSONValue;
4
- export type MockedResponse = {
5
- body: {
6
- equals(body: Body): void;
7
- includes(body: Body): void;
8
- };
9
- headers: {
10
- get(header: string): {
11
- equals(value: string): void;
12
- includes(value: string): void;
13
- };
14
- includes(headers: Dict<string>): void;
15
- };
16
- status: {
17
- equals(status: number): void;
18
- };
19
- };
20
- type Verb = typeof verbs[number];
21
- type Tester = (response: MockedResponse) => void;
22
- type Route = string;
23
- type Test = {
24
- route: Request | Route;
25
- tester: Tester;
26
- verb: Verb;
27
- };
28
- export declare const tests: Test[];
29
- declare const _default: { [K in Verb]: (path: Request | Route, tester: Tester) => void; };
30
- export default _default;
31
- //# sourceMappingURL=test.d.ts.map
@@ -1,8 +0,0 @@
1
- import verbs from "@primate/core/request/verbs";
2
- export const tests = [];
3
- export default {
4
- ...Object.fromEntries(verbs.map(verb => [verb, (route, tester) => {
5
- tests.push({ route, tester, verb });
6
- }])),
7
- };
8
- //# sourceMappingURL=test.js.map
@@ -1,2 +0,0 @@
1
- export { default } from "@primate/core/orm/key";
2
- //# sourceMappingURL=key.d.ts.map
@@ -1,2 +0,0 @@
1
- export { default } from "@primate/core/orm/key";
2
- //# sourceMappingURL=key.js.map
@@ -1,2 +0,0 @@
1
- export { default } from "@primate/core/orm/relation";
2
- //# sourceMappingURL=relation.d.ts.map
@@ -1,2 +0,0 @@
1
- export { default } from "@primate/core/orm/relation";
2
- //# sourceMappingURL=relation.js.map
@@ -1,2 +0,0 @@
1
- export { default } from "@primate/core/orm/store";
2
- //# sourceMappingURL=store.d.ts.map
@@ -1,2 +0,0 @@
1
- export { default } from "@primate/core/orm/store";
2
- //# sourceMappingURL=store.js.map
@@ -1,2 +0,0 @@
1
- export { default } from "#test";
2
- //# sourceMappingURL=test.d.ts.map
@@ -1,2 +0,0 @@
1
- export { default } from "#test";
2
- //# sourceMappingURL=test.js.map