From ee4a3d4ecbad739ef11691d5efa1af10c25db647 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 3 Dec 2021 14:38:57 +0000 Subject: [PATCH 01/22] adds ci hook to publish when release created on github --- .github/workflows/release.yml | 36 ++++++++++ .gitignore | 1 + Makefile | 26 +++++-- SECURITY.md | 27 ++++++++ bin/get_release_version.py | 16 +++++ package.json | 10 ++- pyck/core/frontend/test-utils.ts | 2 + pyck/geo/frontend/controllers/index.ts | 3 - .../frontend/controllers/map-controller.ts | 12 +--- pyck/geo/frontend/utils/map-test-utils.ts | 2 +- tsconfig.json | 2 +- vite.config.js | 67 ++++++++++++++----- yarn.lock | 5 ++ 13 files changed, 171 insertions(+), 38 deletions(-) create mode 100644 .github/workflows/release.yml create mode 100644 SECURITY.md create mode 100644 bin/get_release_version.py create mode 100644 pyck/core/frontend/test-utils.ts delete mode 100644 pyck/geo/frontend/controllers/index.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..f0c0423 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,36 @@ +name: ci +on: + pull_request: + branches: + - main +jobs: + lint-and-test: + runs-on: ubuntu-latest + container: + image: ghcr.io/commonknowledge/do-app-baseimage-django-node:364385f9d196a2bbe2d5faea025520cc0316501f + # Workaround for: https://github.com/actions/checkout/issues/211 + options: --user 1001 + volumes: + - "/home/runner/docker/.cache:/home/app/.cache" + env: + DATABASE_URL: postgres://postgres:postgres@db:5432/postgres + DEBUG: True + services: + db: + image: kartoza/postgis:latest + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DBNAME: postgres + POSTGRES_HOSTNAME: postgres + POSTGRES_PORT: 5432 + steps: + - uses: actions/checkout@v2 + - uses: actions/cache@v2 + with: + path: /home/runner/docker/.cache/poetry + key: do-app-baseimage-django-node:364385f9d196a2bbe2d5faea025520cc0316501f-poetry-${{ hashFiles('poetry.lock') }} + - run: make install + - run: .github/bin/wait-for-it.sh db:5432 + - run: make lint + - run: make release diff --git a/.gitignore b/.gitignore index 5cd1bc0..8f43fc4 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ __pycache__/ # Distribution / packaging .Python +pyck/core/static/ build/ develop-eggs/ dist/ diff --git a/Makefile b/Makefile index 2cc7b65..cf1fc81 100644 --- a/Makefile +++ b/Makefile @@ -107,13 +107,31 @@ ci: lint yarn test -#* Assets +#* Build & release flow -.PHONY: build -build: +.PHONY: set-release-version +set-release-version: + release_version=$$(poetry run python bin/get_release_version.py) + + yarn version --new-version $$release_version + poetry version $$release_version + +.PHONY: build-js +build-js: yarn vite build --mode bundled + yarn vite build --mode test-utils yarn vite build +.PHONY: build-python +build-python: set-release-version build-js + echo poetry build + +.PHONY: release +release: clean-all set-release-version build-js build-python + yarn publish + poetry publish + + #* Cleaning @@ -123,7 +141,7 @@ pycache-remove: .PHONY: build-remove build-remove: - rm -rf build/ dist/ docs/api/ docs/components/ temp/ + rm -rf build/ pyck/core/static/ docs/api/ docs/components/ temp/ .PHONY: clean-all clean-all: pycache-remove build-remove diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..1d2ffb9 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,27 @@ +# Security + +## 🔐 Reporting Security Issues + +> Do not open issues that might have security implications! +> It is critical that security related issues are reported privately so we have time to address them before they become public knowledge. + +Vulnerabilities can be reported by emailing core members: + +- commonknowledge [developers@commonknowledge.coop](mailto:developers@commonknowledge.coop) + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + +- Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) +- Full paths of source file(s) related to the manifestation of the issue +- The location of the affected source code (tag/branch/commit or direct URL) +- Any special configuration required to reproduce the issue +- Environment (e.g. Linux / Windows / macOS) +- Step-by-step instructions to reproduce the issue +- Proof-of-concept or exploit code (if possible) +- Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +## Preferred Languages + +We prefer all communications to be in English. diff --git a/bin/get_release_version.py b/bin/get_release_version.py new file mode 100644 index 0000000..fb8ce1f --- /dev/null +++ b/bin/get_release_version.py @@ -0,0 +1,16 @@ +import os +import re +import sys + + +def get_version(ref_name): + if ref_name: + ref_match = re.search(r"v(\d+)\.(\d+)\.(\d+)$", ref_name) + if ref_match is None: + return () + + return ref_match.groups() + + +if __name__ == "__main__": + print(".".join(get_version(os.getenv("GITHUB_REF_NAME")))) diff --git a/package.json b/package.json index ca68682..dfb22d0 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@types/jest": "^27.0.3", "@types/mapbox-gl": "^2.4.2", "@vitejs/plugin-legacy": "^1.6.2", + "events": "^3.3.0", "jest": "^27.3.1", "mapbox-gl": "^2.6.0", "mutationobserver-shim": "^0.3.7", @@ -31,12 +32,15 @@ "@hotwired/stimulus": "^3.0.1" }, "files": [ - "dist" + "build" ], - "module": "./dist/index.js", + "module": "./build/production/index.js", "exports": { ".": { - "import": "./dist/index.js" + "import": "./build/production/index.js" + }, + "./test-utils": { + "import": "./build/test-utils/index.js" } } } diff --git a/pyck/core/frontend/test-utils.ts b/pyck/core/frontend/test-utils.ts new file mode 100644 index 0000000..8cf2016 --- /dev/null +++ b/pyck/core/frontend/test-utils.ts @@ -0,0 +1,2 @@ +export * from "./util/stimulus-test-utils"; +export * from "~geo/utils/map-test-utils"; diff --git a/pyck/geo/frontend/controllers/index.ts b/pyck/geo/frontend/controllers/index.ts deleted file mode 100644 index 6c889d7..0000000 --- a/pyck/geo/frontend/controllers/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from "./map-controller"; -export * from "./map-layer-controller"; -export * from "./map-source-controller"; diff --git a/pyck/geo/frontend/controllers/map-controller.ts b/pyck/geo/frontend/controllers/map-controller.ts index 81a30ef..c05e0b7 100644 --- a/pyck/geo/frontend/controllers/map-controller.ts +++ b/pyck/geo/frontend/controllers/map-controller.ts @@ -1,3 +1,5 @@ +import "mapbox-gl/dist/mapbox-gl.css"; + import { Controller } from "@hotwired/stimulus"; import mapbox from "mapbox-gl"; import { getReferencedData } from "~core/util/stimulus-utils"; @@ -18,8 +20,6 @@ export default class MapController extends Controller { zoom: Number, }; - private static cssLoaded = false; - private apiKeyValue!: string; private styleValue!: string; private centerValue!: string; @@ -101,11 +101,6 @@ export default class MapController extends Controller { return resolve(undefined); } - if (!MapController.cssLoaded) { - await MAPBOX_CSS; - MapController.cssLoaded = true; - } - const map = new mapbox.Map({ accessToken: this.apiKeyValue, container: this.canvasTarget, @@ -121,6 +116,3 @@ export default class MapController extends Controller { }); } } - -// Load the mapbox css via dynamic import so that it isn't added to the entry css by bundlers. -const MAPBOX_CSS = import("mapbox-gl/dist/mapbox-gl.css"); diff --git a/pyck/geo/frontend/utils/map-test-utils.ts b/pyck/geo/frontend/utils/map-test-utils.ts index 8bb5fb8..e17cecf 100644 --- a/pyck/geo/frontend/utils/map-test-utils.ts +++ b/pyck/geo/frontend/utils/map-test-utils.ts @@ -1,8 +1,8 @@ -import { Controller, ControllerConstructor } from "@hotwired/stimulus"; import { createTestFixture, getTestControllerIdentifier, } from "~core/util/stimulus-test-utils"; + import MapController from "../controllers/map-controller"; import { MapConfigController } from "./map-utils"; diff --git a/tsconfig.json b/tsconfig.json index a1dde8a..3e15f4f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "skipLibCheck": true, "paths": { "~core/*": ["./pyck/core/frontend/*"], - "~geo/*": ["./pyck/geo/frontenwd/*"] + "~geo/*": ["./pyck/geo/frontend/*"] } } } diff --git a/vite.config.js b/vite.config.js index dbcba1e..8fd9405 100644 --- a/vite.config.js +++ b/vite.config.js @@ -3,7 +3,8 @@ import { defineConfig } from "vite"; import legacy from "@vitejs/plugin-legacy"; import tsconfigPaths from "vite-tsconfig-paths"; -import { peerDependencies } from "./package.json"; +import { peerDependencies, devDependencies } from "./package.json"; +import { resolve } from "path"; export default defineConfig(({ mode }) => { // Bundled mode: @@ -14,10 +15,26 @@ export default defineConfig(({ mode }) => { // - JS distributed via npm. Frontend widgets require this to be built. // - Some dependencies included in bundle. // - Some dependencies externalised (see package.json peerDependencies field) + // + // Test-utils mode: + // - JS distributed via npm. Available via `import 'groundwork-ui/test-utils'` + // - Some dependencies included in bundle. + // - Some dependencies externalised (see package.json peerDependencies field) + // - Some dependencies that will throw in test environments (such as mapbox) replaced with the mock we use internally + // for testing. const isBundled = mode === "bundled"; const isDev = mode === "dev"; - const entrypoint = isBundled ? "register.ts" : "index.ts"; + const isTestUtils = mode === "test-utils"; + const isLibrary = !isBundled && !isDev; + const outDir = isBundled ? "pyck/core/static/" : `build/${mode}/`; + + const alias = !isTestUtils + ? [] + : TEST_MOCKS.map((moduleName) => ({ + find: new RegExp(`^${moduleName}$`), + replacement: resolve(`__mocks__/${moduleName}.ts`), + })); return { base: "/static/", @@ -32,31 +49,49 @@ export default defineConfig(({ mode }) => { targets: ["defaults", "not IE 11"], }), ]), + resolve: { + alias, + }, build: { emptyOutDir: true, + outDir, rollupOptions: { external: isBundled ? [] : Object.keys(peerDependencies), output: { - dir: isBundled ? "pyck/core/static/" : "dist/", + dir: outDir, }, + input: { - main: `pyck/core/frontend/${entrypoint}`, + main: `pyck/core/frontend/${getEntrypoint(mode)}`, }, }, - lib: - isBundled || isDev - ? undefined - : { - entry: path.resolve( - __dirname, - `pyck/core/frontend/${entrypoint}` - ), - formats: isBundled ? ["cjs"] : ["es"], - name: "pyck", - fileName: () => `index.js`, - }, + lib: !isLibrary + ? undefined + : { + entry: path.resolve( + __dirname, + `pyck/core/frontend/${getEntrypoint(mode)}` + ), + formats: isBundled ? ["cjs"] : ["es"], + name: "groundwork", + fileName: () => `index.js`, + }, }, }; }); +const TEST_MOCKS = ["mapbox-gl"]; + +/** Return the entry file for the current build configuration. */ +const getEntrypoint = (mode) => { + if (mode === "bundled") { + return "register.ts"; + } + if (mode === "test-utils") { + return "test-utils.ts"; + } + + return "index.ts"; +}; + const compact = (array) => array.filter((item) => !!item); diff --git a/yarn.lock b/yarn.lock index bfb19bc..b0bd40a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1429,6 +1429,11 @@ etag@~1.8.1: resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" From 89e0645ec1658da222c115355935faeb5d9f816f Mon Sep 17 00:00:00 2001 From: Chris Devereux Date: Mon, 6 Dec 2021 17:06:57 +0000 Subject: [PATCH 02/22] remove tsconfig paths and rollup a d.ts file for npm distribution --- Makefile | 5 +- bin/api-extractor.js | 52 ++++ example/frontend/main.ts | 2 +- frontend/core/index.ts | 1 + .../index.ts => frontend/core/loader.ts | 4 +- .../frontend => frontend/core}/test-utils.ts | 1 - .../core}/util/file-mock.ts | 0 .../core}/util/promise-utils.ts | 0 .../core}/util/stimulus-test-utils.ts | 0 .../core}/util/stimulus-utils.ts | 0 .../frontend => frontend/core}/util/types.ts | 0 .../geo}/__tests__/map-layer.spec.ts | 0 .../geo}/__tests__/map-source.spec.ts | 0 .../geo}/__tests__/map.spec.ts | 5 +- .../geo}/controllers/map-controller.ts | 4 +- .../geo}/controllers/map-layer-controller.ts | 10 +- .../geo}/controllers/map-source-controller.ts | 12 +- {pyck/geo/frontend => frontend/geo}/index.ts | 0 frontend/geo/test-utils.ts | 1 + .../geo}/utils/map-test-utils.ts | 2 +- .../geo}/utils/map-utils.ts | 10 +- frontend/index.bundled.ts | 4 + frontend/index.lib.ts | 4 + frontend/index.test-utils.ts | 2 + package.json | 10 +- pyck/core/frontend/register.ts | 7 - tsconfig.json | 8 +- vite.config.js | 24 +- yarn.lock | 287 +++++++++++++----- 29 files changed, 322 insertions(+), 133 deletions(-) create mode 100644 bin/api-extractor.js create mode 100644 frontend/core/index.ts rename pyck/core/frontend/index.ts => frontend/core/loader.ts (94%) rename {pyck/core/frontend => frontend/core}/test-utils.ts (50%) rename {pyck/core/frontend => frontend/core}/util/file-mock.ts (100%) rename {pyck/core/frontend => frontend/core}/util/promise-utils.ts (100%) rename {pyck/core/frontend => frontend/core}/util/stimulus-test-utils.ts (100%) rename {pyck/core/frontend => frontend/core}/util/stimulus-utils.ts (100%) rename {pyck/core/frontend => frontend/core}/util/types.ts (100%) rename {pyck/geo/frontend => frontend/geo}/__tests__/map-layer.spec.ts (100%) rename {pyck/geo/frontend => frontend/geo}/__tests__/map-source.spec.ts (100%) rename {pyck/geo/frontend => frontend/geo}/__tests__/map.spec.ts (89%) rename {pyck/geo/frontend => frontend/geo}/controllers/map-controller.ts (96%) rename {pyck/geo/frontend => frontend/geo}/controllers/map-layer-controller.ts (64%) rename {pyck/geo/frontend => frontend/geo}/controllers/map-source-controller.ts (61%) rename {pyck/geo/frontend => frontend/geo}/index.ts (100%) create mode 100644 frontend/geo/test-utils.ts rename {pyck/geo/frontend => frontend/geo}/utils/map-test-utils.ts (97%) rename {pyck/geo/frontend => frontend/geo}/utils/map-utils.ts (76%) create mode 100644 frontend/index.bundled.ts create mode 100644 frontend/index.lib.ts create mode 100644 frontend/index.test-utils.ts delete mode 100644 pyck/core/frontend/register.ts diff --git a/Makefile b/Makefile index cf1fc81..600cf38 100644 --- a/Makefile +++ b/Makefile @@ -120,7 +120,10 @@ set-release-version: build-js: yarn vite build --mode bundled yarn vite build --mode test-utils - yarn vite build + yarn vite build --mode lib + rm -rf build/ts + yarn tsc + node bin/api-extractor.js .PHONY: build-python build-python: set-release-version build-js diff --git a/bin/api-extractor.js b/bin/api-extractor.js new file mode 100644 index 0000000..6782ed5 --- /dev/null +++ b/bin/api-extractor.js @@ -0,0 +1,52 @@ +const { ExtractorConfig, Extractor } = require("@microsoft/api-extractor"); + +const IGNORED_SYMBOLS = ["mapbox-gl"]; + +const invoke = (slug) => { + const packageJson = require("../package.json"); + const peerDependencies = new Set([ + ...Object.keys(packageJson.peerDependencies), + ...IGNORED_SYMBOLS, + ]); + + const config = ExtractorConfig.prepare({ + configObject: { + mainEntryPointFilePath: `/build/ts/frontend/index.${slug}.d.ts`, + bundledPackages: [ + ...Object.keys(packageJson.dependencies ?? {}), + ...Object.keys(packageJson.devDependencies).filter( + (x) => !peerDependencies.has(x) + ), + ], + projectFolder: process.cwd(), + compiler: { + tsconfigFilePath: "/tsconfig.json", + }, + dtsRollup: { + enabled: true, + publicTrimmedFilePath: `/build/${slug}/index.d.ts`, + }, + apiReport: { + enabled: false, + reportFileName: ".api.md", + }, + docModel: { + enabled: false, + }, + tsdocMetadata: { + enabled: false, + }, + }, + configObjectFullPath: undefined, + packageJson, + packageJsonFullPath: require.resolve("../package.json"), + }); + + Extractor.invoke(config, { + localBuild: true, + showVerboseMessages: true, + }); +}; + +invoke("test-utils"); +invoke("lib"); diff --git a/example/frontend/main.ts b/example/frontend/main.ts index cae5d42..8ecfd0f 100644 --- a/example/frontend/main.ts +++ b/example/frontend/main.ts @@ -1 +1 @@ -import "~core/register"; +import "../../frontend/index.bundled"; diff --git a/frontend/core/index.ts b/frontend/core/index.ts new file mode 100644 index 0000000..6d8eff5 --- /dev/null +++ b/frontend/core/index.ts @@ -0,0 +1 @@ +export * from "./util/stimulus-utils"; diff --git a/pyck/core/frontend/index.ts b/frontend/core/loader.ts similarity index 94% rename from pyck/core/frontend/index.ts rename to frontend/core/loader.ts index 6c39542..c66e111 100644 --- a/pyck/core/frontend/index.ts +++ b/frontend/core/loader.ts @@ -11,7 +11,7 @@ import StimulusControllerResolver from "stimulus-controller-resolver"; * - Registering async loaders for Stimulus controller modules * - Adding in loaders for all the controllers in this package. **/ -export default function startApp(...modules: AsyncModuleMap[]) { +export function startApp(...modules: AsyncModuleMap[]) { const app = Application.start(); const allModules: AsyncModuleMap = Object.assign( {}, @@ -63,7 +63,7 @@ const createAsyncControllerResolver = (pathMap: AsyncModuleMap) => { * Compiled-in references to all controllers in this package * See: https://vitejs.dev/guide/features.html#glob-import */ -const EXPORTED_MODULES = import.meta.glob("../../**/*-controller.ts"); +const EXPORTED_MODULES = import.meta.glob("../**/*-controller.ts"); /** * Given a path to a controller following the Stimulus file naming convention, diff --git a/pyck/core/frontend/test-utils.ts b/frontend/core/test-utils.ts similarity index 50% rename from pyck/core/frontend/test-utils.ts rename to frontend/core/test-utils.ts index 8cf2016..0af1945 100644 --- a/pyck/core/frontend/test-utils.ts +++ b/frontend/core/test-utils.ts @@ -1,2 +1 @@ export * from "./util/stimulus-test-utils"; -export * from "~geo/utils/map-test-utils"; diff --git a/pyck/core/frontend/util/file-mock.ts b/frontend/core/util/file-mock.ts similarity index 100% rename from pyck/core/frontend/util/file-mock.ts rename to frontend/core/util/file-mock.ts diff --git a/pyck/core/frontend/util/promise-utils.ts b/frontend/core/util/promise-utils.ts similarity index 100% rename from pyck/core/frontend/util/promise-utils.ts rename to frontend/core/util/promise-utils.ts diff --git a/pyck/core/frontend/util/stimulus-test-utils.ts b/frontend/core/util/stimulus-test-utils.ts similarity index 100% rename from pyck/core/frontend/util/stimulus-test-utils.ts rename to frontend/core/util/stimulus-test-utils.ts diff --git a/pyck/core/frontend/util/stimulus-utils.ts b/frontend/core/util/stimulus-utils.ts similarity index 100% rename from pyck/core/frontend/util/stimulus-utils.ts rename to frontend/core/util/stimulus-utils.ts diff --git a/pyck/core/frontend/util/types.ts b/frontend/core/util/types.ts similarity index 100% rename from pyck/core/frontend/util/types.ts rename to frontend/core/util/types.ts diff --git a/pyck/geo/frontend/__tests__/map-layer.spec.ts b/frontend/geo/__tests__/map-layer.spec.ts similarity index 100% rename from pyck/geo/frontend/__tests__/map-layer.spec.ts rename to frontend/geo/__tests__/map-layer.spec.ts diff --git a/pyck/geo/frontend/__tests__/map-source.spec.ts b/frontend/geo/__tests__/map-source.spec.ts similarity index 100% rename from pyck/geo/frontend/__tests__/map-source.spec.ts rename to frontend/geo/__tests__/map-source.spec.ts diff --git a/pyck/geo/frontend/__tests__/map.spec.ts b/frontend/geo/__tests__/map.spec.ts similarity index 89% rename from pyck/geo/frontend/__tests__/map.spec.ts rename to frontend/geo/__tests__/map.spec.ts index 9270f34..2ee59f7 100644 --- a/pyck/geo/frontend/__tests__/map.spec.ts +++ b/frontend/geo/__tests__/map.spec.ts @@ -1,7 +1,6 @@ -import mapboxgl from "mapbox-gl"; -import { createTestFixture } from "~core/util/stimulus-test-utils"; +import { createTestFixture } from "../../core/test-utils"; import MapController from "../controllers/map-controller"; -import { MapConfigController } from "../utils/map-utils"; +import { MapConfigController } from "../"; test("initializes mapbox and binds to canvas", async () => { const fixture = await createTestFixture({ diff --git a/pyck/geo/frontend/controllers/map-controller.ts b/frontend/geo/controllers/map-controller.ts similarity index 96% rename from pyck/geo/frontend/controllers/map-controller.ts rename to frontend/geo/controllers/map-controller.ts index c05e0b7..5b65c5f 100644 --- a/pyck/geo/frontend/controllers/map-controller.ts +++ b/frontend/geo/controllers/map-controller.ts @@ -1,8 +1,8 @@ import "mapbox-gl/dist/mapbox-gl.css"; import { Controller } from "@hotwired/stimulus"; -import mapbox from "mapbox-gl"; -import { getReferencedData } from "~core/util/stimulus-utils"; +import * as mapbox from "mapbox-gl"; +import { getReferencedData } from "../../core/util/stimulus-utils"; /** * @internal diff --git a/pyck/geo/frontend/controllers/map-layer-controller.ts b/frontend/geo/controllers/map-layer-controller.ts similarity index 64% rename from pyck/geo/frontend/controllers/map-layer-controller.ts rename to frontend/geo/controllers/map-layer-controller.ts index 73d60d3..0e3507a 100644 --- a/pyck/geo/frontend/controllers/map-layer-controller.ts +++ b/frontend/geo/controllers/map-layer-controller.ts @@ -1,5 +1,5 @@ -import mapboxgl from "mapbox-gl"; -import { getReferencedData } from "~core/util/stimulus-utils"; +import type { Map, AnyLayer } from "mapbox-gl"; +import { getReferencedData } from "../../core/util/stimulus-utils"; import { MapConfigController } from "../utils/map-utils"; export default class MapLayerController extends MapConfigController { @@ -9,7 +9,7 @@ export default class MapLayerController extends MapConfigController { layerValue!: string; - connectMap(map: mapboxgl.Map) { + connectMap(map: Map) { const layer = this.layer; if (layer && !map.getLayer(layer.id)) { @@ -17,7 +17,7 @@ export default class MapLayerController extends MapConfigController { } } - disconnectMap(map: mapboxgl.Map) { + disconnectMap(map: Map) { const layer = this.layer; if (layer) { @@ -26,6 +26,6 @@ export default class MapLayerController extends MapConfigController { } get layer() { - return getReferencedData(this.layerValue); + return getReferencedData(this.layerValue); } } diff --git a/pyck/geo/frontend/controllers/map-source-controller.ts b/frontend/geo/controllers/map-source-controller.ts similarity index 61% rename from pyck/geo/frontend/controllers/map-source-controller.ts rename to frontend/geo/controllers/map-source-controller.ts index 262579a..7b7b737 100644 --- a/pyck/geo/frontend/controllers/map-source-controller.ts +++ b/frontend/geo/controllers/map-source-controller.ts @@ -1,8 +1,8 @@ -import mapboxgl from "mapbox-gl"; -import { getReferencedData } from "~core/util/stimulus-utils"; +import type { Map, AnySourceData } from "mapbox-gl"; +import { getReferencedData } from "../../core/util/stimulus-utils"; import { MapConfigController } from "../utils/map-utils"; -export default class MapSourceController extends MapConfigController { +export default class MapSourceController extends MapConfigController { static values = { id: String, data: String, @@ -11,7 +11,7 @@ export default class MapSourceController extends MapConfigController(this.dataValue); + return getReferencedData(this.dataValue); } } diff --git a/pyck/geo/frontend/index.ts b/frontend/geo/index.ts similarity index 100% rename from pyck/geo/frontend/index.ts rename to frontend/geo/index.ts diff --git a/frontend/geo/test-utils.ts b/frontend/geo/test-utils.ts new file mode 100644 index 0000000..40ab569 --- /dev/null +++ b/frontend/geo/test-utils.ts @@ -0,0 +1 @@ +export * from "./utils/map-test-utils"; diff --git a/pyck/geo/frontend/utils/map-test-utils.ts b/frontend/geo/utils/map-test-utils.ts similarity index 97% rename from pyck/geo/frontend/utils/map-test-utils.ts rename to frontend/geo/utils/map-test-utils.ts index e17cecf..4cc18e1 100644 --- a/pyck/geo/frontend/utils/map-test-utils.ts +++ b/frontend/geo/utils/map-test-utils.ts @@ -1,7 +1,7 @@ import { createTestFixture, getTestControllerIdentifier, -} from "~core/util/stimulus-test-utils"; +} from "../../core/test-utils"; import MapController from "../controllers/map-controller"; import { MapConfigController } from "./map-utils"; diff --git a/pyck/geo/frontend/utils/map-utils.ts b/frontend/geo/utils/map-utils.ts similarity index 76% rename from pyck/geo/frontend/utils/map-utils.ts rename to frontend/geo/utils/map-utils.ts index a6f8afd..09b25a7 100644 --- a/pyck/geo/frontend/utils/map-utils.ts +++ b/frontend/geo/utils/map-utils.ts @@ -1,6 +1,6 @@ import { Controller } from "@hotwired/stimulus"; -import mapboxgl from "mapbox-gl"; -import { resolveablePromise } from "~core/util/promise-utils"; +import type { Map } from "mapbox-gl"; +import { resolveablePromise } from "../../core/util/promise-utils"; /** * Base class for a map config controller. @@ -9,7 +9,7 @@ import { resolveablePromise } from "~core/util/promise-utils"; * the mapbox instance with controls, data sources, custom layers, etc. */ export class MapConfigController extends Controller { - map?: mapboxgl.Map; + map?: Map; ready = resolveablePromise(); initialize() { @@ -24,8 +24,8 @@ export class MapConfigController extends Controller { } } - connectMap(map: mapboxgl.Map): void | Promise {} - disconnectMap(map: mapboxgl.Map): void | Promise {} + connectMap(map: Map): void | Promise {} + disconnectMap(map: Map): void | Promise {} private handleMapReady = async (event: any) => { const map = event.detail.map; diff --git a/frontend/index.bundled.ts b/frontend/index.bundled.ts new file mode 100644 index 0000000..63770a9 --- /dev/null +++ b/frontend/index.bundled.ts @@ -0,0 +1,4 @@ +import { startApp } from "./core/loader"; + +// Entrypoint for apps where this is included as a simple js include / without their own frontend toolchain. +window.addEventListener("DOMContentLoaded", () => startApp()); diff --git a/frontend/index.lib.ts b/frontend/index.lib.ts new file mode 100644 index 0000000..acfb71b --- /dev/null +++ b/frontend/index.lib.ts @@ -0,0 +1,4 @@ +export * from "./core"; +export * from "./geo"; + +export { startApp as default } from "./core/loader"; diff --git a/frontend/index.test-utils.ts b/frontend/index.test-utils.ts new file mode 100644 index 0000000..a1d52dd --- /dev/null +++ b/frontend/index.test-utils.ts @@ -0,0 +1,2 @@ +export * from "./core/test-utils"; +export * from "./geo/test-utils"; diff --git a/package.json b/package.json index dfb22d0..4b6d1f1 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "devDependencies": { "@hotwired/stimulus": "^3.0.1", "@hotwired/turbo": "^7.0.1", + "@microsoft/api-extractor": "^7.18.20", "@testing-library/dom": "^8.11.1", "@types/jest": "^27.0.3", "@types/mapbox-gl": "^2.4.2", @@ -25,14 +26,15 @@ "superclusterd": "^1.1.1", "ts-jest": "^27.0.7", "typescript": "^4.4.4", - "vite": "^2.6.14", - "vite-tsconfig-paths": "^3.3.17" + "vite": "^2.6.14" }, "peerDependencies": { - "@hotwired/stimulus": "^3.0.1" + "@hotwired/stimulus": "^3.0.1", + "@testing-library/dom": "^8.11.1" }, "files": [ - "build" + "build/production", + "build/test-utils" ], "module": "./build/production/index.js", "exports": { diff --git a/pyck/core/frontend/register.ts b/pyck/core/frontend/register.ts deleted file mode 100644 index 2458e13..0000000 --- a/pyck/core/frontend/register.ts +++ /dev/null @@ -1,7 +0,0 @@ -import startApp from "."; - -/** - * Entrypoint when the running the application without its own frontend built toolchain. - * Normally, the application would be expected to kick this off itself. - */ -startApp(); diff --git a/tsconfig.json b/tsconfig.json index 3e15f4f..bb11e07 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,15 @@ { "compilerOptions": { + "outDir": "./build/ts", "target": "es2019", "lib": ["DOM", "ES2019"], "module": "ES2020", "moduleResolution": "node", + "declaration": true, "baseUrl": "./", "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "strict": true, - "skipLibCheck": true, - "paths": { - "~core/*": ["./pyck/core/frontend/*"], - "~geo/*": ["./pyck/geo/frontend/*"] - } + "skipLibCheck": true } } diff --git a/vite.config.js b/vite.config.js index 8fd9405..cd4811a 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,7 +1,6 @@ import * as path from "path"; import { defineConfig } from "vite"; import legacy from "@vitejs/plugin-legacy"; -import tsconfigPaths from "vite-tsconfig-paths"; import { peerDependencies, devDependencies } from "./package.json"; import { resolve } from "path"; @@ -25,10 +24,15 @@ export default defineConfig(({ mode }) => { const isBundled = mode === "bundled"; const isDev = mode === "dev"; + const isTestUtils = mode === "test-utils"; const isLibrary = !isBundled && !isDev; + + const entrypoint = `frontend/index.${mode}.ts`; const outDir = isBundled ? "pyck/core/static/" : `build/${mode}/`; + console.log({ isBundled, isDev, isLibrary, outDir, entrypoint }); + const alias = !isTestUtils ? [] : TEST_MOCKS.map((moduleName) => ({ @@ -39,10 +43,9 @@ export default defineConfig(({ mode }) => { return { base: "/static/", optimizeDeps: { - entries: ["./pyck/core/frontend/index.ts"], + entries: [entrypoint], }, plugins: compact([ - tsconfigPaths(), isBundled && legacy({ polyfills: false, @@ -53,6 +56,7 @@ export default defineConfig(({ mode }) => { alias, }, build: { + manifest: isBundled, emptyOutDir: true, outDir, rollupOptions: { @@ -62,16 +66,13 @@ export default defineConfig(({ mode }) => { }, input: { - main: `pyck/core/frontend/${getEntrypoint(mode)}`, + main: entrypoint, }, }, lib: !isLibrary ? undefined : { - entry: path.resolve( - __dirname, - `pyck/core/frontend/${getEntrypoint(mode)}` - ), + entry: path.resolve(__dirname, entrypoint), formats: isBundled ? ["cjs"] : ["es"], name: "groundwork", fileName: () => `index.js`, @@ -84,13 +85,6 @@ const TEST_MOCKS = ["mapbox-gl"]; /** Return the entry file for the current build configuration. */ const getEntrypoint = (mode) => { - if (mode === "bundled") { - return "register.ts"; - } - if (mode === "test-utils") { - return "test-utils.ts"; - } - return "index.ts"; }; diff --git a/yarn.lock b/yarn.lock index b0bd40a..effb35d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -314,11 +314,6 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@cush/relative@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@cush/relative/-/relative-1.0.0.tgz#8cd1769bf9bde3bb27dac356b1bc94af40f6cc16" - integrity sha512-RpfLEtTlyIxeNPGKcokS+p3BZII/Q3bYxryFRglh5H3A3T8q9fsLYm72VYAMEOOIBLEa8o93kFLiBDUWKrwXZA== - "@hotwired/stimulus@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.0.1.tgz#141f15645acaa3b133b7c247cad58ae252ffae85" @@ -572,6 +567,81 @@ "@babel/runtime" "^7.12.0" gl-matrix "~3.3.0" +"@microsoft/api-extractor-model@7.13.17": + version "7.13.17" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor-model/-/api-extractor-model-7.13.17.tgz#ea77c206984f62ee1d538ef2164e21c0e70a006e" + integrity sha512-XKP2NsUm2asriB6DshODfSRxYXwSBnA2VA51dVgxJnUE0OnBSZTc2rwzN6mDUJT72JGN081QG99eWA2SutOjIg== + dependencies: + "@microsoft/tsdoc" "0.13.2" + "@microsoft/tsdoc-config" "~0.15.2" + "@rushstack/node-core-library" "3.44.0" + +"@microsoft/api-extractor@^7.18.20": + version "7.18.20" + resolved "https://registry.yarnpkg.com/@microsoft/api-extractor/-/api-extractor-7.18.20.tgz#ab65df94ed5bc6aab53612fc0a6a93cbdeef1610" + integrity sha512-JBstlWs5/MC1IiXSMAwOUnX1hV/IcCl75xF6OUhR2LB7ckZWcsKIbhLecjHC+TZRQsRqVGA3u+DJgB7BIWWYcA== + dependencies: + "@microsoft/api-extractor-model" "7.13.17" + "@microsoft/tsdoc" "0.13.2" + "@microsoft/tsdoc-config" "~0.15.2" + "@rushstack/node-core-library" "3.44.0" + "@rushstack/rig-package" "0.3.5" + "@rushstack/ts-command-line" "4.10.4" + colors "~1.2.1" + lodash "~4.17.15" + resolve "~1.17.0" + semver "~7.3.0" + source-map "~0.6.1" + typescript "~4.4.2" + +"@microsoft/tsdoc-config@~0.15.2": + version "0.15.2" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz#eb353c93f3b62ab74bdc9ab6f4a82bcf80140f14" + integrity sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA== + dependencies: + "@microsoft/tsdoc" "0.13.2" + ajv "~6.12.6" + jju "~1.4.0" + resolve "~1.19.0" + +"@microsoft/tsdoc@0.13.2": + version "0.13.2" + resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz#3b0efb6d3903bd49edb073696f60e90df08efb26" + integrity sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg== + +"@rushstack/node-core-library@3.44.0": + version "3.44.0" + resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.44.0.tgz#481c30a5b5fbaf6eb06f95334b704fe6e1b35b44" + integrity sha512-J+w5efSJjitZoxgtBfU4al0FUx2VIcxpPFUxjIvk7Os2hlGV0VxXLUQWIWdiSL6OGxMSksDlHC9/SHcvBARuvg== + dependencies: + "@types/node" "12.20.24" + colors "~1.2.1" + fs-extra "~7.0.1" + import-lazy "~4.0.0" + jju "~1.4.0" + resolve "~1.17.0" + semver "~7.3.0" + timsort "~0.3.0" + z-schema "~3.18.3" + +"@rushstack/rig-package@0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@rushstack/rig-package/-/rig-package-0.3.5.tgz#7ddab0994647837bab8fdef26f990f1774d82e78" + integrity sha512-CvqWw+E81U5lRBN/lUj7Ngr/XQa/PPb2jAS5QcLP7WL+IMUl+3+Cc2qYrsDoB4zke81kz+usWGmBQpBzGMLmAA== + dependencies: + resolve "~1.17.0" + strip-json-comments "~3.1.1" + +"@rushstack/ts-command-line@4.10.4": + version "4.10.4" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.10.4.tgz#05142b74e5cb207d3dd9b935c82f80d7fcb68042" + integrity sha512-4T5ao4UgDb6LmiRj4GumvG3VT/p6RSMgl7TN7S58ifaAGN2GeTNBajFCDdJs9QQP0d/4tA5p0SFzT7Ps5Byirg== + dependencies: + "@types/argparse" "1.0.38" + argparse "~1.0.9" + colors "~1.2.1" + string-argv "~0.3.1" + "@sinonjs/commons@^1.7.0": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -605,6 +675,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== + "@types/aria-query@^4.2.0": version "4.2.2" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.2.tgz#ed4e0ad92306a704f9fb132a0cfcf77486dbe2bc" @@ -682,11 +757,6 @@ jest-diff "^27.0.0" pretty-format "^27.0.0" -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= - "@types/mapbox-gl@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/mapbox-gl/-/mapbox-gl-2.4.2.tgz#b2d5d6572a49561eef0eb361afd92365027efc50" @@ -699,6 +769,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.9.tgz#879be3ad7af29f4c1a5c433421bf99fab7047185" integrity sha512-MKmdASMf3LtPzwLyRrFjtFFZ48cMf8jmX5VRYrDQiJa8Ybu5VAmkqBWqKU8fdCwD8ysw4mQ9nrEHvzg6gunR7A== +"@types/node@12.20.24": + version "12.20.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" + integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== + "@types/prettier@^2.1.5": version "2.4.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281" @@ -775,6 +850,16 @@ agent-base@6: dependencies: debug "4" +ajv@~6.12.6: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -814,7 +899,7 @@ anymatch@^3.0.3: normalize-path "^3.0.0" picomatch "^2.0.4" -argparse@^1.0.7: +argparse@^1.0.7, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -1075,6 +1160,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@~1.2.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" + integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== + combined-stream@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -1082,6 +1172,11 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +commander@^2.7.1: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -1502,6 +1597,11 @@ express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -1566,6 +1666,15 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= +fs-extra@~7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -1616,11 +1725,6 @@ gl-matrix@~3.3.0: resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.3.0.tgz#232eef60b1c8b30a28cbbe75b2caf6c48fd6358b" integrity sha512-COb7LDz+SXaHtl/h4LeaFcNdJdAQSDeVqjiIihSXNrkWObZLhDI4hIkZC11Aeqp7bcE72clzB0BnDXr2SmslRA== -glob-regex@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/glob-regex/-/glob-regex-0.3.2.tgz#27348f2f60648ec32a4a53137090b9fb934f3425" - integrity sha512-m5blUd3/OqDTWwzBBtWBPrGlAzatRywHameHeekAZyZrskYouOGdNB8T/q6JucucvJXtOuyHIn0/Yia7iDasDw== - glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -1638,12 +1742,7 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - -graceful-fs@^4.2.4: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.4: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -1738,6 +1837,11 @@ ieee754@^1.1.12: resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +import-lazy@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + import-local@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0" @@ -1774,7 +1878,7 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-core-module@^2.2.0: +is-core-module@^2.1.0, is-core-module@^2.2.0: version "2.8.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== @@ -2278,6 +2382,11 @@ jest@^27.3.1: import-local "^3.0.2" jest-cli "^27.3.1" +jju@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" + integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -2329,6 +2438,11 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + json5@2.x, json5@^2.1.2: version "2.2.0" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" @@ -2336,12 +2450,12 @@ json5@2.x, json5@^2.1.2: dependencies: minimist "^1.2.5" -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" kdbush@^3.0.0: version "3.0.0" @@ -2378,12 +2492,22 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.get@^4.0.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash@^4.7.0: +lodash@^4.7.0, lodash@~4.17.15: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2512,7 +2636,7 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: +minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -2773,7 +2897,7 @@ psl@^1.1.33: resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== -punycode@^2.1.1: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -2808,16 +2932,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -recrawl-sync@^2.0.3: - version "2.2.1" - resolved "https://registry.yarnpkg.com/recrawl-sync/-/recrawl-sync-2.2.1.tgz#cb02c8084c22b3cea103abf46bb88734076ed6bb" - integrity sha512-A2yLDgeXNaduJJMlqyUdIN7fewopnNm/mVeeGytS1d2HLXKpS5EthQ0j8tWeX+as9UXiiwQRwfoslKC+/gjqxg== - dependencies: - "@cush/relative" "^1.0.0" - glob-regex "^0.3.0" - slash "^3.0.0" - tslib "^1.9.3" - regenerator-runtime@^0.13.4, regenerator-runtime@^0.13.9: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -2860,6 +2974,21 @@ resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@~1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@~1.19.0: + version "1.19.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" + integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== + dependencies: + is-core-module "^2.1.0" + path-parse "^1.0.6" + rimraf@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -2896,7 +3025,7 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" -semver@7.x, semver@^7.3.2: +semver@7.x, semver@^7.3.2, semver@~7.3.0: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== @@ -3024,6 +3153,11 @@ stimulus-controller-resolver@^2.0.1: resolved "https://registry.yarnpkg.com/stimulus-controller-resolver/-/stimulus-controller-resolver-2.0.1.tgz#9bb4c118ccb168cf98f2f010354f53e133ac3a4b" integrity sha512-1keNHXhr4Zr96ZVzrH6XXl19+uXbCW8+wnGeb7Jk6utCdQR8+AN2Yf7Rgk7AFzaH449Ej9r9HdtzY9425V0l+g== +string-argv@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -3048,11 +3182,6 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -3063,6 +3192,11 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-json-comments@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + supercluster@^7.1.3, supercluster@^7.1.4: version "7.1.4" resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-7.1.4.tgz#6762aabfd985d3390b49f13b815567d5116a828a" @@ -3145,6 +3279,11 @@ throat@^6.0.1: resolved "https://registry.yarnpkg.com/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== +timsort@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" + integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= + tinyqueue@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-2.0.3.tgz#64d8492ebf39e7801d7bd34062e29b45b2035f08" @@ -3202,21 +3341,6 @@ ts-jest@^27.0.7: semver "7.x" yargs-parser "20.x" -tsconfig-paths@^3.9.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz#19769aca6ee8f6a1a341e38c8fa45dd9fb18899b" - integrity sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.0" - strip-bom "^3.0.0" - -tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tslib@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" @@ -3254,12 +3378,12 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" -typescript@^4.4.4: +typescript@^4.4.4, typescript@~4.4.2: version "4.4.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== -universalify@^0.1.2: +universalify@^0.1.0, universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== @@ -3269,6 +3393,13 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -3283,21 +3414,16 @@ v8-to-istanbul@^8.1.0: convert-source-map "^1.6.0" source-map "^0.7.3" +validator@^8.0.0: + version "8.2.0" + resolved "https://registry.yarnpkg.com/validator/-/validator-8.2.0.tgz#3c1237290e37092355344fef78c231249dab77b9" + integrity sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA== + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -vite-tsconfig-paths@^3.3.17: - version "3.3.17" - resolved "https://registry.yarnpkg.com/vite-tsconfig-paths/-/vite-tsconfig-paths-3.3.17.tgz#b1421c4a01e6b446b78cc1dd12d45f302bc3a27b" - integrity sha512-wx+rfC53moVLxMBj2EApJZgY6HtvWUFVZ4dBxNGYBxSSqU6UaHdKlcOxrfGDxyTGtYEr9beWCryHn18C4EtZkg== - dependencies: - debug "^4.1.1" - globrex "^0.1.2" - recrawl-sync "^2.0.3" - tsconfig-paths "^3.9.0" - vite@^2.6.14: version "2.6.14" resolved "https://registry.yarnpkg.com/vite/-/vite-2.6.14.tgz#35c09a15e4df823410819a2a239ab11efb186271" @@ -3449,3 +3575,14 @@ yargs@^16.2.0: string-width "^4.2.0" y18n "^5.0.5" yargs-parser "^20.2.2" + +z-schema@~3.18.3: + version "3.18.4" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.18.4.tgz#ea8132b279533ee60be2485a02f7e3e42541a9a2" + integrity sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw== + dependencies: + lodash.get "^4.0.0" + lodash.isequal "^4.0.0" + validator "^8.0.0" + optionalDependencies: + commander "^2.7.1" From 7b96499174489c2733f3016d6990dd781af4e269 Mon Sep 17 00:00:00 2001 From: Chris Devereux Date: Tue, 7 Dec 2021 09:32:39 +0000 Subject: [PATCH 03/22] adds `groundwork_static` template tag --- .vscode/settings.json | 2 +- Makefile | 2 +- example/templates/base.html | 10 +- frontend/index.bundled.ts | 2 +- package.json | 4 +- pyck/core/internal/asset_loader.py | 398 ++++++++++++++++++++++ pyck/core/templatetags/groundwork_core.py | 19 ++ vite.config.js | 21 +- yarn.lock | 10 + 9 files changed, 452 insertions(+), 16 deletions(-) create mode 100644 pyck/core/internal/asset_loader.py create mode 100644 pyck/core/templatetags/groundwork_core.py diff --git a/.vscode/settings.json b/.vscode/settings.json index f43ccb0..107bba6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "python.pythonPath": "/home/vscode/.cache/pypoetry/virtualenvs/groundwork-SsXfCHgY-py3.9/bin/python", + "python.pythonPath": "/home/vscode/.cache/pypoetry/virtualenvs/groundwork-django-SsXfCHgY-py3.9/bin/python", "python.linting.pylintEnabled": false, "python.linting.mypyEnabled": false, "python.linting.banditEnabled": true, diff --git a/Makefile b/Makefile index 600cf38..fc73034 100644 --- a/Makefile +++ b/Makefile @@ -118,9 +118,9 @@ set-release-version: .PHONY: build-js build-js: + yarn vite build --mode lib yarn vite build --mode bundled yarn vite build --mode test-utils - yarn vite build --mode lib rm -rf build/ts yarn tsc node bin/api-extractor.js diff --git a/example/templates/base.html b/example/templates/base.html index e1283c1..ff0d5d2 100644 --- a/example/templates/base.html +++ b/example/templates/base.html @@ -1,4 +1,4 @@ -{% load static django_vite %} +{% load static django_vite groundwork_core %} @@ -15,7 +15,13 @@ - {% vite_hmr_client %} {% vite_asset 'example/frontend/main.ts' %} + + {% if settings.GROUNDWORK_USE_BUNDLED_ASSETS %} + {% groundwork_static %} + {% else %} + {% vite_hmr_client %} + {% vite_asset 'example/frontend/main.ts' %} + {% endif %} startApp()); +startApp(); diff --git a/package.json b/package.json index 4b6d1f1..37c51a9 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "@types/jest": "^27.0.3", "@types/mapbox-gl": "^2.4.2", "@vitejs/plugin-legacy": "^1.6.2", + "es-module-lexer": "^0.9.3", "events": "^3.3.0", "jest": "^27.3.1", "mapbox-gl": "^2.6.0", @@ -26,7 +27,8 @@ "superclusterd": "^1.1.1", "ts-jest": "^27.0.7", "typescript": "^4.4.4", - "vite": "^2.6.14" + "vite": "^2.6.14", + "vite-plugin-dynamic-publicpath": "^1.1.0" }, "peerDependencies": { "@hotwired/stimulus": "^3.0.1", diff --git a/pyck/core/internal/asset_loader.py b/pyck/core/internal/asset_loader.py new file mode 100644 index 0000000..f98457b --- /dev/null +++ b/pyck/core/internal/asset_loader.py @@ -0,0 +1,398 @@ +""" +Utilities for loading the built assets bundled with the python package. + +Adatpted from django-vite package, modified to accomodate the fact that it's being distributed with a library. +""" + +from typing import Dict, List, Optional + +import json +from os.path import dirname +from os.path import join as path_join +from urllib.parse import urljoin + +from django.conf import settings +from django.utils.safestring import mark_safe + +# If using in development or production mode. +DJANGO_VITE_DEV_MODE = getattr(settings, "GROUNDWORK_VITE_DEV_MODE", False) + +# Default Vite server protocol (http or https) +DJANGO_VITE_DEV_SERVER_PROTOCOL = getattr( + settings, "GROUNDWORK_VITE_DEV_SERVER_PROTOCOL", "http" +) + +# Default vite server hostname. +DJANGO_VITE_DEV_SERVER_HOST = getattr( + settings, "GROUNDWORK_VITE_DEV_SERVER_HOST", "localhost" +) + +# Default Vite server port. +DJANGO_VITE_DEV_SERVER_PORT = getattr( + settings, "GROUNDWORK_VITE_DEV_SERVER_PORT", 3000) + +# Default Vite server path to HMR script. +DJANGO_VITE_WS_CLIENT_URL = getattr( + settings, "GROUNDWORK_VITE_WS_CLIENT_URL", "@vite/client" +) + +GROUNDWORK_CORE_PATH = dirname(dirname(__file__)) +STATIC_URL = urljoin(settings.STATIC_URL, "groundwork/") + +# Location of Vite compiled assets (only used in Vite production mode). +# Must be included in your "STATICFILES_DIRS". +# In Django production mode this folder need to be collected as static +# files using "python manage.py collectstatic". +if settings.DEBUG: + DJANGO_VITE_ASSETS_PATH = path_join( + GROUNDWORK_CORE_PATH, "static", "groundwork") +else: + DJANGO_VITE_ASSETS_PATH = path_join(settings.STATIC_ROOT, "groundwork") + +# Path to your manifest file generated by Vite. +# Should by in "GROUNDWORK_VITE_ASSETS_PATH". +DJANGO_VITE_MANIFEST_PATH = getattr( + settings, + "GROUNDWORK_VITE_MANIFEST_PATH", + path_join( + DJANGO_VITE_ASSETS_PATH if settings.DEBUG else settings.STATIC_ROOT, + "manifest.json", + ), +) + +# Motif in the 'manifest.json' to find the polyfills generated by Vite. +DJANGO_VITE_LEGACY_POLYFILLS_MOTIF = getattr( + settings, "GROUNDWORK_VITE_LEGACY_POLYFILLS_MOTIF", "legacy-polyfills" +) + + +class GroundworkAssetLoader: + """ + Class handling Vite asset loading. + """ + + _instance = None + + def __init__(self) -> None: + raise RuntimeError("Use the instance() method instead.") + + def generate_vite_asset( + self, + path: str, + scripts_attrs: Optional[Dict[str, str]] = None, + ) -> str: + """ + Generates a " + + def _generate_css_files_of_asset( + self, path: str, already_processed: List[str] + ) -> List[str]: + """ + Generates all CSS tags for dependencies of an asset. + + Arguments: + path {str} -- Path to an asset in the 'manifest.json'. + already_processed {list} -- List of already processed CSS file. + + Returns: + list -- List of CSS tags. + """ + + tags = [] + manifest_entry = self._manifest[path] + + if "imports" in manifest_entry: + for import_path in manifest_entry["imports"]: + tags.extend( + self._generate_css_files_of_asset( + import_path, already_processed) + ) + + if "css" in manifest_entry: + for css_path in manifest_entry["css"]: + if css_path not in already_processed: + tags.append( + GroundworkAssetLoader._generate_stylesheet_tag( + css_path) + ) + + already_processed.append(css_path) + + return tags + + def generate_vite_asset_url(self, path: str) -> str: + """ + Generates only the URL of an asset managed by ViteJS. + Warning, this function does not generate URLs for dependant assets. + + Arguments: + path {str} -- Path to a Vite asset. + + Raises: + RuntimeError: If cannot find the asset path in the manifest (only in production). + + Returns: + str -- The URL of this asset. + """ + + if DJANGO_VITE_DEV_MODE: + return GroundworkAssetLoader._generate_vite_server_url(path) + + if path not in self._manifest: + raise RuntimeError( + f"Cannot find {path} in Vite manifest " + f"at {DJANGO_VITE_MANIFEST_PATH}" + ) + + return self._manifest[path]["file"] + + def generate_vite_legacy_polyfills( + self, + scripts_attrs: Optional[Dict[str, str]] = None, + ) -> str: + """ + Generates a ' + + @staticmethod + def _generate_stylesheet_tag(href: str) -> str: + """ + Generates and HTML stylesheet tag for CSS. + + Arguments: + href {str} -- CSS file URL. + + Returns: + str -- CSS link tag. + """ + + return f'' + + @staticmethod + def _generate_vite_server_url(path: Optional[str] = None) -> str: + """ + Generates an URL to and asset served by the Vite development server. + + Keyword Arguments: + path {Optional[str]} -- Path to the asset. (default: {None}) + + Returns: + str -- Full URL to the asset. + """ + + return urljoin( + f"{DJANGO_VITE_DEV_SERVER_PROTOCOL}://" + f"{DJANGO_VITE_DEV_SERVER_HOST}:{DJANGO_VITE_DEV_SERVER_PORT}", + urljoin(settings.STATIC_URL, path if path is not None else ""), + ) diff --git a/pyck/core/templatetags/groundwork_core.py b/pyck/core/templatetags/groundwork_core.py new file mode 100644 index 0000000..529e72e --- /dev/null +++ b/pyck/core/templatetags/groundwork_core.py @@ -0,0 +1,19 @@ +from django.template import Library +from django.utils.safestring import mark_safe + +from groundwork.core.internal.asset_loader import GroundworkAssetLoader + +register = Library() + + +@register.simple_tag +@mark_safe +def groundwork_static(): + loader = GroundworkAssetLoader.instance() + return "".join( + [ + loader.generate_dynamic_handlers(), + loader.generate_vite_asset("frontend/index.bundled.ts"), + loader.generate_vite_legacy_asset("frontend/index.bundled-legacy.ts"), + ] + ) diff --git a/vite.config.js b/vite.config.js index cd4811a..0a72951 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,8 +1,9 @@ import * as path from "path"; import { defineConfig } from "vite"; import legacy from "@vitejs/plugin-legacy"; +import { useDynamicPublicPath } from "vite-plugin-dynamic-publicpath"; -import { peerDependencies, devDependencies } from "./package.json"; +import { peerDependencies } from "./package.json"; import { resolve } from "path"; export default defineConfig(({ mode }) => { @@ -29,9 +30,7 @@ export default defineConfig(({ mode }) => { const isLibrary = !isBundled && !isDev; const entrypoint = `frontend/index.${mode}.ts`; - const outDir = isBundled ? "pyck/core/static/" : `build/${mode}/`; - - console.log({ isBundled, isDev, isLibrary, outDir, entrypoint }); + const outDir = isBundled ? "pyck/core/static/groundwork/" : `build/${mode}/`; const alias = !isTestUtils ? [] @@ -41,7 +40,8 @@ export default defineConfig(({ mode }) => { })); return { - base: "/static/", + // In bundled mode, we use the dynamicPublicPath plugin instead of a hardcoded asset path + base: isBundled ? "" : "/static/", optimizeDeps: { entries: [entrypoint], }, @@ -51,6 +51,12 @@ export default defineConfig(({ mode }) => { polyfills: false, targets: ["defaults", "not IE 11"], }), + isBundled && + // In bundled mode, we need to inject STATIC_URL into templates and pick it up with these + useDynamicPublicPath({ + dynamicImportHandler: "window.__groundwork_dynamic_handler__", + dynamicImportPreload: "window.__groundwork_dynamic_preload__", + }), ]), resolve: { alias, @@ -83,9 +89,4 @@ export default defineConfig(({ mode }) => { const TEST_MOCKS = ["mapbox-gl"]; -/** Return the entry file for the current build configuration. */ -const getEntrypoint = (mode) => { - return "index.ts"; -}; - const compact = (array) => array.filter((item) => !!item); diff --git a/yarn.lock b/yarn.lock index effb35d..bdb092f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1364,6 +1364,11 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +es-module-lexer@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" + integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== + esbuild-android-arm64@0.13.14: version "0.13.14" resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.13.14.tgz#c85083ece26be3d67e6c720e088968a98409e023" @@ -3424,6 +3429,11 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +vite-plugin-dynamic-publicpath@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/vite-plugin-dynamic-publicpath/-/vite-plugin-dynamic-publicpath-1.1.0.tgz#68473a46a64e36db03be871068a247de746e1f02" + integrity sha512-MSWpaESnISjVpykKWiq4qwf/dIwZhr22c1rcwMYBFrVgXVHLj8nLVodWb/tpanfdQWjSy6kYeCyQSKPjsnIyIg== + vite@^2.6.14: version "2.6.14" resolved "https://registry.yarnpkg.com/vite/-/vite-2.6.14.tgz#35c09a15e4df823410819a2a239ab11efb186271" From cc56153e9a1e5334de140956236e9f329e7d18e9 Mon Sep 17 00:00:00 2001 From: Chris Devereux Date: Tue, 7 Dec 2021 09:59:23 +0000 Subject: [PATCH 04/22] mass rename pyck -> groundwork --- .gitignore | 2 +- Makefile | 14 ++-- README.md | 2 +- bin/gendocs.py | 2 +- docs/contributing.md | 4 +- docs/guides/data-pipeline.md | 28 ++++---- docs/templates/text.mako | 4 +- example/templates/base.html | 2 +- example/uk/models.py | 4 +- example/urls.py | 2 +- frontend/geo/controllers/map-controller.ts | 2 +- {pyck => groundwork}/core/cache.py | 2 +- {pyck => groundwork}/core/cron.py | 0 {pyck => groundwork}/core/datasources.py | 4 +- .../core/internal/asset_loader.py | 67 ++++++++----------- .../core/internal/class_util.py | 0 .../core/internal/collection_util.py | 0 .../core/internal/sync_manager.py | 4 +- .../management/commands/run_cron_tasks.py | 2 +- {pyck => groundwork}/core/template.py | 2 +- .../core/templatetags/groundwork_core.py | 0 {pyck => groundwork}/core/types.py | 0 .../geo/docs/map.components.md | 0 {pyck => groundwork}/geo/examples.py | 2 +- .../groundwork}/geo/components/map.html | 0 .../geo/components/map_config.html | 0 .../groundwork}/geo/examples/map_example.html | 0 .../geo/templatetags/ckgeo_tags.py | 8 +-- .../territories/uk/internal/serializers.py | 0 .../geo/territories/uk/ons.py | 2 +- .../geo/territories/uk/parliament.py | 8 +-- .../geo/territories/uk/postcodes.py | 2 +- jest.config.js | 8 +-- mkdocs.yaml | 12 ++-- pyproject.toml | 3 + settings.py | 4 +- test/core/test_cache.py | 2 +- test/core/test_synced_model.py | 2 +- test/geo/test_parliament_api.py | 2 +- test/geo/test_postcodes_api.py | 2 +- vite.config.js | 4 +- 41 files changed, 100 insertions(+), 108 deletions(-) rename {pyck => groundwork}/core/cache.py (97%) rename {pyck => groundwork}/core/cron.py (100%) rename {pyck => groundwork}/core/datasources.py (99%) rename {pyck => groundwork}/core/internal/asset_loader.py (85%) rename {pyck => groundwork}/core/internal/class_util.py (100%) rename {pyck => groundwork}/core/internal/collection_util.py (100%) rename {pyck => groundwork}/core/internal/sync_manager.py (99%) rename {pyck => groundwork}/core/management/commands/run_cron_tasks.py (91%) rename {pyck => groundwork}/core/template.py (98%) rename {pyck => groundwork}/core/templatetags/groundwork_core.py (100%) rename {pyck => groundwork}/core/types.py (100%) rename {pyck => groundwork}/geo/docs/map.components.md (100%) rename {pyck => groundwork}/geo/examples.py (92%) rename {pyck/geo/templates/pyck => groundwork/geo/templates/groundwork}/geo/components/map.html (100%) rename {pyck/geo/templates/pyck => groundwork/geo/templates/groundwork}/geo/components/map_config.html (100%) rename {pyck/geo/templates/pyck => groundwork/geo/templates/groundwork}/geo/examples/map_example.html (100%) rename {pyck => groundwork}/geo/templatetags/ckgeo_tags.py (85%) rename {pyck => groundwork}/geo/territories/uk/internal/serializers.py (100%) rename {pyck => groundwork}/geo/territories/uk/ons.py (96%) rename {pyck => groundwork}/geo/territories/uk/parliament.py (95%) rename {pyck => groundwork}/geo/territories/uk/postcodes.py (97%) diff --git a/.gitignore b/.gitignore index 8f43fc4..4f7ae74 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ __pycache__/ # Distribution / packaging .Python -pyck/core/static/ +groundwork/core/static/ build/ develop-eggs/ dist/ diff --git a/Makefile b/Makefile index fc73034..8ea3781 100644 --- a/Makefile +++ b/Makefile @@ -59,7 +59,7 @@ python-api-docs: component-docs: rm -rf docs/components mkdir -p docs/components - cp pyck/**/docs/*.components.md docs/components/ + cp groundwork/**/docs/*.components.md docs/components/ .PHONY: api-docs api-docs: python-api-docs component-docs @@ -88,7 +88,7 @@ test: check-codestyle: poetry run isort --diff --check-only --settings-path pyproject.toml ./ poetry run black --diff --check --config pyproject.toml ./ - poetry run darglint --docstring-style google --verbosity 2 pyck + poetry run darglint --docstring-style google --verbosity 2 groundwork yarn tsc --noemit yarn prettier --check . @@ -96,13 +96,13 @@ check-codestyle: check-safety: poetry check poetry run safety check --full-report - poetry run bandit -ll --recursive pyck tests + poetry run bandit -ll --recursive groundwork tests .PHONY: lint lint: check-codestyle check-safety test .PHONY: ci -ci: lint +ci: lint build-docs build-js build-python poetry run pytest yarn test @@ -126,8 +126,8 @@ build-js: node bin/api-extractor.js .PHONY: build-python -build-python: set-release-version build-js - echo poetry build +build-python: build-js + poetry build .PHONY: release release: clean-all set-release-version build-js build-python @@ -144,7 +144,7 @@ pycache-remove: .PHONY: build-remove build-remove: - rm -rf build/ pyck/core/static/ docs/api/ docs/components/ temp/ + rm -rf build/ groundwork/core/static/ docs/api/ docs/components/ temp/ .PHONY: clean-all clean-all: pycache-remove build-remove diff --git a/README.md b/README.md index b103c34..e60e778 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Pycommonknowledge +# Groundwork An integrated Django and Javascript framework for people who build tools for organisers. diff --git a/bin/gendocs.py b/bin/gendocs.py index 5999c57..39eb5bc 100755 --- a/bin/gendocs.py +++ b/bin/gendocs.py @@ -27,7 +27,7 @@ django.setup() -modules = [app for app in settings.INSTALLED_APPS if app.startswith("pyck.")] +modules = [app for app in settings.INSTALLED_APPS if app.startswith("groundwork.")] context = pdoc.Context() modules = [pdoc.Module(mod, context=context) for mod in modules] diff --git a/docs/contributing.md b/docs/contributing.md index fd00eed..993a5aa 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -6,8 +6,8 @@ We don't want to have an excessively prescriptive sense of what is 'in' and 'out ## New features and functionality -1. The first stage of adding a new module happens within an application that uses it. Use the convention of placing it in the `commonknowledge.experimental` package within your application repository to indicate to other people that it's in the process of being abstracted and that they should be mindful of these guidelines. -2. Remove any dependencies from application code outside the `commonknowledge` package. Start to think about how it can be tested in isolation (if it isn't already). +1. The first stage of adding a new module happens within an application that uses it. Use the convention of placing it in the `groundwork.experimental` package within your application repository to indicate to other people that it's in the process of being abstracted and that they should be mindful of these guidelines. +2. Remove any dependencies from application code outside the `groundwork` package. Start to think about how it can be tested in isolation (if it isn't already). 3. Open a feature request against this repository. Describe the new feature, include links to your implementation other repositories. If the application is publicly accessible, include links to it in the live app. 4. Discuss and refine the API with other contributors. 5. When the feature request is accepted, fork this repository (or create a feature branch if you have write access) and commit the feature implementation. Ensure that you have good test coverage of both Python and Javascript components and all public API methods are documented. diff --git a/docs/guides/data-pipeline.md b/docs/guides/data-pipeline.md index c04bc53..fbc2fcf 100644 --- a/docs/guides/data-pipeline.md +++ b/docs/guides/data-pipeline.md @@ -26,7 +26,7 @@ A datasource is a simple interface that defines: - A type that returned objects should be assumed to be instances of. - A field on that type that provides the object's ID. -You can check out the documentation for the [Datasource](../../api/pyck.core.datasources/#externalresource) class +You can check out the documentation for the [Datasource](../../api/groundwork.core.datasources/#externalresource) class for more detail on this. For now, we'll look at one thing we can do with them – regularly synchronising data from a remote service. @@ -46,20 +46,20 @@ We'll configure it to update periodically so that changes to UK constituencies a ### Create your model -First, we'll create our model. To make this easier, we'll make the field names in our model match the field names in the datasource. The datasources provided with Groundwork are all documented and have type hints on the objects they return. The UK Parliament datasource is documented [here](../../api/pyck.geo.territories.uk.parliament/). +First, we'll create our model. To make this easier, we'll make the field names in our model match the field names in the datasource. The datasources provided with Groundwork are all documented and have type hints on the objects they return. The UK Parliament datasource is documented [here](../../api/groundwork.geo.territories.uk.parliament/). Some things to note: -- We're subclassing [SyncedModel](../../api/pyck.core.datasources/#syncedmodel). This is needed to register the model with the sync manager. -- We configure where to fetch the data from, how often, and how to map it onto our local model using [SyncConfig](../../api/pyck.core.datasources/#syncconfig). +- We're subclassing [SyncedModel](../../api/groundwork.core.datasources/#syncedmodel). This is needed to register the model with the sync manager. +- We configure where to fetch the data from, how often, and how to map it onto our local model using [SyncConfig](../../api/groundwork.core.datasources/#syncconfig). - We need to store the id used by the remote data source. By default, this is called `external_id`, but you can customize this. - We need to add the fields we want to save data from in our model. It's absolutely fine to leave out fields that you don't want to save. ```python title="app/models.py" from django.db import models -from pyck.core.datasources import SyncedModel, SyncConfig -from pyck.geo.territories.uk import parliament +from groundwork.core.datasources import SyncedModel, SyncConfig +from groundwork.geo.territories.uk import parliament class Constituency(SyncedModel): # This is where we specify the datasource, along with other options @@ -134,8 +134,8 @@ Let's expand our example to include data about the current MP for the constituen ```python title="app/models.py" from django.db import models -from pyck.core.datasources import SyncedModel, SyncConfig -from pyck.geo.territories.uk import parliament +from groundwork.core.datasources import SyncedModel, SyncConfig +from groundwork.geo.territories.uk import parliament class Constituency(SyncedModel): # This is where we specify the datasource, along with other options @@ -205,8 +205,8 @@ other services specific to your organisation. ## Provided datasources -- [UK Parliament Members & Constituencies](../../api/pyck.geo.territories.uk.parliament/) -- [UK Postcode Geocoding](../../api/pyck.geo.territories.uk.postcodes/) +- [UK Parliament Members & Constituencies](../../api/groundwork.geo.territories.uk.parliament/) +- [UK Postcode Geocoding](../../api/groundwork.geo.territories.uk.postcodes/) Forthcoming: @@ -223,7 +223,7 @@ Forthcoming: Many services provide their own Python client library. If the one you're building a datasource for does, it's better to simply adapt it in the Datasource interface than reinvent the wheel. -To do this, extend [Datasource](../../api/pyck.core.datasources/#externalresource). You need to implement `get()` +To do this, extend [Datasource](../../api/groundwork.core.datasources/#externalresource). You need to implement `get()` which should get a resource by id and `list()`, which should list resources, optionally filtering them. Let's do that for a client library for an imaginary service classed _ZapMessage_. @@ -236,7 +236,7 @@ from typing import TypeVar, Iterable, Any import zapmessage from django.conf import settings -from pyck.core.datasources import Datasource +from groundwork.core.datasources import Datasource # We're using type hints in this example, but feel free to ignore them if # they're unfamiliar. @@ -306,7 +306,7 @@ from datetime import datetime from typing import TypeVar, Iterable, Any, Dict from django.conf import settings -from pyck.core.datasources import RestDatasource +from groundwork.core.datasources import RestDatasource @dataclass class Message: @@ -382,4 +382,4 @@ class ZapMessageResource(RestDatasource[ResourceT]): ``` You can see the full set of options and override points in -[RestClient](../../api/pyck.core.datasources/#restclient)'s API documentation. +[RestClient](../../api/groundwork.core.datasources/#restclient)'s API documentation. diff --git a/docs/templates/text.mako b/docs/templates/text.mako index 1c110c4..b27de3a 100644 --- a/docs/templates/text.mako +++ b/docs/templates/text.mako @@ -45,7 +45,7 @@ ${to_markdown_fixed(s, module=m)} s, _ = re.subn( - r'pyck\.[^ \[\]]+', + r'groundwork\.[^ \[\]]+', make_link, s, ) @@ -58,7 +58,7 @@ ${to_markdown_fixed(s, module=m)} return [ ref for ref in refs - if ref.refname.startswith('pyck.') + if ref.refname.startswith('groundwork.') and not ref.refname.split('.')[-1].startswith('_') ] %> diff --git a/example/templates/base.html b/example/templates/base.html index ff0d5d2..bce9540 100644 --- a/example/templates/base.html +++ b/example/templates/base.html @@ -1,7 +1,7 @@ {% load static django_vite groundwork_core %} - + diff --git a/example/uk/models.py b/example/uk/models.py index d5e8a30..8affa6c 100644 --- a/example/uk/models.py +++ b/example/uk/models.py @@ -1,7 +1,7 @@ from django.db import models -from pyck.core.datasources import SyncConfig, SyncedModel -from pyck.geo.territories.uk import parliament +from groundwork.core.datasources import SyncConfig, SyncedModel +from groundwork.geo.territories.uk import parliament class Constituency(SyncedModel): diff --git a/example/urls.py b/example/urls.py index 67aed01..d950fa3 100644 --- a/example/urls.py +++ b/example/urls.py @@ -3,6 +3,6 @@ from django.urls import include, path urlpatterns: List[Any] = [ - path("geo/", include("pyck.geo.examples")), + path("geo/", include("groundwork.geo.examples")), path("uk/", include("example.uk.urls")), ] diff --git a/frontend/geo/controllers/map-controller.ts b/frontend/geo/controllers/map-controller.ts index 5b65c5f..a35b54b 100644 --- a/frontend/geo/controllers/map-controller.ts +++ b/frontend/geo/controllers/map-controller.ts @@ -1,7 +1,7 @@ import "mapbox-gl/dist/mapbox-gl.css"; import { Controller } from "@hotwired/stimulus"; -import * as mapbox from "mapbox-gl"; +import mapbox from "mapbox-gl"; import { getReferencedData } from "../../core/util/stimulus-utils"; /** diff --git a/pyck/core/cache.py b/groundwork/core/cache.py similarity index 97% rename from pyck/core/cache.py rename to groundwork/core/cache.py index d26bece..5b81728 100644 --- a/pyck/core/cache.py +++ b/groundwork/core/cache.py @@ -3,7 +3,7 @@ from django.core.cache import cache from django.db.models import QuerySet -from pyck.core.types import Decorator +from groundwork.core.types import Decorator def django_cached(prefix: str, get_key: Any = None, ttl: int = 500) -> Decorator: diff --git a/pyck/core/cron.py b/groundwork/core/cron.py similarity index 100% rename from pyck/core/cron.py rename to groundwork/core/cron.py diff --git a/pyck/core/datasources.py b/groundwork/core/datasources.py similarity index 99% rename from pyck/core/datasources.py rename to groundwork/core/datasources.py index 8a6c239..e8e7b6a 100644 --- a/pyck/core/datasources.py +++ b/groundwork/core/datasources.py @@ -22,7 +22,7 @@ from rest_framework import parsers, serializers from rest_framework_dataclasses.serializers import DataclassSerializer -from pyck.core.cron import register_cron +from groundwork.core.cron import register_cron ResourceT = TypeVar("ResourceT") @@ -359,6 +359,6 @@ def sync(cls): """ Synchronizes the class immediately. """ - from pyck.core.internal.sync_manager import SyncManager + from groundwork.core.internal.sync_manager import SyncManager SyncManager().sync_model(cls) diff --git a/pyck/core/internal/asset_loader.py b/groundwork/core/internal/asset_loader.py similarity index 85% rename from pyck/core/internal/asset_loader.py rename to groundwork/core/internal/asset_loader.py index f98457b..75f937d 100644 --- a/pyck/core/internal/asset_loader.py +++ b/groundwork/core/internal/asset_loader.py @@ -55,7 +55,7 @@ settings, "GROUNDWORK_VITE_MANIFEST_PATH", path_join( - DJANGO_VITE_ASSETS_PATH if settings.DEBUG else settings.STATIC_ROOT, + DJANGO_VITE_ASSETS_PATH, "manifest.json", ), ) @@ -86,20 +86,15 @@ def generate_vite_asset( all of its CSS dependencies by reading the manifest file (for production only). In development Vite loads all by itself. - Arguments: - path {str} -- Path to a Vite JS/TS asset to include. - - Returns: - str -- All tags to import this file in your HTML page. - - Keyword Arguments: - scripts_attrs {Optional[Dict[str, str]]} -- Override attributes added to the script tag. (default: {None}) + Args: + path: Path to a Vite JS/TS asset to include. + scripts_attrs: Override attributes added to the script tag. (default: {None}) Raises: RuntimeError: If cannot find the file path in the manifest (only in production). Returns: - str -- The