@hybridly/vite 0.0.1-alpha.1 → 0.0.1-alpha.10

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.cjs CHANGED
@@ -27,29 +27,37 @@ const debug = {
27
27
  layout: makeDebugger__default(LAYOUT_PLUGIN_NAME)
28
28
  };
29
29
 
30
- const TEMPLATE_LAYOUT_REGEX = /<template +layout(?: *= *['"](?:(?:(\w+):)?(\w+))['"] *)?>/;
30
+ const TEMPLATE_LAYOUT_REGEX = /<template +layout(?: *= *['"]((?:[\w\/-_,](?:,\ )?)+)['"] *)?>/;
31
31
  const TYPESCRIPT_REGEX = /lang=['"]ts['"]/;
32
32
  const layout = (options = {}) => {
33
+ const defaultLayoutName = options?.defaultLayoutName?.replace(".vue", "") ?? "default";
33
34
  const base = options?.directory ? options?.directory : path__default.resolve(process.cwd(), "resources", "views", "layouts");
34
- const layoutPath = options?.resolve ? options.resolve : (layoutName) => vite.normalizePath(path__default.resolve(base, `${layoutName ?? "default"}.vue`)).replaceAll("\\", "/");
35
+ const templateRegExp = options?.templateRegExp ? options?.templateRegExp : TEMPLATE_LAYOUT_REGEX;
36
+ const getLayoutPath = options?.resolve ? options.resolve : (layoutName) => vite.normalizePath(path__default.resolve(base, `${layoutName}.vue`)).replaceAll("\\", "/");
35
37
  debug.layout("Registered layout path:", base);
36
38
  return {
37
39
  name: LAYOUT_PLUGIN_NAME,
38
40
  transform: (code, id) => {
39
- if (!TEMPLATE_LAYOUT_REGEX.test(code)) {
41
+ if (!templateRegExp.test(code)) {
40
42
  return;
41
43
  }
42
- return code.replace(TEMPLATE_LAYOUT_REGEX, (_, __, layoutName) => {
44
+ return code.replace(templateRegExp, (_, layoutName) => {
43
45
  const isTypeScript = TYPESCRIPT_REGEX.test(code);
44
- const importPath = layoutPath(layoutName);
45
- debug.layout(`Resolved layout "${layoutName}":`, {
46
+ const layouts = layoutName?.toString()?.replaceAll(" ", "").split(",") ?? [defaultLayoutName];
47
+ const importName = (i) => `__hybridly_layout_${i}`;
48
+ const exports = layouts.map((_2, i) => importName(i));
49
+ const imports = layouts.reduce((imports2, layoutName2, i) => `
50
+ ${imports2}
51
+ import ${importName(i)} from '${getLayoutPath(layoutName2)}';
52
+ `, "").trim();
53
+ debug.layout(`Resolved layouts "${layouts.join(", ")}":`, {
46
54
  sourceFile: id,
47
- importPath
55
+ layouts
48
56
  });
49
57
  return `
50
58
  <script${isTypeScript ? ' lang="ts"' : ""}>
51
- import layout from '${importPath}'
52
- export default { layout }
59
+ ${imports}
60
+ export default { layout: [${exports.join(", ")}] }
53
61
  <\/script>
54
62
  <template>
55
63
  `;
@@ -78,17 +86,20 @@ function getClientCode(routes) {
78
86
 
79
87
  const shell = node_util.promisify(node_child_process.exec);
80
88
  async function fetchRoutesFromArtisan(options) {
81
- const php = options.php ?? "php";
82
- const result = await shell(`${php} artisan hybridly:routes`);
83
- const routes = JSON.parse(result.stdout);
84
- write(options, routes);
85
- return routes;
89
+ try {
90
+ const php = options.php ?? "php";
91
+ const result = await shell(`${php} artisan hybridly:routes`);
92
+ const routes = JSON.parse(result.stdout);
93
+ write(options, routes);
94
+ return routes;
95
+ } catch {
96
+ }
86
97
  }
87
98
 
88
99
  const write = throttleDebounce.debounce(1e3, writeDefinitions, { atBegin: true });
89
100
  async function writeDefinitions(options, collection) {
90
101
  collection ?? (collection = await fetchRoutesFromArtisan(options));
91
- if (options.dts === false) {
102
+ if (options.dts === false || !collection) {
92
103
  return;
93
104
  }
94
105
  debug.router("Writing types for route collection:", collection);
@@ -103,6 +114,7 @@ async function writeDefinitions(options, collection) {
103
114
  }];
104
115
  }));
105
116
  const definitions = generateDefinitions().replace("__URL__", collection?.url ?? "").replace("__ROUTES__", JSON.stringify(routes).replaceAll('"__key_placeholder__"', "any"));
117
+ fs__default.mkdirSync(path__default.dirname(target), { recursive: true });
106
118
  fs__default.writeFileSync(target, definitions, { encoding: "utf-8" });
107
119
  }
108
120
  function generateDefinitions() {
@@ -140,7 +152,7 @@ const router = (options = {}) => {
140
152
  return;
141
153
  }
142
154
  const routes = await fetchRoutesFromArtisan(resolved);
143
- if (JSON.stringify(routes) !== JSON.stringify(previousRoutes)) {
155
+ if (routes && JSON.stringify(routes) !== JSON.stringify(previousRoutes)) {
144
156
  debug.router("Updating routes via HMR:", routes);
145
157
  server.ws.send({
146
158
  type: "custom",
package/dist/index.d.ts CHANGED
@@ -7,6 +7,10 @@ interface Options {
7
7
  router?: false | RouterOptions;
8
8
  }
9
9
  interface LayoutOptions {
10
+ /** Name of the layout used when no argument is provided to `layout`. */
11
+ defaultLayoutName?: string;
12
+ /** Custom RegExp for parsing the template string. */
13
+ templateRegExp?: RegExp;
10
14
  /** The directory in which layouts are stored. */
11
15
  directory?: string;
12
16
  /** Function that resolves the layout path given its name. */
package/dist/index.mjs CHANGED
@@ -17,29 +17,37 @@ const debug = {
17
17
  layout: makeDebugger(LAYOUT_PLUGIN_NAME)
18
18
  };
19
19
 
20
- const TEMPLATE_LAYOUT_REGEX = /<template +layout(?: *= *['"](?:(?:(\w+):)?(\w+))['"] *)?>/;
20
+ const TEMPLATE_LAYOUT_REGEX = /<template +layout(?: *= *['"]((?:[\w\/-_,](?:,\ )?)+)['"] *)?>/;
21
21
  const TYPESCRIPT_REGEX = /lang=['"]ts['"]/;
22
22
  const layout = (options = {}) => {
23
+ const defaultLayoutName = options?.defaultLayoutName?.replace(".vue", "") ?? "default";
23
24
  const base = options?.directory ? options?.directory : path.resolve(process.cwd(), "resources", "views", "layouts");
24
- const layoutPath = options?.resolve ? options.resolve : (layoutName) => normalizePath(path.resolve(base, `${layoutName ?? "default"}.vue`)).replaceAll("\\", "/");
25
+ const templateRegExp = options?.templateRegExp ? options?.templateRegExp : TEMPLATE_LAYOUT_REGEX;
26
+ const getLayoutPath = options?.resolve ? options.resolve : (layoutName) => normalizePath(path.resolve(base, `${layoutName}.vue`)).replaceAll("\\", "/");
25
27
  debug.layout("Registered layout path:", base);
26
28
  return {
27
29
  name: LAYOUT_PLUGIN_NAME,
28
30
  transform: (code, id) => {
29
- if (!TEMPLATE_LAYOUT_REGEX.test(code)) {
31
+ if (!templateRegExp.test(code)) {
30
32
  return;
31
33
  }
32
- return code.replace(TEMPLATE_LAYOUT_REGEX, (_, __, layoutName) => {
34
+ return code.replace(templateRegExp, (_, layoutName) => {
33
35
  const isTypeScript = TYPESCRIPT_REGEX.test(code);
34
- const importPath = layoutPath(layoutName);
35
- debug.layout(`Resolved layout "${layoutName}":`, {
36
+ const layouts = layoutName?.toString()?.replaceAll(" ", "").split(",") ?? [defaultLayoutName];
37
+ const importName = (i) => `__hybridly_layout_${i}`;
38
+ const exports = layouts.map((_2, i) => importName(i));
39
+ const imports = layouts.reduce((imports2, layoutName2, i) => `
40
+ ${imports2}
41
+ import ${importName(i)} from '${getLayoutPath(layoutName2)}';
42
+ `, "").trim();
43
+ debug.layout(`Resolved layouts "${layouts.join(", ")}":`, {
36
44
  sourceFile: id,
37
- importPath
45
+ layouts
38
46
  });
39
47
  return `
40
48
  <script${isTypeScript ? ' lang="ts"' : ""}>
41
- import layout from '${importPath}'
42
- export default { layout }
49
+ ${imports}
50
+ export default { layout: [${exports.join(", ")}] }
43
51
  <\/script>
44
52
  <template>
45
53
  `;
@@ -68,17 +76,20 @@ function getClientCode(routes) {
68
76
 
69
77
  const shell = promisify(exec);
70
78
  async function fetchRoutesFromArtisan(options) {
71
- const php = options.php ?? "php";
72
- const result = await shell(`${php} artisan hybridly:routes`);
73
- const routes = JSON.parse(result.stdout);
74
- write(options, routes);
75
- return routes;
79
+ try {
80
+ const php = options.php ?? "php";
81
+ const result = await shell(`${php} artisan hybridly:routes`);
82
+ const routes = JSON.parse(result.stdout);
83
+ write(options, routes);
84
+ return routes;
85
+ } catch {
86
+ }
76
87
  }
77
88
 
78
89
  const write = debounce(1e3, writeDefinitions, { atBegin: true });
79
90
  async function writeDefinitions(options, collection) {
80
91
  collection ?? (collection = await fetchRoutesFromArtisan(options));
81
- if (options.dts === false) {
92
+ if (options.dts === false || !collection) {
82
93
  return;
83
94
  }
84
95
  debug.router("Writing types for route collection:", collection);
@@ -93,6 +104,7 @@ async function writeDefinitions(options, collection) {
93
104
  }];
94
105
  }));
95
106
  const definitions = generateDefinitions().replace("__URL__", collection?.url ?? "").replace("__ROUTES__", JSON.stringify(routes).replaceAll('"__key_placeholder__"', "any"));
107
+ fs.mkdirSync(path.dirname(target), { recursive: true });
96
108
  fs.writeFileSync(target, definitions, { encoding: "utf-8" });
97
109
  }
98
110
  function generateDefinitions() {
@@ -130,7 +142,7 @@ const router = (options = {}) => {
130
142
  return;
131
143
  }
132
144
  const routes = await fetchRoutesFromArtisan(resolved);
133
- if (JSON.stringify(routes) !== JSON.stringify(previousRoutes)) {
145
+ if (routes && JSON.stringify(routes) !== JSON.stringify(previousRoutes)) {
134
146
  debug.router("Updating routes via HMR:", routes);
135
147
  server.ws.send({
136
148
  type: "custom",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hybridly/vite",
3
- "version": "0.0.1-alpha.1",
3
+ "version": "0.0.1-alpha.10",
4
4
  "description": "A solution to develop server-driven, client-rendered applications",
5
5
  "keywords": [
6
6
  "hybridly",
@@ -39,13 +39,13 @@
39
39
  "vue": "^3.2.33"
40
40
  },
41
41
  "dependencies": {
42
- "@hybridly/core": "0.0.1-alpha.1",
42
+ "@hybridly/core": "0.0.1-alpha.10",
43
43
  "throttle-debounce": "^5.0.0"
44
44
  },
45
45
  "devDependencies": {
46
- "rollup": "^2.79.1",
47
- "vite": "^3.1.7",
48
- "vue": "^3.2.40"
46
+ "rollup": "^3.2.1",
47
+ "vite": "^3.1.8",
48
+ "vue": "^3.2.41"
49
49
  },
50
50
  "scripts": {
51
51
  "build": "unbuild",