@arkstack/view 0.4.3 → 0.5.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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @arkstack/view
2
2
 
3
- Views for Arkstack applications.
3
+ View module for Arkstack, providing template rendering and view integration utilities.
4
4
 
5
5
  ```ts
6
6
  import { View, view } from '@arkstack/view';
@@ -1,7 +1,6 @@
1
1
  import { dirname, resolve } from "node:path";
2
2
  import { mkdir, writeFile } from "node:fs/promises";
3
3
  import { Command } from "@h3ravel/musket";
4
-
5
4
  //#region src/commands/MakeViewCommand.ts
6
5
  var MakeViewCommand = class extends Command {
7
6
  signature = `make:view
@@ -34,7 +33,5 @@ var MakeViewCommand = class extends Command {
34
33
  ].join("\n");
35
34
  }
36
35
  };
37
-
38
36
  //#endregion
39
37
  export { MakeViewCommand };
40
- //# sourceMappingURL=MakeViewCommand.js.map
package/dist/index.d.ts CHANGED
@@ -53,7 +53,7 @@ declare class ViewFactory {
53
53
  constructor(options?: ViewFactoryOptions);
54
54
  make(name: ViewName, data?: ViewData): ViewInstance;
55
55
  first(names: ViewName[], data?: ViewData): ViewInstance;
56
- exists(name: ViewName): boolean;
56
+ exists(name: ViewName): any;
57
57
  share(key: string, value: any): this;
58
58
  share(data: ViewData): this;
59
59
  composer(names: ViewComposerName, composer: ViewComposer): this;
@@ -76,7 +76,7 @@ declare class View {
76
76
  static factoryInstance(): ViewFactory;
77
77
  static make(name: ViewName, data?: ViewData): ViewInstance;
78
78
  static first(names: ViewName[], data?: ViewData): ViewInstance;
79
- static exists(name: ViewName): boolean;
79
+ static exists(name: ViewName): any;
80
80
  static share(key: string, value: any): typeof View;
81
81
  static share(data: ViewData): typeof View;
82
82
  static composer(names: ViewComposerName, composer: ViewComposer): typeof View;
@@ -99,7 +99,7 @@ type PackageViewReference = {
99
99
  edgeName: string;
100
100
  };
101
101
  declare const parsePackageViewName: (name: string) => PackageViewReference | null;
102
- declare const resolvePackageViewsPath: (nodePackageName: string, viewPath?: string) => string;
102
+ declare const resolvePackageViewsPath: (nodePackageName: string, viewPath?: string) => any;
103
103
  //#endregion
104
104
  export { ComposerRunner, Edge, SyncComposerRunner, View, ViewComposer, ViewComposerClass, ViewComposerHandler, ViewComposerName, ViewComposerObject, ViewData, ViewFactory, ViewFactoryOptions, ViewInstance, ViewName, edge, parsePackageViewName, resolvePackageViewsPath, view };
105
105
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import { existsSync } from "node:fs";
2
2
  import { resolve } from "node:path";
3
3
  import edge, { Edge, Edge as Edge$1 } from "edge.js";
4
-
5
4
  //#region src/helpers.ts
6
5
  function view(name, data = {}) {
7
6
  if (name === void 0) return View.factoryInstance();
@@ -30,7 +29,6 @@ const runComposer = (composer, view) => {
30
29
  }
31
30
  return composer.compose(view);
32
31
  };
33
-
34
32
  //#endregion
35
33
  //#region src/packageViews.ts
36
34
  const parsePackageViewName = (name) => {
@@ -58,10 +56,14 @@ const resolvePackageViewsPath = (nodePackageName, viewPath = "resources/views")
58
56
  if (!existsSync(viewsPath)) throw new Error(`Package views directory not found: ${viewsPath}`);
59
57
  return viewsPath;
60
58
  };
61
-
62
59
  //#endregion
63
60
  //#region src/ViewInstance.ts
64
61
  var ViewInstance = class {
62
+ name;
63
+ renderer;
64
+ runComposers;
65
+ runComposersSync;
66
+ renderName;
65
67
  payload;
66
68
  composersHaveRun = false;
67
69
  constructor(name, data = {}, renderer, runComposers, runComposersSync, renderName = name) {
@@ -101,7 +103,6 @@ var ViewInstance = class {
101
103
  this.runComposersSync(this);
102
104
  }
103
105
  };
104
-
105
106
  //#endregion
106
107
  //#region src/ViewFactory.ts
107
108
  var ViewFactory = class {
@@ -188,7 +189,6 @@ var ViewFactory = class {
188
189
  return packageView.edgeName;
189
190
  }
190
191
  };
191
-
192
192
  //#endregion
193
193
  //#region src/View.ts
194
194
  var View = class View {
@@ -241,7 +241,7 @@ var View = class View {
241
241
  return this;
242
242
  }
243
243
  };
244
-
245
244
  //#endregion
246
245
  export { Edge, View, ViewFactory, ViewInstance, edge, parsePackageViewName, resolvePackageViewsPath, view };
246
+
247
247
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Edge"],"sources":["../src/helpers.ts","../src/packageViews.ts","../src/ViewInstance.ts","../src/ViewFactory.ts","../src/View.ts"],"sourcesContent":["import type { ViewComposer, ViewComposerObject, ViewData, ViewName } from './types'\n\nimport { View } from './View'\nimport { ViewFactory } from './ViewFactory'\nimport { ViewInstance } from './ViewInstance'\n\nexport function view (): ViewFactory\nexport function view (name: ViewName, data?: ViewData): ViewInstance\nexport function view (name?: ViewName, data: ViewData = {}) {\n if (name === undefined) {\n return View.factoryInstance()\n }\n\n return View.make(name, data)\n}\n\nexport const isClass = <T = unknown> (\n target: unknown\n): target is new (...args: any[]) => T => {\n return typeof target === 'function'\n && /^class\\s/.test(Function.prototype.toString.call(target))\n}\n\nexport const mergeData = (target: ViewData, data: any[]) => {\n if (data.length === 0) {\n return target\n }\n\n if (typeof data[0] === 'string') {\n target[data[0]] = data[1]\n\n return target\n }\n\n for (const value of data) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(target, value)\n }\n }\n\n return target\n}\n\nexport const runComposerSync = (composer: ViewComposer, view: ViewInstance) => {\n const result = runComposer(composer, view)\n\n if (result && typeof result.then === 'function') {\n throw new Error('Async view composers cannot be used with renderSync.')\n }\n}\n\nexport const runComposer = (composer: ViewComposer, view: ViewInstance) => {\n if (typeof composer === 'function') {\n if (isClass<ViewComposerObject>(composer)) {\n return new composer().compose(view)\n }\n\n return composer(view)\n }\n\n return composer.compose(view)\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport type PackageViewReference = {\n source: string\n packageName: string\n nodePackageName: string\n diskName: string\n viewName: string\n edgeName: string\n}\n\nexport const parsePackageViewName = (name: string): PackageViewReference | null => {\n if (!name.startsWith('~')) {\n return null\n }\n\n const source = name.slice(1)\n const slashIndex = source.indexOf('/')\n const dotIndex = slashIndex === -1\n ? source.indexOf('.')\n : source.indexOf('.', slashIndex)\n\n if (dotIndex <= 0) {\n throw new Error(`Invalid package view name: ${name}`)\n }\n\n const packageName = source.slice(0, dotIndex)\n const viewName = source.slice(dotIndex + 1)\n\n if (!viewName) {\n throw new Error(`Invalid package view name: ${name}`)\n }\n\n const nodePackageName = slashIndex === -1\n ? packageName\n : `@${packageName}`\n const diskName = `package_${packageName.replace(/[^a-zA-Z0-9_-]/g, '_')}`\n\n return {\n source: name,\n packageName,\n nodePackageName,\n diskName,\n viewName,\n edgeName: `${diskName}::${viewName}`,\n }\n}\n\nexport const resolvePackageViewsPath = (\n nodePackageName: string,\n viewPath = 'resources/views',\n) => {\n const packageRoot = resolve(process.cwd(), 'node_modules', nodePackageName)\n const viewsPath = resolve(packageRoot, viewPath)\n\n if (!existsSync(viewsPath)) {\n throw new Error(`Package views directory not found: ${viewsPath}`)\n }\n\n return viewsPath\n}\n","import type { ComposerRunner, SyncComposerRunner, ViewData } from './types'\n\nimport { mergeData } from './helpers'\n\nexport class ViewInstance implements PromiseLike<string> {\n private payload: ViewData\n private composersHaveRun = false\n\n constructor(\n readonly name: string,\n data: ViewData = {},\n private renderer: {\n render: (name: string, data?: ViewData) => Promise<string>\n renderSync: (name: string, data?: ViewData) => string\n },\n private runComposers: ComposerRunner,\n private runComposersSync: SyncComposerRunner,\n private renderName = name,\n ) {\n this.payload = { ...data }\n }\n\n get data () {\n return this.payload\n }\n\n with (key: string, value: any): this\n with (data: ViewData): this\n with (...data: any[]): this {\n mergeData(this.payload, data)\n\n return this\n }\n\n async render () {\n await this.compose()\n\n return await this.renderer.render(this.renderName, this.payload)\n }\n\n renderSync () {\n this.composeSync()\n\n return this.renderer.renderSync(this.renderName, this.payload)\n }\n\n then<TResult1 = string, TResult2 = never> (\n onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.render().then(onfulfilled, onrejected)\n }\n\n private async compose () {\n if (this.composersHaveRun) {\n return\n }\n\n this.composersHaveRun = true\n await this.runComposers(this)\n }\n\n private composeSync () {\n if (this.composersHaveRun) {\n return\n }\n\n this.composersHaveRun = true\n this.runComposersSync(this)\n }\n}\n","import type { ViewComposer, ViewComposerName, ViewData, ViewFactoryOptions, ViewName } from './types'\nimport { mergeData, runComposer, runComposerSync } from './helpers'\nimport { parsePackageViewName, resolvePackageViewsPath } from './packageViews'\n\nimport { Edge } from 'edge.js'\nimport { ViewInstance } from './ViewInstance'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport class ViewFactory {\n readonly edge: Edge\n private sharedData: ViewData = {}\n private composers = new Map<ViewName, ViewComposer[]>()\n private mountedPackages = new Set<string>()\n private packageViewsPath: string\n\n constructor(options: ViewFactoryOptions = {}) {\n this.edge = options.edge ?? Edge.create({ cache: options.cache })\n this.packageViewsPath = options.packageViewsPath ?? 'resources/views'\n this.mount(options.viewsPath ?? resolve(process.cwd(), 'src', 'resources', 'views'))\n }\n\n make (name: ViewName, data: ViewData = {}) {\n const edgeName = this.resolveName(name)\n\n return new ViewInstance(\n name,\n { ...this.sharedData, ...data },\n this.edge,\n async view => await this.runComposers(name, view),\n view => this.runComposersSync(name, view),\n edgeName,\n )\n }\n\n first (names: ViewName[], data: ViewData = {}) {\n const name = names.find(candidate => this.exists(candidate))\n\n if (!name) {\n throw new Error(`None of the given views exist: ${names.join(', ')}`)\n }\n\n return this.make(name, data)\n }\n\n exists (name: ViewName) {\n const edgeName = this.resolveName(name)\n\n if (this.edge.loader.templates[edgeName]) {\n return true\n }\n\n try {\n return existsSync(this.edge.loader.makePath(edgeName))\n } catch {\n return false\n }\n }\n\n share (key: string, value: any): this\n share (data: ViewData): this\n share (...data: any[]): this {\n mergeData(this.sharedData, data)\n\n return this\n }\n\n composer (names: ViewComposerName, composer: ViewComposer): this {\n for (const name of Array.isArray(names) ? names : [names]) {\n this.composers.set(name, [\n ...(this.composers.get(name) ?? []),\n composer,\n ])\n }\n\n return this\n }\n\n mount (viewsDirectory: string | URL): this\n mount (diskName: string, viewsDirectory: string | URL): this\n mount (diskName: string | URL, viewsDirectory?: string | URL): this {\n if (viewsDirectory === undefined) {\n this.edge.mount(diskName)\n\n return this\n }\n\n this.edge.mount(diskName as string, viewsDirectory)\n\n return this\n }\n\n raw (name: ViewName, contents: string): this {\n this.edge.registerTemplate(name, { template: contents })\n\n return this\n }\n\n flushShared () {\n this.sharedData = {}\n\n return this\n }\n\n flushComposers () {\n this.composers.clear()\n\n return this\n }\n\n private getComposers (name: ViewName) {\n const edgeName = this.resolveName(name)\n\n return [\n ...(this.composers.get('*') ?? []),\n ...(this.composers.get(edgeName) ?? []),\n ...(this.composers.get(name) ?? []),\n ]\n }\n\n private async runComposers (name: ViewName, view: ViewInstance) {\n for (const composer of this.getComposers(name)) {\n await runComposer(composer, view)\n }\n }\n\n private runComposersSync (name: ViewName, view: ViewInstance) {\n for (const composer of this.getComposers(name)) {\n runComposerSync(composer, view)\n }\n }\n\n private resolveName (name: ViewName) {\n const packageView = parsePackageViewName(name)\n\n if (!packageView) {\n return name\n }\n\n if (!this.mountedPackages.has(packageView.diskName)) {\n this.mount(\n packageView.diskName,\n resolvePackageViewsPath(packageView.nodePackageName, this.packageViewsPath),\n )\n this.mountedPackages.add(packageView.diskName)\n }\n\n return packageView.edgeName\n }\n}\n","import type { ViewComposer, ViewComposerName, ViewData, ViewFactoryOptions, ViewName } from './types'\n\nimport { ViewFactory } from './ViewFactory'\nimport type { ViewInstance } from './ViewInstance'\n\nexport class View {\n private static factory = new ViewFactory()\n\n /**\n * Bootstrap the view service\n */\n static boot () {\n Object.defineProperty(globalThis, 'view', {\n value: (name?: ViewName, data: ViewData = {}) => {\n if (name === undefined) {\n return View.factoryInstance()\n }\n\n return View.make(name, data)\n },\n configurable: true,\n writable: true,\n })\n }\n\n static configure (options: ViewFactoryOptions = {}) {\n this.factory = new ViewFactory(options)\n\n return this.factory\n }\n\n static factoryInstance () {\n return this.factory\n }\n\n static make (name: ViewName, data: ViewData = {}): ViewInstance {\n return this.factory.make(name, data)\n }\n\n static first (names: ViewName[], data: ViewData = {}): ViewInstance {\n return this.factory.first(names, data)\n }\n\n static exists (name: ViewName) {\n return this.factory.exists(name)\n }\n\n static share (key: string, value: any): typeof View\n static share (data: ViewData): typeof View\n static share (...data: any[]) {\n if (typeof data[0] === 'string') {\n this.factory.share(data[0], data[1])\n } else {\n this.factory.share(data[0] ?? {})\n }\n\n return this\n }\n\n static composer (names: ViewComposerName, composer: ViewComposer): typeof View {\n this.factory.composer(names, composer)\n\n return this\n }\n\n static mount (viewsDirectory: string | URL): typeof View\n static mount (diskName: string, viewsDirectory: string | URL): typeof View\n static mount (diskName: string | URL, viewsDirectory?: string | URL) {\n if (viewsDirectory === undefined) {\n this.factory.mount(diskName)\n } else {\n this.factory.mount(diskName as string, viewsDirectory)\n }\n\n return this\n }\n\n static raw (name: ViewName, contents: string) {\n this.factory.raw(name, contents)\n\n return this\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Edge"],"sources":["../src/helpers.ts","../src/packageViews.ts","../src/ViewInstance.ts","../src/ViewFactory.ts","../src/View.ts"],"sourcesContent":["import type { ViewComposer, ViewComposerObject, ViewData, ViewName } from './types'\n\nimport { View } from './View'\nimport { ViewFactory } from './ViewFactory'\nimport { ViewInstance } from './ViewInstance'\n\nexport function view (): ViewFactory\nexport function view (name: ViewName, data?: ViewData): ViewInstance\nexport function view (name?: ViewName, data: ViewData = {}) {\n if (name === undefined) {\n return View.factoryInstance()\n }\n\n return View.make(name, data)\n}\n\nexport const isClass = <T = unknown> (\n target: unknown\n): target is new (...args: any[]) => T => {\n return typeof target === 'function'\n && /^class\\s/.test(Function.prototype.toString.call(target))\n}\n\nexport const mergeData = (target: ViewData, data: any[]) => {\n if (data.length === 0) {\n return target\n }\n\n if (typeof data[0] === 'string') {\n target[data[0]] = data[1]\n\n return target\n }\n\n for (const value of data) {\n if (value && typeof value === 'object' && !Array.isArray(value)) {\n Object.assign(target, value)\n }\n }\n\n return target\n}\n\nexport const runComposerSync = (composer: ViewComposer, view: ViewInstance) => {\n const result = runComposer(composer, view)\n\n if (result && typeof result.then === 'function') {\n throw new Error('Async view composers cannot be used with renderSync.')\n }\n}\n\nexport const runComposer = (composer: ViewComposer, view: ViewInstance) => {\n if (typeof composer === 'function') {\n if (isClass<ViewComposerObject>(composer)) {\n return new composer().compose(view)\n }\n\n return composer(view)\n }\n\n return composer.compose(view)\n}\n","import { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport type PackageViewReference = {\n source: string\n packageName: string\n nodePackageName: string\n diskName: string\n viewName: string\n edgeName: string\n}\n\nexport const parsePackageViewName = (name: string): PackageViewReference | null => {\n if (!name.startsWith('~')) {\n return null\n }\n\n const source = name.slice(1)\n const slashIndex = source.indexOf('/')\n const dotIndex = slashIndex === -1\n ? source.indexOf('.')\n : source.indexOf('.', slashIndex)\n\n if (dotIndex <= 0) {\n throw new Error(`Invalid package view name: ${name}`)\n }\n\n const packageName = source.slice(0, dotIndex)\n const viewName = source.slice(dotIndex + 1)\n\n if (!viewName) {\n throw new Error(`Invalid package view name: ${name}`)\n }\n\n const nodePackageName = slashIndex === -1\n ? packageName\n : `@${packageName}`\n const diskName = `package_${packageName.replace(/[^a-zA-Z0-9_-]/g, '_')}`\n\n return {\n source: name,\n packageName,\n nodePackageName,\n diskName,\n viewName,\n edgeName: `${diskName}::${viewName}`,\n }\n}\n\nexport const resolvePackageViewsPath = (\n nodePackageName: string,\n viewPath = 'resources/views',\n) => {\n const packageRoot = resolve(process.cwd(), 'node_modules', nodePackageName)\n const viewsPath = resolve(packageRoot, viewPath)\n\n if (!existsSync(viewsPath)) {\n throw new Error(`Package views directory not found: ${viewsPath}`)\n }\n\n return viewsPath\n}\n","import type { ComposerRunner, SyncComposerRunner, ViewData } from './types'\n\nimport { mergeData } from './helpers'\n\nexport class ViewInstance implements PromiseLike<string> {\n private payload: ViewData\n private composersHaveRun = false\n\n constructor(\n readonly name: string,\n data: ViewData = {},\n private renderer: {\n render: (name: string, data?: ViewData) => Promise<string>\n renderSync: (name: string, data?: ViewData) => string\n },\n private runComposers: ComposerRunner,\n private runComposersSync: SyncComposerRunner,\n private renderName = name,\n ) {\n this.payload = { ...data }\n }\n\n get data () {\n return this.payload\n }\n\n with (key: string, value: any): this\n with (data: ViewData): this\n with (...data: any[]): this {\n mergeData(this.payload, data)\n\n return this\n }\n\n async render () {\n await this.compose()\n\n return await this.renderer.render(this.renderName, this.payload)\n }\n\n renderSync () {\n this.composeSync()\n\n return this.renderer.renderSync(this.renderName, this.payload)\n }\n\n then<TResult1 = string, TResult2 = never> (\n onfulfilled?: ((value: string) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): PromiseLike<TResult1 | TResult2> {\n return this.render().then(onfulfilled, onrejected)\n }\n\n private async compose () {\n if (this.composersHaveRun) {\n return\n }\n\n this.composersHaveRun = true\n await this.runComposers(this)\n }\n\n private composeSync () {\n if (this.composersHaveRun) {\n return\n }\n\n this.composersHaveRun = true\n this.runComposersSync(this)\n }\n}\n","import type { ViewComposer, ViewComposerName, ViewData, ViewFactoryOptions, ViewName } from './types'\nimport { mergeData, runComposer, runComposerSync } from './helpers'\nimport { parsePackageViewName, resolvePackageViewsPath } from './packageViews'\n\nimport { Edge } from 'edge.js'\nimport { ViewInstance } from './ViewInstance'\nimport { existsSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport class ViewFactory {\n readonly edge: Edge\n private sharedData: ViewData = {}\n private composers = new Map<ViewName, ViewComposer[]>()\n private mountedPackages = new Set<string>()\n private packageViewsPath: string\n\n constructor(options: ViewFactoryOptions = {}) {\n this.edge = options.edge ?? Edge.create({ cache: options.cache })\n this.packageViewsPath = options.packageViewsPath ?? 'resources/views'\n this.mount(options.viewsPath ?? resolve(process.cwd(), 'src', 'resources', 'views'))\n }\n\n make (name: ViewName, data: ViewData = {}) {\n const edgeName = this.resolveName(name)\n\n return new ViewInstance(\n name,\n { ...this.sharedData, ...data },\n this.edge,\n async view => await this.runComposers(name, view),\n view => this.runComposersSync(name, view),\n edgeName,\n )\n }\n\n first (names: ViewName[], data: ViewData = {}) {\n const name = names.find(candidate => this.exists(candidate))\n\n if (!name) {\n throw new Error(`None of the given views exist: ${names.join(', ')}`)\n }\n\n return this.make(name, data)\n }\n\n exists (name: ViewName) {\n const edgeName = this.resolveName(name)\n\n if (this.edge.loader.templates[edgeName]) {\n return true\n }\n\n try {\n return existsSync(this.edge.loader.makePath(edgeName))\n } catch {\n return false\n }\n }\n\n share (key: string, value: any): this\n share (data: ViewData): this\n share (...data: any[]): this {\n mergeData(this.sharedData, data)\n\n return this\n }\n\n composer (names: ViewComposerName, composer: ViewComposer): this {\n for (const name of Array.isArray(names) ? names : [names]) {\n this.composers.set(name, [\n ...(this.composers.get(name) ?? []),\n composer,\n ])\n }\n\n return this\n }\n\n mount (viewsDirectory: string | URL): this\n mount (diskName: string, viewsDirectory: string | URL): this\n mount (diskName: string | URL, viewsDirectory?: string | URL): this {\n if (viewsDirectory === undefined) {\n this.edge.mount(diskName)\n\n return this\n }\n\n this.edge.mount(diskName as string, viewsDirectory)\n\n return this\n }\n\n raw (name: ViewName, contents: string): this {\n this.edge.registerTemplate(name, { template: contents })\n\n return this\n }\n\n flushShared () {\n this.sharedData = {}\n\n return this\n }\n\n flushComposers () {\n this.composers.clear()\n\n return this\n }\n\n private getComposers (name: ViewName) {\n const edgeName = this.resolveName(name)\n\n return [\n ...(this.composers.get('*') ?? []),\n ...(this.composers.get(edgeName) ?? []),\n ...(this.composers.get(name) ?? []),\n ]\n }\n\n private async runComposers (name: ViewName, view: ViewInstance) {\n for (const composer of this.getComposers(name)) {\n await runComposer(composer, view)\n }\n }\n\n private runComposersSync (name: ViewName, view: ViewInstance) {\n for (const composer of this.getComposers(name)) {\n runComposerSync(composer, view)\n }\n }\n\n private resolveName (name: ViewName) {\n const packageView = parsePackageViewName(name)\n\n if (!packageView) {\n return name\n }\n\n if (!this.mountedPackages.has(packageView.diskName)) {\n this.mount(\n packageView.diskName,\n resolvePackageViewsPath(packageView.nodePackageName, this.packageViewsPath),\n )\n this.mountedPackages.add(packageView.diskName)\n }\n\n return packageView.edgeName\n }\n}\n","import type { ViewComposer, ViewComposerName, ViewData, ViewFactoryOptions, ViewName } from './types'\n\nimport { ViewFactory } from './ViewFactory'\nimport type { ViewInstance } from './ViewInstance'\n\nexport class View {\n private static factory = new ViewFactory()\n\n /**\n * Bootstrap the view service\n */\n static boot () {\n Object.defineProperty(globalThis, 'view', {\n value: (name?: ViewName, data: ViewData = {}) => {\n if (name === undefined) {\n return View.factoryInstance()\n }\n\n return View.make(name, data)\n },\n configurable: true,\n writable: true,\n })\n }\n\n static configure (options: ViewFactoryOptions = {}) {\n this.factory = new ViewFactory(options)\n\n return this.factory\n }\n\n static factoryInstance () {\n return this.factory\n }\n\n static make (name: ViewName, data: ViewData = {}): ViewInstance {\n return this.factory.make(name, data)\n }\n\n static first (names: ViewName[], data: ViewData = {}): ViewInstance {\n return this.factory.first(names, data)\n }\n\n static exists (name: ViewName) {\n return this.factory.exists(name)\n }\n\n static share (key: string, value: any): typeof View\n static share (data: ViewData): typeof View\n static share (...data: any[]) {\n if (typeof data[0] === 'string') {\n this.factory.share(data[0], data[1])\n } else {\n this.factory.share(data[0] ?? {})\n }\n\n return this\n }\n\n static composer (names: ViewComposerName, composer: ViewComposer): typeof View {\n this.factory.composer(names, composer)\n\n return this\n }\n\n static mount (viewsDirectory: string | URL): typeof View\n static mount (diskName: string, viewsDirectory: string | URL): typeof View\n static mount (diskName: string | URL, viewsDirectory?: string | URL) {\n if (viewsDirectory === undefined) {\n this.factory.mount(diskName)\n } else {\n this.factory.mount(diskName as string, viewsDirectory)\n }\n\n return this\n }\n\n static raw (name: ViewName, contents: string) {\n this.factory.raw(name, contents)\n\n return this\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@arkstack/view",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
- "description": "View rendering package for Arkstack applications.",
5
+ "description": "View module for Arkstack, providing template rendering and view integration utilities.",
6
6
  "homepage": "https://arkstack.toneflix.net/guide/views",
7
7
  "repository": {
8
8
  "type": "git",
@@ -13,17 +13,9 @@
13
13
  "access": "public"
14
14
  },
15
15
  "types": "./dist/index.d.ts",
16
- "main": "./dist/index.cjs",
17
- "module": "./dist/index.js",
18
16
  "exports": {
19
- ".": {
20
- "import": "./dist/index.js",
21
- "require": "./dist/index.cjs"
22
- },
23
- "./commands/MakeViewCommand": {
24
- "import": "./dist/commands/MakeViewCommand.js",
25
- "require": "./dist/commands/MakeViewCommand.cjs"
26
- },
17
+ ".": "./dist/index.js",
18
+ "./MakeViewCommand": "./dist/commands/MakeViewCommand.js",
27
19
  "./package.json": "./package.json"
28
20
  },
29
21
  "keywords": [
@@ -43,7 +35,7 @@
43
35
  },
44
36
  "peerDependencies": {
45
37
  "@h3ravel/musket": "^0.10.1",
46
- "@arkstack/common": "^0.4.3"
38
+ "@arkstack/common": "^0.5.0"
47
39
  },
48
40
  "peerDependenciesMeta": {
49
41
  "@h3ravel/musket": {
@@ -51,7 +43,7 @@
51
43
  }
52
44
  },
53
45
  "scripts": {
54
- "build": "tsdown --config-loader unconfig",
46
+ "build": "tsdown --config-loader unrun",
55
47
  "test": "vitest",
56
48
  "version:patch": "pnpm version patch"
57
49
  }
@@ -1,41 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_index = require('../index.cjs');
3
- let node_path = require("node:path");
4
- let node_fs_promises = require("node:fs/promises");
5
- let _h3ravel_musket = require("@h3ravel/musket");
6
-
7
- //#region src/commands/MakeViewCommand.ts
8
- var MakeViewCommand = class extends _h3ravel_musket.Command {
9
- signature = `make:view
10
- {name : name of the view to create}
11
- {--force : force overwrite if view already exists}
12
- `;
13
- description = "Create a new Edge view file";
14
- async handle() {
15
- const name = String(this.argument("name") ?? "").trim();
16
- if (!name) {
17
- this.error("View name is required");
18
- return;
19
- }
20
- const path = this.path(name);
21
- await (0, node_fs_promises.mkdir)((0, node_path.dirname)(path), { recursive: true });
22
- await (0, node_fs_promises.writeFile)(path, this.stub(name), { flag: this.option("force") ? "w" : "wx" });
23
- this.success(`View ${name} created successfully at ${path}`);
24
- }
25
- path(name) {
26
- const viewPath = name.replace(/\\/g, "/").replace(/\./g, "/").replace(/\.edge$/i, "");
27
- return (0, node_path.resolve)(process.cwd(), "src", "resources", "views", `${viewPath}.edge`);
28
- }
29
- stub(name) {
30
- const title = name.split(/[./\\]/).filter(Boolean).pop() ?? "view";
31
- return [
32
- `{{-- ${title} view --}}`,
33
- "",
34
- `<h1>{{ title || '${title}' }}</h1>`,
35
- ""
36
- ].join("\n");
37
- }
38
- };
39
-
40
- //#endregion
41
- exports.MakeViewCommand = MakeViewCommand;
@@ -1,13 +0,0 @@
1
- import { Command } from "@h3ravel/musket";
2
-
3
- //#region src/commands/MakeViewCommand.d.ts
4
- declare class MakeViewCommand extends Command {
5
- protected signature: string;
6
- protected description: string;
7
- handle(): Promise<undefined>;
8
- path(name: string): string;
9
- stub(name: string): string;
10
- }
11
- //#endregion
12
- export { MakeViewCommand };
13
- //# sourceMappingURL=MakeViewCommand.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MakeViewCommand.d.ts","names":[],"sources":["../../src/commands/MakeViewCommand.ts"],"mappings":";;;cAKa,eAAA,SAAwB,OAAA;EAAA,UACvB,SAAA;EAAA,UAKA,WAAA;EAEJ,MAAA,CAAA,GAAM,OAAA;EAeZ,IAAA,CAAM,IAAA;EASN,IAAA,CAAM,IAAA;AAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MakeViewCommand.js","names":[],"sources":["../../src/commands/MakeViewCommand.ts"],"sourcesContent":["import { dirname, resolve } from 'node:path'\nimport { mkdir, writeFile } from 'node:fs/promises'\n\nimport { Command } from '@h3ravel/musket'\n\nexport class MakeViewCommand extends Command {\n protected signature = `make:view\n {name : name of the view to create}\n {--force : force overwrite if view already exists}\n `\n\n protected description = 'Create a new Edge view file'\n\n async handle () {\n const name = String(this.argument('name') ?? '').trim()\n\n if (!name) {\n return void this.error('View name is required')\n }\n\n const path = this.path(name)\n\n await mkdir(dirname(path), { recursive: true })\n await writeFile(path, this.stub(name), { flag: this.option('force') ? 'w' : 'wx' })\n\n this.success(`View ${name} created successfully at ${path}`)\n }\n\n path (name: string) {\n const viewPath = name\n .replace(/\\\\/g, '/')\n .replace(/\\./g, '/')\n .replace(/\\.edge$/i, '')\n\n return resolve(process.cwd(), 'src', 'resources', 'views', `${viewPath}.edge`)\n }\n\n stub (name: string) {\n const title = name\n .split(/[./\\\\]/)\n .filter(Boolean)\n .pop() ?? 'view'\n\n return [\n `{{-- ${title} view --}}`,\n '',\n `<h1>{{ title || '${title}' }}</h1>`,\n '',\n ].join('\\n')\n }\n}\n"],"mappings":";;;;;AAKA,IAAa,kBAAb,cAAqC,QAAQ;CACzC,AAAU,YAAY;;;;CAKtB,AAAU,cAAc;CAExB,MAAM,SAAU;EACZ,MAAM,OAAO,OAAO,KAAK,SAAS,OAAO,IAAI,GAAG,CAAC,MAAM;AAEvD,MAAI,CAAC,MAAM;AACA,GAAK,KAAK,MAAM,wBAAwB;AAA/C;;EAGJ,MAAM,OAAO,KAAK,KAAK,KAAK;AAE5B,QAAM,MAAM,QAAQ,KAAK,EAAE,EAAE,WAAW,MAAM,CAAC;AAC/C,QAAM,UAAU,MAAM,KAAK,KAAK,KAAK,EAAE,EAAE,MAAM,KAAK,OAAO,QAAQ,GAAG,MAAM,MAAM,CAAC;AAEnF,OAAK,QAAQ,QAAQ,KAAK,2BAA2B,OAAO;;CAGhE,KAAM,MAAc;EAChB,MAAM,WAAW,KACZ,QAAQ,OAAO,IAAI,CACnB,QAAQ,OAAO,IAAI,CACnB,QAAQ,YAAY,GAAG;AAE5B,SAAO,QAAQ,QAAQ,KAAK,EAAE,OAAO,aAAa,SAAS,GAAG,SAAS,OAAO;;CAGlF,KAAM,MAAc;EAChB,MAAM,QAAQ,KACT,MAAM,SAAS,CACf,OAAO,QAAQ,CACf,KAAK,IAAI;AAEd,SAAO;GACH,QAAQ,MAAM;GACd;GACA,oBAAoB,MAAM;GAC1B;GACH,CAAC,KAAK,KAAK"}
package/dist/index.cjs DELETED
@@ -1,293 +0,0 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- //#region \0rolldown/runtime.js
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
12
- key = keys[i];
13
- if (!__hasOwnProp.call(to, key) && key !== except) {
14
- __defProp(to, key, {
15
- get: ((k) => from[k]).bind(null, key),
16
- enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
17
- });
18
- }
19
- }
20
- }
21
- return to;
22
- };
23
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
24
- value: mod,
25
- enumerable: true
26
- }) : target, mod));
27
-
28
- //#endregion
29
- let node_fs = require("node:fs");
30
- let node_path = require("node:path");
31
- let edge_js = require("edge.js");
32
- edge_js = __toESM(edge_js);
33
-
34
- //#region src/helpers.ts
35
- function view(name, data = {}) {
36
- if (name === void 0) return View.factoryInstance();
37
- return View.make(name, data);
38
- }
39
- const isClass = (target) => {
40
- return typeof target === "function" && /^class\s/.test(Function.prototype.toString.call(target));
41
- };
42
- const mergeData = (target, data) => {
43
- if (data.length === 0) return target;
44
- if (typeof data[0] === "string") {
45
- target[data[0]] = data[1];
46
- return target;
47
- }
48
- for (const value of data) if (value && typeof value === "object" && !Array.isArray(value)) Object.assign(target, value);
49
- return target;
50
- };
51
- const runComposerSync = (composer, view) => {
52
- const result = runComposer(composer, view);
53
- if (result && typeof result.then === "function") throw new Error("Async view composers cannot be used with renderSync.");
54
- };
55
- const runComposer = (composer, view) => {
56
- if (typeof composer === "function") {
57
- if (isClass(composer)) return new composer().compose(view);
58
- return composer(view);
59
- }
60
- return composer.compose(view);
61
- };
62
-
63
- //#endregion
64
- //#region src/packageViews.ts
65
- const parsePackageViewName = (name) => {
66
- if (!name.startsWith("~")) return null;
67
- const source = name.slice(1);
68
- const slashIndex = source.indexOf("/");
69
- const dotIndex = slashIndex === -1 ? source.indexOf(".") : source.indexOf(".", slashIndex);
70
- if (dotIndex <= 0) throw new Error(`Invalid package view name: ${name}`);
71
- const packageName = source.slice(0, dotIndex);
72
- const viewName = source.slice(dotIndex + 1);
73
- if (!viewName) throw new Error(`Invalid package view name: ${name}`);
74
- const nodePackageName = slashIndex === -1 ? packageName : `@${packageName}`;
75
- const diskName = `package_${packageName.replace(/[^a-zA-Z0-9_-]/g, "_")}`;
76
- return {
77
- source: name,
78
- packageName,
79
- nodePackageName,
80
- diskName,
81
- viewName,
82
- edgeName: `${diskName}::${viewName}`
83
- };
84
- };
85
- const resolvePackageViewsPath = (nodePackageName, viewPath = "resources/views") => {
86
- const viewsPath = (0, node_path.resolve)((0, node_path.resolve)(process.cwd(), "node_modules", nodePackageName), viewPath);
87
- if (!(0, node_fs.existsSync)(viewsPath)) throw new Error(`Package views directory not found: ${viewsPath}`);
88
- return viewsPath;
89
- };
90
-
91
- //#endregion
92
- //#region src/ViewInstance.ts
93
- var ViewInstance = class {
94
- payload;
95
- composersHaveRun = false;
96
- constructor(name, data = {}, renderer, runComposers, runComposersSync, renderName = name) {
97
- this.name = name;
98
- this.renderer = renderer;
99
- this.runComposers = runComposers;
100
- this.runComposersSync = runComposersSync;
101
- this.renderName = renderName;
102
- this.payload = { ...data };
103
- }
104
- get data() {
105
- return this.payload;
106
- }
107
- with(...data) {
108
- mergeData(this.payload, data);
109
- return this;
110
- }
111
- async render() {
112
- await this.compose();
113
- return await this.renderer.render(this.renderName, this.payload);
114
- }
115
- renderSync() {
116
- this.composeSync();
117
- return this.renderer.renderSync(this.renderName, this.payload);
118
- }
119
- then(onfulfilled, onrejected) {
120
- return this.render().then(onfulfilled, onrejected);
121
- }
122
- async compose() {
123
- if (this.composersHaveRun) return;
124
- this.composersHaveRun = true;
125
- await this.runComposers(this);
126
- }
127
- composeSync() {
128
- if (this.composersHaveRun) return;
129
- this.composersHaveRun = true;
130
- this.runComposersSync(this);
131
- }
132
- };
133
-
134
- //#endregion
135
- //#region src/ViewFactory.ts
136
- var ViewFactory = class {
137
- edge;
138
- sharedData = {};
139
- composers = /* @__PURE__ */ new Map();
140
- mountedPackages = /* @__PURE__ */ new Set();
141
- packageViewsPath;
142
- constructor(options = {}) {
143
- this.edge = options.edge ?? edge_js.Edge.create({ cache: options.cache });
144
- this.packageViewsPath = options.packageViewsPath ?? "resources/views";
145
- this.mount(options.viewsPath ?? (0, node_path.resolve)(process.cwd(), "src", "resources", "views"));
146
- }
147
- make(name, data = {}) {
148
- const edgeName = this.resolveName(name);
149
- return new ViewInstance(name, {
150
- ...this.sharedData,
151
- ...data
152
- }, this.edge, async (view) => await this.runComposers(name, view), (view) => this.runComposersSync(name, view), edgeName);
153
- }
154
- first(names, data = {}) {
155
- const name = names.find((candidate) => this.exists(candidate));
156
- if (!name) throw new Error(`None of the given views exist: ${names.join(", ")}`);
157
- return this.make(name, data);
158
- }
159
- exists(name) {
160
- const edgeName = this.resolveName(name);
161
- if (this.edge.loader.templates[edgeName]) return true;
162
- try {
163
- return (0, node_fs.existsSync)(this.edge.loader.makePath(edgeName));
164
- } catch {
165
- return false;
166
- }
167
- }
168
- share(...data) {
169
- mergeData(this.sharedData, data);
170
- return this;
171
- }
172
- composer(names, composer) {
173
- for (const name of Array.isArray(names) ? names : [names]) this.composers.set(name, [...this.composers.get(name) ?? [], composer]);
174
- return this;
175
- }
176
- mount(diskName, viewsDirectory) {
177
- if (viewsDirectory === void 0) {
178
- this.edge.mount(diskName);
179
- return this;
180
- }
181
- this.edge.mount(diskName, viewsDirectory);
182
- return this;
183
- }
184
- raw(name, contents) {
185
- this.edge.registerTemplate(name, { template: contents });
186
- return this;
187
- }
188
- flushShared() {
189
- this.sharedData = {};
190
- return this;
191
- }
192
- flushComposers() {
193
- this.composers.clear();
194
- return this;
195
- }
196
- getComposers(name) {
197
- const edgeName = this.resolveName(name);
198
- return [
199
- ...this.composers.get("*") ?? [],
200
- ...this.composers.get(edgeName) ?? [],
201
- ...this.composers.get(name) ?? []
202
- ];
203
- }
204
- async runComposers(name, view) {
205
- for (const composer of this.getComposers(name)) await runComposer(composer, view);
206
- }
207
- runComposersSync(name, view) {
208
- for (const composer of this.getComposers(name)) runComposerSync(composer, view);
209
- }
210
- resolveName(name) {
211
- const packageView = parsePackageViewName(name);
212
- if (!packageView) return name;
213
- if (!this.mountedPackages.has(packageView.diskName)) {
214
- this.mount(packageView.diskName, resolvePackageViewsPath(packageView.nodePackageName, this.packageViewsPath));
215
- this.mountedPackages.add(packageView.diskName);
216
- }
217
- return packageView.edgeName;
218
- }
219
- };
220
-
221
- //#endregion
222
- //#region src/View.ts
223
- var View = class View {
224
- static factory = new ViewFactory();
225
- /**
226
- * Bootstrap the view service
227
- */
228
- static boot() {
229
- Object.defineProperty(globalThis, "view", {
230
- value: (name, data = {}) => {
231
- if (name === void 0) return View.factoryInstance();
232
- return View.make(name, data);
233
- },
234
- configurable: true,
235
- writable: true
236
- });
237
- }
238
- static configure(options = {}) {
239
- this.factory = new ViewFactory(options);
240
- return this.factory;
241
- }
242
- static factoryInstance() {
243
- return this.factory;
244
- }
245
- static make(name, data = {}) {
246
- return this.factory.make(name, data);
247
- }
248
- static first(names, data = {}) {
249
- return this.factory.first(names, data);
250
- }
251
- static exists(name) {
252
- return this.factory.exists(name);
253
- }
254
- static share(...data) {
255
- if (typeof data[0] === "string") this.factory.share(data[0], data[1]);
256
- else this.factory.share(data[0] ?? {});
257
- return this;
258
- }
259
- static composer(names, composer) {
260
- this.factory.composer(names, composer);
261
- return this;
262
- }
263
- static mount(diskName, viewsDirectory) {
264
- if (viewsDirectory === void 0) this.factory.mount(diskName);
265
- else this.factory.mount(diskName, viewsDirectory);
266
- return this;
267
- }
268
- static raw(name, contents) {
269
- this.factory.raw(name, contents);
270
- return this;
271
- }
272
- };
273
-
274
- //#endregion
275
- Object.defineProperty(exports, 'Edge', {
276
- enumerable: true,
277
- get: function () {
278
- return edge_js.Edge;
279
- }
280
- });
281
- exports.View = View;
282
- exports.ViewFactory = ViewFactory;
283
- exports.ViewInstance = ViewInstance;
284
- exports.__toESM = __toESM;
285
- Object.defineProperty(exports, 'edge', {
286
- enumerable: true,
287
- get: function () {
288
- return edge_js.default;
289
- }
290
- });
291
- exports.parsePackageViewName = parsePackageViewName;
292
- exports.resolvePackageViewsPath = resolvePackageViewsPath;
293
- exports.view = view;
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/ViewInstance.ts","../src/types.ts","../src/ViewFactory.ts","../src/View.ts","../src/helpers.ts","../src/packageViews.ts"],"mappings":"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"}